@statsig/angular-bindings 3.6.1 → 3.6.2-beta.2
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/checkGate.directive.d.ts +21 -0
- package/checkGate.directive.d.ts.map +1 -0
- package/esm2022/checkGate.directive.mjs +73 -0
- package/esm2022/index.mjs +11 -0
- package/esm2022/memoizeDecorator.mjs +21 -0
- package/esm2022/statsig-angular-bindings.mjs +21 -0
- package/esm2022/statsig.module.mjs +22 -0
- package/esm2022/statsig.service.mjs +163 -0
- package/fesm2022/statsig-angular-bindings.mjs +21 -0
- package/fesm2022/statsig-angular-bindings.mjs.map +1 -0
- package/{src/index.ts → index.d.ts} +1 -0
- package/index.d.ts.map +1 -0
- package/memoizeDecorator.d.ts +2 -0
- package/memoizeDecorator.d.ts.map +1 -0
- package/package.json +19 -4
- package/statsig-angular-bindings.d.ts.map +1 -0
- package/statsig.module.d.ts +22 -0
- package/statsig.module.d.ts.map +1 -0
- package/statsig.service.d.ts +31 -0
- package/statsig.service.d.ts.map +1 -0
- package/.eslintrc.json +0 -48
- package/jest.config.ts +0 -22
- package/ng-package.json +0 -8
- package/project.json +0 -28
- package/src/checkGate.directive.ts +0 -72
- package/src/memoizeDecorator.ts +0 -26
- package/src/statsig.module.ts +0 -34
- package/src/statsig.service.ts +0 -210
- package/src/test-setup.ts +0 -9
- package/tsconfig.json +0 -24
- package/tsconfig.lib.json +0 -16
- package/tsconfig.spec.json +0 -16
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { OnInit, TemplateRef, ViewContainerRef } from '@angular/core';
|
|
2
|
+
import { FeatureGateOptions } from './statsig.module';
|
|
3
|
+
import { StatsigService } from './statsig.service';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
export declare class CheckGateDirective implements OnInit {
|
|
6
|
+
private _templateRef;
|
|
7
|
+
private _viewContainer;
|
|
8
|
+
private _statsigService;
|
|
9
|
+
private _gate;
|
|
10
|
+
private _isHidden;
|
|
11
|
+
private _options;
|
|
12
|
+
set stgCheckGate(val: string);
|
|
13
|
+
set stgCheckGateOptions(val: FeatureGateOptions);
|
|
14
|
+
constructor(_templateRef: TemplateRef<unknown>, _viewContainer: ViewContainerRef, _statsigService: StatsigService);
|
|
15
|
+
ngOnInit(): void;
|
|
16
|
+
private _updateView;
|
|
17
|
+
private _checkGate;
|
|
18
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<CheckGateDirective, never>;
|
|
19
|
+
static ɵdir: i0.ɵɵDirectiveDeclaration<CheckGateDirective, "[stgCheckGate]", never, { "stgCheckGate": { "alias": "stgCheckGate"; "required": false; }; "stgCheckGateOptions": { "alias": "stgCheckGateOptions"; "required": false; }; }, {}, never, never, false, never>;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=checkGate.directive.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"checkGate.directive.d.ts","sourceRoot":"","sources":["../../../packages/angular-bindings/src/checkGate.directive.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,MAAM,EACN,WAAW,EACX,gBAAgB,EACjB,MAAM,eAAe,CAAC;AAIvB,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;;AAEnD,qBAGa,kBAAmB,YAAW,MAAM;IAsB7C,OAAO,CAAC,YAAY;IACpB,OAAO,CAAC,cAAc;IACtB,OAAO,CAAC,eAAe;IAvBzB,OAAO,CAAC,KAAK,CAAM;IACnB,OAAO,CAAC,SAAS,CAAQ;IACzB,OAAO,CAAC,QAAQ,CAA0B;IAE1C,IAAa,YAAY,CAAC,GAAG,EAAE,MAAM,EAMpC;IAED,IAAa,mBAAmB,CAAC,GAAG,EAAE,kBAAkB,EAMvD;gBAGS,YAAY,EAAE,WAAW,CAAC,OAAO,CAAC,EAClC,cAAc,EAAE,gBAAgB,EAChC,eAAe,EAAE,cAAc;IAOzC,QAAQ,IAAI,IAAI;IAMhB,OAAO,CAAC,WAAW;IAanB,OAAO,CAAC,UAAU;yCAlDP,kBAAkB;2CAAlB,kBAAkB;CAuD9B"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CheckGateDirective = void 0;
|
|
4
|
+
const core_1 = require("@angular/core");
|
|
5
|
+
const client_core_1 = require("@statsig/client-core");
|
|
6
|
+
const statsig_service_1 = require("./statsig.service");
|
|
7
|
+
const i0 = require("@angular/core");
|
|
8
|
+
const i1 = require("./statsig.service");
|
|
9
|
+
class CheckGateDirective {
|
|
10
|
+
_templateRef;
|
|
11
|
+
_viewContainer;
|
|
12
|
+
_statsigService;
|
|
13
|
+
_gate = '';
|
|
14
|
+
_isHidden = true;
|
|
15
|
+
_options = {};
|
|
16
|
+
set stgCheckGate(val) {
|
|
17
|
+
client_core_1.Log.debug('Setting gate', val);
|
|
18
|
+
if (val) {
|
|
19
|
+
this._gate = val;
|
|
20
|
+
this._updateView();
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
set stgCheckGateOptions(val) {
|
|
24
|
+
client_core_1.Log.debug('Setting options', val);
|
|
25
|
+
if (val) {
|
|
26
|
+
this._options = val;
|
|
27
|
+
this._updateView();
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
constructor(_templateRef, _viewContainer, _statsigService) {
|
|
31
|
+
this._templateRef = _templateRef;
|
|
32
|
+
this._viewContainer = _viewContainer;
|
|
33
|
+
this._statsigService = _statsigService;
|
|
34
|
+
_statsigService.getClient().$on('values_updated', () => {
|
|
35
|
+
this._updateView();
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
ngOnInit() {
|
|
39
|
+
if (this._gate) {
|
|
40
|
+
this._updateView();
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
_updateView() {
|
|
44
|
+
if (this._checkGate()) {
|
|
45
|
+
if (this._isHidden) {
|
|
46
|
+
client_core_1.Log.debug('Feature flag is enabled, showing the template');
|
|
47
|
+
this._viewContainer.createEmbeddedView(this._templateRef);
|
|
48
|
+
this._isHidden = false;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
this._viewContainer.clear();
|
|
53
|
+
this._isHidden = true;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
_checkGate() {
|
|
57
|
+
return (this._gate && this._statsigService.checkGate(this._gate, this._options));
|
|
58
|
+
}
|
|
59
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: CheckGateDirective, deps: [{ token: i0.TemplateRef }, { token: i0.ViewContainerRef }, { token: i1.StatsigService }], target: i0.ɵɵFactoryTarget.Directive });
|
|
60
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.1.3", type: CheckGateDirective, selector: "[stgCheckGate]", inputs: { stgCheckGate: "stgCheckGate", stgCheckGateOptions: "stgCheckGateOptions" }, ngImport: i0 });
|
|
61
|
+
}
|
|
62
|
+
exports.CheckGateDirective = CheckGateDirective;
|
|
63
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: CheckGateDirective, decorators: [{
|
|
64
|
+
type: core_1.Directive,
|
|
65
|
+
args: [{
|
|
66
|
+
selector: '[stgCheckGate]',
|
|
67
|
+
}]
|
|
68
|
+
}], ctorParameters: () => [{ type: i0.TemplateRef }, { type: i0.ViewContainerRef }, { type: i1.StatsigService }], propDecorators: { stgCheckGate: [{
|
|
69
|
+
type: core_1.Input
|
|
70
|
+
}], stgCheckGateOptions: [{
|
|
71
|
+
type: core_1.Input
|
|
72
|
+
}] } });
|
|
73
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hlY2tHYXRlLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL2FuZ3VsYXItYmluZGluZ3Mvc3JjL2NoZWNrR2F0ZS5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsd0NBTXVCO0FBRXZCLHNEQUEyQztBQUczQyx1REFBbUQ7OztBQUVuRCxNQUdhLGtCQUFrQjtJQXNCbkI7SUFDQTtJQUNBO0lBdkJGLEtBQUssR0FBRyxFQUFFLENBQUM7SUFDWCxTQUFTLEdBQUcsSUFBSSxDQUFDO0lBQ2pCLFFBQVEsR0FBdUIsRUFBRSxDQUFDO0lBRTFDLElBQWEsWUFBWSxDQUFDLEdBQVc7UUFDbkMsaUJBQUcsQ0FBQyxLQUFLLENBQUMsY0FBYyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQy9CLElBQUksR0FBRyxFQUFFLENBQUM7WUFDUixJQUFJLENBQUMsS0FBSyxHQUFHLEdBQUcsQ0FBQztZQUNqQixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDckIsQ0FBQztJQUNILENBQUM7SUFFRCxJQUFhLG1CQUFtQixDQUFDLEdBQXVCO1FBQ3RELGlCQUFHLENBQUMsS0FBSyxDQUFDLGlCQUFpQixFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ2xDLElBQUksR0FBRyxFQUFFLENBQUM7WUFDUixJQUFJLENBQUMsUUFBUSxHQUFHLEdBQUcsQ0FBQztZQUNwQixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDckIsQ0FBQztJQUNILENBQUM7SUFFRCxZQUNVLFlBQWtDLEVBQ2xDLGNBQWdDLEVBQ2hDLGVBQStCO1FBRi9CLGlCQUFZLEdBQVosWUFBWSxDQUFzQjtRQUNsQyxtQkFBYyxHQUFkLGNBQWMsQ0FBa0I7UUFDaEMsb0JBQWUsR0FBZixlQUFlLENBQWdCO1FBRXZDLGVBQWUsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLEVBQUUsR0FBRyxFQUFFO1lBQ3JELElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNyQixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxRQUFRO1FBQ04sSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDZixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDckIsQ0FBQztJQUNILENBQUM7SUFFTyxXQUFXO1FBQ2pCLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUM7WUFDdEIsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7Z0JBQ25CLGlCQUFHLENBQUMsS0FBSyxDQUFDLCtDQUErQyxDQUFDLENBQUM7Z0JBQzNELElBQUksQ0FBQyxjQUFjLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO2dCQUMxRCxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztZQUN6QixDQUFDO1FBQ0gsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQzVCLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO1FBQ3hCLENBQUM7SUFDSCxDQUFDO0lBRU8sVUFBVTtRQUNoQixPQUFPLENBQ0wsSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FDeEUsQ0FBQztJQUNKLENBQUM7dUdBdERVLGtCQUFrQjsyRkFBbEIsa0JBQWtCOztBQUgvQixnREEwREM7MkZBdkRZLGtCQUFrQjtrQkFIOUIsZ0JBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLGdCQUFnQjtpQkFDM0I7NElBTWMsWUFBWTtzQkFBeEIsWUFBSztnQkFRTyxtQkFBbUI7c0JBQS9CLFlBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBEaXJlY3RpdmUsXG4gIElucHV0LFxuICBPbkluaXQsXG4gIFRlbXBsYXRlUmVmLFxuICBWaWV3Q29udGFpbmVyUmVmLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgTG9nIH0gZnJvbSAnQHN0YXRzaWcvY2xpZW50LWNvcmUnO1xuXG5pbXBvcnQgeyBGZWF0dXJlR2F0ZU9wdGlvbnMgfSBmcm9tICcuL3N0YXRzaWcubW9kdWxlJztcbmltcG9ydCB7IFN0YXRzaWdTZXJ2aWNlIH0gZnJvbSAnLi9zdGF0c2lnLnNlcnZpY2UnO1xuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbc3RnQ2hlY2tHYXRlXScsXG59KVxuZXhwb3J0IGNsYXNzIENoZWNrR2F0ZURpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIHByaXZhdGUgX2dhdGUgPSAnJztcbiAgcHJpdmF0ZSBfaXNIaWRkZW4gPSB0cnVlO1xuICBwcml2YXRlIF9vcHRpb25zOiBGZWF0dXJlR2F0ZU9wdGlvbnMgPSB7fTtcblxuICBASW5wdXQoKSBzZXQgc3RnQ2hlY2tHYXRlKHZhbDogc3RyaW5nKSB7XG4gICAgTG9nLmRlYnVnKCdTZXR0aW5nIGdhdGUnLCB2YWwpO1xuICAgIGlmICh2YWwpIHtcbiAgICAgIHRoaXMuX2dhdGUgPSB2YWw7XG4gICAgICB0aGlzLl91cGRhdGVWaWV3KCk7XG4gICAgfVxuICB9XG5cbiAgQElucHV0KCkgc2V0IHN0Z0NoZWNrR2F0ZU9wdGlvbnModmFsOiBGZWF0dXJlR2F0ZU9wdGlvbnMpIHtcbiAgICBMb2cuZGVidWcoJ1NldHRpbmcgb3B0aW9ucycsIHZhbCk7XG4gICAgaWYgKHZhbCkge1xuICAgICAgdGhpcy5fb3B0aW9ucyA9IHZhbDtcbiAgICAgIHRoaXMuX3VwZGF0ZVZpZXcoKTtcbiAgICB9XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF90ZW1wbGF0ZVJlZjogVGVtcGxhdGVSZWY8dW5rbm93bj4sXG4gICAgcHJpdmF0ZSBfdmlld0NvbnRhaW5lcjogVmlld0NvbnRhaW5lclJlZixcbiAgICBwcml2YXRlIF9zdGF0c2lnU2VydmljZTogU3RhdHNpZ1NlcnZpY2UsXG4gICkge1xuICAgIF9zdGF0c2lnU2VydmljZS5nZXRDbGllbnQoKS4kb24oJ3ZhbHVlc191cGRhdGVkJywgKCkgPT4ge1xuICAgICAgdGhpcy5fdXBkYXRlVmlldygpO1xuICAgIH0pO1xuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2dhdGUpIHtcbiAgICAgIHRoaXMuX3VwZGF0ZVZpZXcoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF91cGRhdGVWaWV3KCkge1xuICAgIGlmICh0aGlzLl9jaGVja0dhdGUoKSkge1xuICAgICAgaWYgKHRoaXMuX2lzSGlkZGVuKSB7XG4gICAgICAgIExvZy5kZWJ1ZygnRmVhdHVyZSBmbGFnIGlzIGVuYWJsZWQsIHNob3dpbmcgdGhlIHRlbXBsYXRlJyk7XG4gICAgICAgIHRoaXMuX3ZpZXdDb250YWluZXIuY3JlYXRlRW1iZWRkZWRWaWV3KHRoaXMuX3RlbXBsYXRlUmVmKTtcbiAgICAgICAgdGhpcy5faXNIaWRkZW4gPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fdmlld0NvbnRhaW5lci5jbGVhcigpO1xuICAgICAgdGhpcy5faXNIaWRkZW4gPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2NoZWNrR2F0ZSgpIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5fZ2F0ZSAmJiB0aGlzLl9zdGF0c2lnU2VydmljZS5jaGVja0dhdGUodGhpcy5fZ2F0ZSwgdGhpcy5fb3B0aW9ucylcbiAgICApO1xuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CheckGateDirective = exports.StatsigService = exports.STATSIG_INIT_CONFIG = exports.StatsigModule = void 0;
|
|
4
|
+
var statsig_module_1 = require("./statsig.module");
|
|
5
|
+
Object.defineProperty(exports, "StatsigModule", { enumerable: true, get: function () { return statsig_module_1.StatsigModule; } });
|
|
6
|
+
Object.defineProperty(exports, "STATSIG_INIT_CONFIG", { enumerable: true, get: function () { return statsig_module_1.STATSIG_INIT_CONFIG; } });
|
|
7
|
+
var statsig_service_1 = require("./statsig.service");
|
|
8
|
+
Object.defineProperty(exports, "StatsigService", { enumerable: true, get: function () { return statsig_service_1.StatsigService; } });
|
|
9
|
+
var checkGate_directive_1 = require("./checkGate.directive");
|
|
10
|
+
Object.defineProperty(exports, "CheckGateDirective", { enumerable: true, get: function () { return checkGate_directive_1.CheckGateDirective; } });
|
|
11
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy9hbmd1bGFyLWJpbmRpbmdzL3NyYy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxtREFBc0U7QUFBN0QsK0dBQUEsYUFBYSxPQUFBO0FBQUUscUhBQUEsbUJBQW1CLE9BQUE7QUFDM0MscURBQW1EO0FBQTFDLGlIQUFBLGNBQWMsT0FBQTtBQUN2Qiw2REFBMkQ7QUFBbEQseUhBQUEsa0JBQWtCLE9BQUEiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgeyBTdGF0c2lnTW9kdWxlLCBTVEFUU0lHX0lOSVRfQ09ORklHIH0gZnJvbSAnLi9zdGF0c2lnLm1vZHVsZSc7XG5leHBvcnQgeyBTdGF0c2lnU2VydmljZSB9IGZyb20gJy4vc3RhdHNpZy5zZXJ2aWNlJztcbmV4cG9ydCB7IENoZWNrR2F0ZURpcmVjdGl2ZSB9IGZyb20gJy4vY2hlY2tHYXRlLmRpcmVjdGl2ZSc7XG4iXX0=
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Memoize = void 0;
|
|
4
|
+
function Memoize(keyGenerator) {
|
|
5
|
+
return function (_target, _propertyKey, descriptor) {
|
|
6
|
+
const orignal = descriptor.value;
|
|
7
|
+
const cache = new Map();
|
|
8
|
+
descriptor.value = function (...args) {
|
|
9
|
+
const key = keyGenerator(...args);
|
|
10
|
+
if (cache.has(key)) {
|
|
11
|
+
return cache.get(key);
|
|
12
|
+
}
|
|
13
|
+
const result = orignal.apply(this, args);
|
|
14
|
+
cache.set(key, result);
|
|
15
|
+
return result;
|
|
16
|
+
};
|
|
17
|
+
return descriptor;
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
exports.Memoize = Memoize;
|
|
21
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVtb2l6ZURlY29yYXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL2FuZ3VsYXItYmluZGluZ3Mvc3JjL21lbW9pemVEZWNvcmF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsU0FBZ0IsT0FBTyxDQUNyQixZQUE0QztJQUU1QyxPQUFPLFVBQ0wsT0FBZSxFQUNmLFlBQTZCLEVBQzdCLFVBQThCO1FBRTlCLE1BQU0sT0FBTyxHQUFHLFVBQVUsQ0FBQyxLQUF3QyxDQUFDO1FBQ3BFLE1BQU0sS0FBSyxHQUFHLElBQUksR0FBRyxFQUFtQixDQUFDO1FBRXpDLFVBQVUsQ0FBQyxLQUFLLEdBQUcsVUFBVSxHQUFHLElBQWU7WUFDN0MsTUFBTSxHQUFHLEdBQUcsWUFBWSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7WUFFbEMsSUFBSSxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ25CLE9BQU8sS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUN4QixDQUFDO1lBRUQsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDekMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDdkIsT0FBTyxNQUFNLENBQUM7UUFDaEIsQ0FBQyxDQUFDO1FBRUYsT0FBTyxVQUFVLENBQUM7SUFDcEIsQ0FBQyxDQUFDO0FBQ0osQ0FBQztBQXpCRCwwQkF5QkMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZnVuY3Rpb24gTWVtb2l6ZShcbiAga2V5R2VuZXJhdG9yOiAoLi4uYXJnczogdW5rbm93bltdKSA9PiBzdHJpbmcsXG4pOiBNZXRob2REZWNvcmF0b3Ige1xuICByZXR1cm4gZnVuY3Rpb24gKFxuICAgIF90YXJnZXQ6IG9iamVjdCxcbiAgICBfcHJvcGVydHlLZXk6IHN0cmluZyB8IHN5bWJvbCxcbiAgICBkZXNjcmlwdG9yOiBQcm9wZXJ0eURlc2NyaXB0b3IsXG4gICkge1xuICAgIGNvbnN0IG9yaWduYWwgPSBkZXNjcmlwdG9yLnZhbHVlIGFzICguLi5hcmdzOiB1bmtub3duW10pID0+IHVua25vd247XG4gICAgY29uc3QgY2FjaGUgPSBuZXcgTWFwPHN0cmluZywgdW5rbm93bj4oKTtcblxuICAgIGRlc2NyaXB0b3IudmFsdWUgPSBmdW5jdGlvbiAoLi4uYXJnczogdW5rbm93bltdKSB7XG4gICAgICBjb25zdCBrZXkgPSBrZXlHZW5lcmF0b3IoLi4uYXJncyk7XG5cbiAgICAgIGlmIChjYWNoZS5oYXMoa2V5KSkge1xuICAgICAgICByZXR1cm4gY2FjaGUuZ2V0KGtleSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IG9yaWduYWwuYXBwbHkodGhpcywgYXJncyk7XG4gICAgICBjYWNoZS5zZXQoa2V5LCByZXN1bHQpO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuXG4gICAgcmV0dXJuIGRlc2NyaXB0b3I7XG4gIH07XG59XG4iXX0=
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Generated bundle index. Do not edit.
|
|
4
|
+
*/
|
|
5
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
6
|
+
if (k2 === undefined) k2 = k;
|
|
7
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
8
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
9
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
10
|
+
}
|
|
11
|
+
Object.defineProperty(o, k2, desc);
|
|
12
|
+
}) : (function(o, m, k, k2) {
|
|
13
|
+
if (k2 === undefined) k2 = k;
|
|
14
|
+
o[k2] = m[k];
|
|
15
|
+
}));
|
|
16
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
17
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
18
|
+
};
|
|
19
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
20
|
+
__exportStar(require("./index"), exports);
|
|
21
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhdHNpZy1hbmd1bGFyLWJpbmRpbmdzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcGFja2FnZXMvYW5ndWxhci1iaW5kaW5ncy9zcmMvc3RhdHNpZy1hbmd1bGFyLWJpbmRpbmdzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7R0FFRzs7Ozs7Ozs7Ozs7Ozs7OztBQUVILDBDQUF3QiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVkIGJ1bmRsZSBpbmRleC4gRG8gbm90IGVkaXQuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9pbmRleCc7XG4iXX0=
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.StatsigModule = exports.STATSIG_INIT_CONFIG = void 0;
|
|
4
|
+
const core_1 = require("@angular/core");
|
|
5
|
+
const checkGate_directive_1 = require("./checkGate.directive");
|
|
6
|
+
const i0 = require("@angular/core");
|
|
7
|
+
exports.STATSIG_INIT_CONFIG = new core_1.InjectionToken('StatsigProvider');
|
|
8
|
+
class StatsigModule {
|
|
9
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: StatsigModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
10
|
+
static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "17.1.3", ngImport: i0, type: StatsigModule, declarations: [checkGate_directive_1.CheckGateDirective], exports: [checkGate_directive_1.CheckGateDirective] });
|
|
11
|
+
static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: StatsigModule });
|
|
12
|
+
}
|
|
13
|
+
exports.StatsigModule = StatsigModule;
|
|
14
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: StatsigModule, decorators: [{
|
|
15
|
+
type: core_1.NgModule,
|
|
16
|
+
args: [{
|
|
17
|
+
declarations: [checkGate_directive_1.CheckGateDirective],
|
|
18
|
+
exports: [checkGate_directive_1.CheckGateDirective],
|
|
19
|
+
providers: [],
|
|
20
|
+
}]
|
|
21
|
+
}] });
|
|
22
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhdHNpZy5tb2R1bGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy9hbmd1bGFyLWJpbmRpbmdzL3NyYy9zdGF0c2lnLm1vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSx3Q0FBeUQ7QUFTekQsK0RBQTJEOztBQWE5QyxRQUFBLG1CQUFtQixHQUFHLElBQUkscUJBQWMsQ0FFbkQsaUJBQWlCLENBQUMsQ0FBQztBQUlyQixNQUthLGFBQWE7dUdBQWIsYUFBYTt3R0FBYixhQUFhLGlCQUpULHdDQUFrQixhQUN2Qix3Q0FBa0I7d0dBR2pCLGFBQWE7O0FBTDFCLHNDQUs2QjsyRkFBaEIsYUFBYTtrQkFMekIsZUFBUTttQkFBQztvQkFDUixZQUFZLEVBQUUsQ0FBQyx3Q0FBa0IsQ0FBQztvQkFDbEMsT0FBTyxFQUFFLENBQUMsd0NBQWtCLENBQUM7b0JBQzdCLFNBQVMsRUFBRSxFQUFFO2lCQUNkIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0aW9uVG9rZW4sIE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7XG4gIEZlYXR1cmVHYXRlRXZhbHVhdGlvbk9wdGlvbnMsXG4gIFN0YXRzaWdDbGllbnQsXG4gIFN0YXRzaWdPcHRpb25zLFxuICBTdGF0c2lnVXNlcixcbn0gZnJvbSAnQHN0YXRzaWcvanMtY2xpZW50JztcblxuaW1wb3J0IHsgQ2hlY2tHYXRlRGlyZWN0aXZlIH0gZnJvbSAnLi9jaGVja0dhdGUuZGlyZWN0aXZlJztcblxudHlwZSBXaXRoQ2xpZW50PFQgZXh0ZW5kcyBTdGF0c2lnQ2xpZW50PiA9IHsgY2xpZW50OiBUIH07XG50eXBlIFdpdGhDb25maWd1cmF0aW9uID0ge1xuICBzZGtLZXk6IHN0cmluZztcbiAgdXNlcjogU3RhdHNpZ1VzZXI7XG4gIG9wdGlvbnM/OiBTdGF0c2lnT3B0aW9ucztcbn07XG5cbmV4cG9ydCB0eXBlIFN0YXRzaWdJbml0Q29uZmlnPFQgZXh0ZW5kcyBTdGF0c2lnQ2xpZW50PiA9XG4gIHwgV2l0aENsaWVudDxUPlxuICB8IFdpdGhDb25maWd1cmF0aW9uO1xuXG5leHBvcnQgY29uc3QgU1RBVFNJR19JTklUX0NPTkZJRyA9IG5ldyBJbmplY3Rpb25Ub2tlbjxcbiAgU3RhdHNpZ0luaXRDb25maWc8U3RhdHNpZ0NsaWVudD5cbj4oJ1N0YXRzaWdQcm92aWRlcicpO1xuXG5leHBvcnQgdHlwZSBGZWF0dXJlR2F0ZU9wdGlvbnMgPSBGZWF0dXJlR2F0ZUV2YWx1YXRpb25PcHRpb25zO1xuXG5ATmdNb2R1bGUoe1xuICBkZWNsYXJhdGlvbnM6IFtDaGVja0dhdGVEaXJlY3RpdmVdLFxuICBleHBvcnRzOiBbQ2hlY2tHYXRlRGlyZWN0aXZlXSxcbiAgcHJvdmlkZXJzOiBbXSxcbn0pXG5leHBvcnQgY2xhc3MgU3RhdHNpZ01vZHVsZSB7fVxuIl19
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.StatsigService = void 0;
|
|
13
|
+
const core_1 = require("@angular/core");
|
|
14
|
+
const rxjs_1 = require("rxjs");
|
|
15
|
+
const client_core_1 = require("@statsig/client-core");
|
|
16
|
+
const js_client_1 = require("@statsig/js-client");
|
|
17
|
+
const memoizeDecorator_1 = require("./memoizeDecorator");
|
|
18
|
+
const statsig_module_1 = require("./statsig.module");
|
|
19
|
+
const i0 = require("@angular/core");
|
|
20
|
+
class StatsigService {
|
|
21
|
+
_renderVersion = 0;
|
|
22
|
+
_client;
|
|
23
|
+
_isLoadingSubject = new rxjs_1.BehaviorSubject(true);
|
|
24
|
+
isLoading$ = this._isLoadingSubject.asObservable();
|
|
25
|
+
constructor(provider) {
|
|
26
|
+
if ('client' in provider) {
|
|
27
|
+
this._client = provider.client;
|
|
28
|
+
}
|
|
29
|
+
else if ('sdkKey' in provider && 'user' in provider) {
|
|
30
|
+
this._client = new js_client_1.StatsigClient(provider.sdkKey, provider.user, provider.options);
|
|
31
|
+
this._client
|
|
32
|
+
.initializeAsync()
|
|
33
|
+
.catch((error) => {
|
|
34
|
+
client_core_1.Log.error('Error initializing StatsigClient', error);
|
|
35
|
+
})
|
|
36
|
+
.finally(() => {
|
|
37
|
+
this._isLoadingSubject.next(false);
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
client_core_1.Log.error('Must provide a client or sdkKey and user to initialize StatsigService');
|
|
42
|
+
this._client = new js_client_1.StatsigClient('', {});
|
|
43
|
+
}
|
|
44
|
+
client_core_1.Log.debug('StatsigService created', this._client);
|
|
45
|
+
this._checkAndEmitLoadingStatus();
|
|
46
|
+
this._client.$on('values_updated', this._onValuesUpdated);
|
|
47
|
+
client_core_1.SDKType._setBindingType('angular');
|
|
48
|
+
}
|
|
49
|
+
ngOnDestroy() {
|
|
50
|
+
this._client.shutdown().catch((error) => {
|
|
51
|
+
client_core_1.Log.error('An error occured during shutdown', error);
|
|
52
|
+
});
|
|
53
|
+
this._client.off('values_updated', this._onValuesUpdated);
|
|
54
|
+
}
|
|
55
|
+
checkGate(gateName, options) {
|
|
56
|
+
client_core_1.Log.debug(`checkGate caled for ${gateName}, rv: ${this._renderVersion}`);
|
|
57
|
+
return this._checkGateImpl(this._renderVersion, gateName, options);
|
|
58
|
+
}
|
|
59
|
+
getDynamicConfig(configName, options) {
|
|
60
|
+
client_core_1.Log.debug(`getDynamicConfig called for ${configName}, rv: ${this._renderVersion}`);
|
|
61
|
+
return this._getDynamicConfigImpl(this._renderVersion, configName, options);
|
|
62
|
+
}
|
|
63
|
+
getExperiment(experimentName, options) {
|
|
64
|
+
client_core_1.Log.debug(`getExperiment caled for ${experimentName}, rv: ${this._renderVersion}`);
|
|
65
|
+
return this._getExperimentImpl(this._renderVersion, experimentName, options);
|
|
66
|
+
}
|
|
67
|
+
getLayer(layerName, options) {
|
|
68
|
+
client_core_1.Log.debug(`getLayer caled for ${layerName}, rv: ${this._renderVersion}`);
|
|
69
|
+
return this._getLayerImpl(this._renderVersion, layerName, options);
|
|
70
|
+
}
|
|
71
|
+
logEvent(eventName, value, metadata) {
|
|
72
|
+
this._client.logEvent(eventName, value, metadata);
|
|
73
|
+
}
|
|
74
|
+
updateUserAsync(user, options) {
|
|
75
|
+
return this._client.updateUserAsync(user, options);
|
|
76
|
+
}
|
|
77
|
+
updateUserSync(user, options) {
|
|
78
|
+
this._client.updateUserSync(user, options);
|
|
79
|
+
}
|
|
80
|
+
getClient() {
|
|
81
|
+
return this._client;
|
|
82
|
+
}
|
|
83
|
+
_checkGateImpl(_rv, gateName, options) {
|
|
84
|
+
return this._client.checkGate(gateName, options);
|
|
85
|
+
}
|
|
86
|
+
_getDynamicConfigImpl(_rv, configName, options) {
|
|
87
|
+
return this._client.getDynamicConfig(configName, options);
|
|
88
|
+
}
|
|
89
|
+
_getExperimentImpl(_rv, experimentName, options) {
|
|
90
|
+
return this._client.getExperiment(experimentName, options);
|
|
91
|
+
}
|
|
92
|
+
_getLayerImpl(_rv, layerName, options) {
|
|
93
|
+
return this._client.getLayer(layerName, options);
|
|
94
|
+
}
|
|
95
|
+
_checkAndEmitLoadingStatus() {
|
|
96
|
+
const isReady = _isReady(this._client);
|
|
97
|
+
if (isReady) {
|
|
98
|
+
this._isLoadingSubject.next(false);
|
|
99
|
+
client_core_1.Log.debug('Client is now ready, loading status set to false');
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
this._isLoadingSubject.next(true);
|
|
103
|
+
client_core_1.Log.debug('Client is not ready, loading status set to true');
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
_onValuesUpdated = () => {
|
|
107
|
+
this._renderVersion++;
|
|
108
|
+
client_core_1.Log.debug('Values updated', this._renderVersion);
|
|
109
|
+
this._checkAndEmitLoadingStatus();
|
|
110
|
+
};
|
|
111
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: StatsigService, deps: [{ token: statsig_module_1.STATSIG_INIT_CONFIG }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
112
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: StatsigService, providedIn: 'root' });
|
|
113
|
+
}
|
|
114
|
+
exports.StatsigService = StatsigService;
|
|
115
|
+
__decorate([
|
|
116
|
+
(0, memoizeDecorator_1.Memoize)((...args) => {
|
|
117
|
+
const [rv, gn, opt] = args;
|
|
118
|
+
return `${rv}-${gn}-${JSON.stringify(opt)}`;
|
|
119
|
+
}),
|
|
120
|
+
__metadata("design:type", Function),
|
|
121
|
+
__metadata("design:paramtypes", [Number, String, Object]),
|
|
122
|
+
__metadata("design:returntype", Boolean)
|
|
123
|
+
], StatsigService.prototype, "_checkGateImpl", null);
|
|
124
|
+
__decorate([
|
|
125
|
+
(0, memoizeDecorator_1.Memoize)((...args) => {
|
|
126
|
+
const [rv, gn, opt] = args;
|
|
127
|
+
return `${rv}-${gn}-${JSON.stringify(opt)}`;
|
|
128
|
+
}),
|
|
129
|
+
__metadata("design:type", Function),
|
|
130
|
+
__metadata("design:paramtypes", [Number, String, Object]),
|
|
131
|
+
__metadata("design:returntype", Object)
|
|
132
|
+
], StatsigService.prototype, "_getDynamicConfigImpl", null);
|
|
133
|
+
__decorate([
|
|
134
|
+
(0, memoizeDecorator_1.Memoize)((...args) => {
|
|
135
|
+
const [rv, en, opt] = args;
|
|
136
|
+
return `${rv}-${en}-${JSON.stringify(opt)}`;
|
|
137
|
+
}),
|
|
138
|
+
__metadata("design:type", Function),
|
|
139
|
+
__metadata("design:paramtypes", [Number, String, Object]),
|
|
140
|
+
__metadata("design:returntype", Object)
|
|
141
|
+
], StatsigService.prototype, "_getExperimentImpl", null);
|
|
142
|
+
__decorate([
|
|
143
|
+
(0, memoizeDecorator_1.Memoize)((...args) => {
|
|
144
|
+
const [rv, ln, opt] = args;
|
|
145
|
+
return `${rv}-${ln}-${JSON.stringify(opt)}`;
|
|
146
|
+
}),
|
|
147
|
+
__metadata("design:type", Function),
|
|
148
|
+
__metadata("design:paramtypes", [Number, String, Object]),
|
|
149
|
+
__metadata("design:returntype", Object)
|
|
150
|
+
], StatsigService.prototype, "_getLayerImpl", null);
|
|
151
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: StatsigService, decorators: [{
|
|
152
|
+
type: core_1.Injectable,
|
|
153
|
+
args: [{
|
|
154
|
+
providedIn: 'root',
|
|
155
|
+
}]
|
|
156
|
+
}], ctorParameters: () => [{ type: undefined, decorators: [{
|
|
157
|
+
type: core_1.Inject,
|
|
158
|
+
args: [statsig_module_1.STATSIG_INIT_CONFIG]
|
|
159
|
+
}] }], propDecorators: { _checkGateImpl: [], _getDynamicConfigImpl: [], _getExperimentImpl: [], _getLayerImpl: [] } });
|
|
160
|
+
function _isReady(client) {
|
|
161
|
+
return client.loadingStatus === 'Ready';
|
|
162
|
+
}
|
|
163
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhdHNpZy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcGFja2FnZXMvYW5ndWxhci1iaW5kaW5ncy9zcmMvc3RhdHNpZy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7OztBQUFBLHdDQUE4RDtBQUM5RCwrQkFBbUQ7QUFFbkQsc0RBYzhCO0FBQzlCLGtEQUFtRDtBQUVuRCx5REFBNkM7QUFDN0MscURBQTBFOztBQUUxRSxNQUdhLGNBQWM7SUFDakIsY0FBYyxHQUFHLENBQUMsQ0FBQztJQUNuQixPQUFPLENBQWdCO0lBRXZCLGlCQUFpQixHQUFHLElBQUksc0JBQWUsQ0FBVSxJQUFJLENBQUMsQ0FBQztJQUMvRCxVQUFVLEdBQXdCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUV4RSxZQUMrQixRQUEwQztRQUV2RSxJQUFJLFFBQVEsSUFBSSxRQUFRLEVBQUUsQ0FBQztZQUN6QixJQUFJLENBQUMsT0FBTyxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUM7UUFDakMsQ0FBQzthQUFNLElBQUksUUFBUSxJQUFJLFFBQVEsSUFBSSxNQUFNLElBQUksUUFBUSxFQUFFLENBQUM7WUFDdEQsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLHlCQUFhLENBQzlCLFFBQVEsQ0FBQyxNQUFNLEVBQ2YsUUFBUSxDQUFDLElBQUksRUFDYixRQUFRLENBQUMsT0FBTyxDQUNqQixDQUFDO1lBQ0YsSUFBSSxDQUFDLE9BQU87aUJBQ1QsZUFBZSxFQUFFO2lCQUNqQixLQUFLLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtnQkFDZixpQkFBRyxDQUFDLEtBQUssQ0FBQyxrQ0FBa0MsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUN2RCxDQUFDLENBQUM7aUJBQ0QsT0FBTyxDQUFDLEdBQUcsRUFBRTtnQkFDWixJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxD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RCxDQUFDO1FBQ3ZFLE9BQU8sR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLENBQUM7Ozs7bURBT0Q7MkZBaktVLGNBQWM7a0JBSDFCLGlCQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQjs7MEJBU0ksYUFBTTsyQkFBQyxvQ0FBbUI7eUNBMkdyQixjQUFjLE1BZ0JkLHFCQUFxQixNQVlyQixrQkFBa0IsTUFZbEIsYUFBYTtBQTBCdkIsU0FBUyxRQUFRLENBQUMsTUFBcUI7SUFDckMsT0FBTyxNQUFNLENBQUMsYUFBYSxLQUFLLE9BQU8sQ0FBQztBQUMxQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlLCBPbkRlc3Ryb3kgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQge1xuICBEYXRhQWRhcHRlckFzeW5jT3B0aW9ucyxcbiAgRGF0YUFkYXB0ZXJTeW5jT3B0aW9ucyxcbiAgRHluYW1pY0NvbmZpZyxcbiAgRHluYW1pY0NvbmZpZ0V2YWx1YXRpb25PcHRpb25zLFxuICBFeHBlcmltZW50LFxuICBFeHBlcmltZW50RXZhbHVhdGlvbk9wdGlvbnMsXG4gIEZlYXR1cmVHYXRlRXZhbHVhdGlvbk9wdGlvbnMsXG4gIExheWVyLFxuICBMYXllckV2YWx1YXRpb25PcHRpb25zLFxuICBMb2csXG4gIFNES1R5cGUsXG4gIFN0YXRzaWdFdmVudCxcbiAgU3RhdHNpZ1VzZXIsXG59IGZyb20gJ0BzdGF0c2lnL2NsaWVudC1jb3JlJztcbmltcG9ydCB7IFN0YXRzaWdDbGllbnQgfSBmcm9tICdAc3RhdHNpZy9qcy1jbGllbnQnO1xuXG5pbXBvcnQgeyBNZW1vaXplIH0gZnJvbSAnLi9tZW1vaXplRGVjb3JhdG9yJztcbmltcG9ydCB7IFNUQVRTSUdfSU5JVF9DT05GSUcsIFN0YXRzaWdJbml0Q29uZmlnIH0gZnJvbSAnLi9zdGF0c2lnLm1vZHVsZSc7XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBTdGF0c2lnU2VydmljZSBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG4gIHByaXZhdGUgX3JlbmRlclZlcnNpb24gPSAwO1xuICBwcml2YXRlIF9jbGllbnQ6IFN0YXRzaWdDbGllbnQ7XG5cbiAgcHJpdmF0ZSBfaXNMb2FkaW5nU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4odHJ1ZSk7XG4gIGlzTG9hZGluZyQ6IE9ic2VydmFibGU8Ym9vbGVhbj4gPSB0aGlzLl9pc0xvYWRpbmdTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBJbmplY3QoU1RBVFNJR19JTklUX0NPTkZJRykgcHJvdmlkZXI6IFN0YXRzaWdJbml0Q29uZmlnPFN0YXRzaWdDbGllbnQ+LFxuICApIHtcbiAgICBpZiAoJ2NsaWVudCcgaW4gcHJvdmlkZXIpIHtcbiAgICAgIHRoaXMuX2NsaWVudCA9IHByb3ZpZGVyLmNsaWVudDtcbiAgICB9IGVsc2UgaWYgKCdzZGtLZXknIGluIHByb3ZpZGVyICYmICd1c2VyJyBpbiBwcm92aWRlcikge1xuICAgICAgdGhpcy5fY2xpZW50ID0gbmV3IFN0YXRzaWdDbGllbnQoXG4gICAgICAgIHByb3ZpZGVyLnNka0tleSxcbiAgICAgICAgcHJvdmlkZXIudXNlcixcbiAgICAgICAgcHJvdmlkZXIub3B0aW9ucyxcbiAgICAgICk7XG4gICAgICB0aGlzLl9jbGllbnRcbiAgICAgICAgLmluaXRpYWxpemVBc3luYygpXG4gICAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICBMb2cuZXJyb3IoJ0Vycm9yIGluaXRpYWxpemluZyBTdGF0c2lnQ2xpZW50JywgZXJyb3IpO1xuICAgICAgICB9KVxuICAgICAgICAuZmluYWxseSgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5faXNMb2FkaW5nU3ViamVjdC5uZXh0KGZhbHNlKTtcbiAgICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIExvZy5lcnJvcihcbiAgICAgICAgJ011c3QgcHJvdmlkZSBhIGNsaWVudCBvciBzZGtLZXkgYW5kIHVzZXIgdG8gaW5pdGlhbGl6ZSBTdGF0c2lnU2VydmljZScsXG4gICAgICApO1xuICAgICAgdGhpcy5fY2xpZW50ID0gbmV3IFN0YXRzaWdDbGllbnQoJycsIHt9KTtcbiAgICB9XG4gICAgTG9nLmRlYnVnKCdTdGF0c2lnU2VydmljZSBjcmVhdGVkJywgdGhpcy5fY2xpZW50KTtcbiAgICB0aGlzLl9jaGVja0FuZEVtaXRMb2FkaW5nU3RhdHVzKCk7XG4gICAgdGhpcy5fY2xpZW50LiRvbigndmFsdWVzX3VwZGF0ZWQnLCB0aGlzLl9vblZhbHVlc1VwZGF0ZWQpO1xuXG4gICAgU0RLVHlwZS5fc2V0QmluZGluZ1R5cGUoJ2FuZ3VsYXInKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuX2NsaWVudC5zaHV0ZG93bigpLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgTG9nLmVycm9yKCdBbiBlcnJvciBvY2N1cmVkIGR1cmluZyBzaHV0ZG93bicsIGVycm9yKTtcbiAgICB9KTtcbiAgICB0aGlzLl9jbGllbnQub2ZmKCd2YWx1ZXNfdXBkYXRlZCcsIHRoaXMuX29uVmFsdWVzVXBkYXRlZCk7XG4gIH1cblxuICBjaGVja0dhdGUoZ2F0ZU5hbWU6IHN0cmluZywgb3B0aW9ucz86IEZlYXR1cmVHYXRlRXZhbHVhdGlvbk9wdGlvbnMpOiBib29sZWFuIHtcbiAgICBMb2cuZGVidWcoYGNoZWNrR2F0ZSBjYWxlZCBmb3IgJHtnYXRlTmFtZX0sIHJ2OiAke3RoaXMuX3JlbmRlclZlcnNpb259YCk7XG5cbiAgICByZXR1cm4gdGhpcy5fY2hlY2tHYXRlSW1wbCh0aGlzLl9yZW5kZXJWZXJzaW9uLCBnYXRlTmFtZSwgb3B0aW9ucyk7XG4gIH1cblxuICBnZXREeW5hbWljQ29uZmlnKFxuICAgIGNvbmZpZ05hbWU6IHN0cmluZyxcbiAgICBvcHRpb25zPzogRHluYW1pY0NvbmZpZ0V2YWx1YXRpb25PcHRpb25zLFxuICApOiBEeW5hbWljQ29uZmlnIHtcbiAgICBMb2cuZGVidWcoXG4gICAgICBgZ2V0RHluYW1pY0NvbmZpZyBjYWxsZWQgZm9yICR7Y29uZmlnTmFtZX0sIHJ2OiAke3RoaXMuX3JlbmRlclZlcnNpb259YCxcbiAgICApO1xuXG4gICAgcmV0dXJuIHRoaXMuX2dldER5bmFtaWNDb25maWdJbXBsKHRoaXMuX3JlbmRlclZlcnNpb24sIGNvbmZpZ05hbWUsIG9wdGlvbnMpO1xuICB9XG5cbiAgZ2V0RXhwZXJpbWVudChcbiAgICBleHBlcmltZW50TmFtZTogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiBFeHBlcmltZW50RXZhbHVhdGlvbk9wdGlvbnMsXG4gICk6IEV4cGVyaW1lbnQge1xuICAgIExvZy5kZWJ1ZyhcbiAgICAgIGBnZXRFeHBlcmltZW50IGNhbGVkIGZvciAke2V4cGVyaW1lbnROYW1lfSwgcnY6ICR7dGhpcy5fcmVuZGVyVmVyc2lvbn1gLFxuICAgICk7XG5cbiAgICByZXR1cm4gdGhpcy5fZ2V0RXhwZXJpbWVudEltcGwoXG4gICAgICB0aGlzLl9yZW5kZXJWZXJzaW9uLFxuICAgICAgZXhwZXJpbWVudE5hbWUsXG4gICAgICBvcHRpb25zLFxuICAgICk7XG4gIH1cblxuICBnZXRMYXllcihsYXllck5hbWU6IHN0cmluZywgb3B0aW9ucz86IExheWVyRXZhbHVhdGlvbk9wdGlvbnMpOiBMYXllciB7XG4gICAgTG9nLmRlYnVnKGBnZXRMYXllciBjYWxlZCBmb3IgJHtsYXllck5hbWV9LCBydjogJHt0aGlzLl9yZW5kZXJWZXJzaW9ufWApO1xuXG4gICAgcmV0dXJuIHRoaXMuX2dldExheWVySW1wbCh0aGlzLl9yZW5kZXJWZXJzaW9uLCBsYXllck5hbWUsIG9wdGlvbnMpO1xuICB9XG5cbiAgbG9nRXZlbnQoXG4gICAgZXZlbnROYW1lOiBTdGF0c2lnRXZlbnQgfCBzdHJpbmcsXG4gICAgdmFsdWU/OiBzdHJpbmcgfCBudW1iZXIsXG4gICAgbWV0YWRhdGE/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuICApOiB2b2lkIHtcbiAgICB0aGlzLl9jbGllbnQubG9nRXZlbnQoZXZlbnROYW1lLCB2YWx1ZSwgbWV0YWRhdGEpO1xuICB9XG5cbiAgdXBkYXRlVXNlckFzeW5jKFxuICAgIHVzZXI6IFN0YXRzaWdVc2VyLFxuICAgIG9wdGlvbnM/OiBEYXRhQWRhcHRlckFzeW5jT3B0aW9ucyxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX2NsaWVudC51cGRhdGVVc2VyQXN5bmModXNlciwgb3B0aW9ucyk7XG4gIH1cblxuICB1cGRhdGVVc2VyU3luYyh1c2VyOiBTdGF0c2lnVXNlciwgb3B0aW9ucz86IERhdGFBZGFwdGVyU3luY09wdGlvbnMpOiB2b2lkIHtcbiAgICB0aGlzLl9jbGllbnQudXBkYXRlVXNlclN5bmModXNlciwgb3B0aW9ucyk7XG4gIH1cblxuICBnZXRDbGllbnQoKTogU3RhdHNpZ0NsaWVudCB7XG4gICAgcmV0dXJuIHRoaXMuX2NsaWVudDtcbiAgfVxuXG4gIEBNZW1vaXplKCguLi5hcmdzOiB1bmtub3duW10pID0+IHtcbiAgICBjb25zdCBbcnYsIGduLCBvcHRdID0gYXJncyBhcyBbXG4gICAgICBudW1iZXIsXG4gICAgICBzdHJpbmcsXG4gICAgICBGZWF0dXJlR2F0ZUV2YWx1YXRpb25PcHRpb25zLFxuICAgIF07XG4gICAgcmV0dXJuIGAke3J2fS0ke2dufS0ke0pTT04uc3RyaW5naWZ5KG9wdCl9YDtcbiAgfSlcbiAgcHJpdmF0ZSBfY2hlY2tHYXRlSW1wbChcbiAgICBfcnY6IG51bWJlcixcbiAgICBnYXRlTmFtZTogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiBGZWF0dXJlR2F0ZUV2YWx1YXRpb25PcHRpb25zLFxuICApOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fY2xpZW50LmNoZWNrR2F0ZShnYXRlTmFtZSwgb3B0aW9ucyk7XG4gIH1cblxuICBATWVtb2l6ZSgoLi4uYXJnczogdW5rbm93bltdKSA9PiB7XG4gICAgY29uc3QgW3J2LCBnbiwgb3B0XSA9IGFyZ3MgYXMgW1xuICAgICAgbnVtYmVyLFxuICAgICAgc3RyaW5nLFxuICAgICAgRHluYW1pY0NvbmZpZ0V2YWx1YXRpb25PcHRpb25zLFxuICAgIF07XG4gICAgcmV0dXJuIGAke3J2fS0ke2dufS0ke0pTT04uc3RyaW5naWZ5KG9wdCl9YDtcbiAgfSlcbiAgcHJpdmF0ZSBfZ2V0RHluYW1pY0NvbmZpZ0ltcGwoXG4gICAgX3J2OiBudW1iZXIsXG4gICAgY29uZmlnTmFtZTogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiBEeW5hbWljQ29uZmlnRXZhbHVhdGlvbk9wdGlvbnMsXG4gICk6IER5bmFtaWNDb25maWcge1xuICAgIHJldHVybiB0aGlzLl9jbGllbnQuZ2V0RHluYW1pY0NvbmZpZyhjb25maWdOYW1lLCBvcHRpb25zKTtcbiAgfVxuXG4gIEBNZW1vaXplKCguLi5hcmdzOiB1bmtub3duW10pID0+IHtcbiAgICBjb25zdCBbcnYsIGVuLCBvcHRdID0gYXJncyBhcyBbbnVtYmVyLCBzdHJpbmcsIEV4cGVyaW1lbnRFdmFsdWF0aW9uT3B0aW9uc107XG4gICAgcmV0dXJuIGAke3J2fS0ke2VufS0ke0pTT04uc3RyaW5naWZ5KG9wdCl9YDtcbiAgfSlcbiAgcHJpdmF0ZSBfZ2V0RXhwZXJpbWVudEltcGwoXG4gICAgX3J2OiBudW1iZXIsXG4gICAgZXhwZXJpbWVudE5hbWU6IHN0cmluZyxcbiAgICBvcHRpb25zPzogRXhwZXJpbWVudEV2YWx1YXRpb25PcHRpb25zLFxuICApOiBFeHBlcmltZW50IHtcbiAgICByZXR1cm4gdGhpcy5fY2xpZW50LmdldEV4cGVyaW1lbnQoZXhwZXJpbWVudE5hbWUsIG9wdGlvbnMpO1xuICB9XG5cbiAgQE1lbW9pemUoKC4uLmFyZ3M6IHVua25vd25bXSkgPT4ge1xuICAgIGNvbnN0IFtydiwgbG4sIG9wdF0gPSBhcmdzIGFzIFtudW1iZXIsIHN0cmluZywgTGF5ZXJFdmFsdWF0aW9uT3B0aW9uc107XG4gICAgcmV0dXJuIGAke3J2fS0ke2xufS0ke0pTT04uc3RyaW5naWZ5KG9wdCl9YDtcbiAgfSlcbiAgcHJpdmF0ZSBfZ2V0TGF5ZXJJbXBsKFxuICAgIF9ydjogbnVtYmVyLFxuICAgIGxheWVyTmFtZTogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiBMYXllckV2YWx1YXRpb25PcHRpb25zLFxuICApOiBMYXllciB7XG4gICAgcmV0dXJuIHRoaXMuX2NsaWVudC5nZXRMYXllcihsYXllck5hbWUsIG9wdGlvbnMpO1xuICB9XG5cbiAgcHJpdmF0ZSBfY2hlY2tBbmRFbWl0TG9hZGluZ1N0YXR1cygpOiB2b2lkIHtcbiAgICBjb25zdCBpc1JlYWR5ID0gX2lzUmVhZHkodGhpcy5fY2xpZW50KTtcbiAgICBpZiAoaXNSZWFkeSkge1xuICAgICAgdGhpcy5faXNMb2FkaW5nU3ViamVjdC5uZXh0KGZhbHNlKTtcbiAgICAgIExvZy5kZWJ1ZygnQ2xpZW50IGlzIG5vdyByZWFkeSwgbG9hZGluZyBzdGF0dXMgc2V0IHRvIGZhbHNlJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2lzTG9hZGluZ1N1YmplY3QubmV4dCh0cnVlKTtcbiAgICAgIExvZy5kZWJ1ZygnQ2xpZW50IGlzIG5vdCByZWFkeSwgbG9hZGluZyBzdGF0dXMgc2V0IHRvIHRydWUnKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9vblZhbHVlc1VwZGF0ZWQgPSAoKTogdm9pZCA9PiB7XG4gICAgdGhpcy5fcmVuZGVyVmVyc2lvbisrO1xuICAgIExvZy5kZWJ1ZygnVmFsdWVzIHVwZGF0ZWQnLCB0aGlzLl9yZW5kZXJWZXJzaW9uKTtcbiAgICB0aGlzLl9jaGVja0FuZEVtaXRMb2FkaW5nU3RhdHVzKCk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIF9pc1JlYWR5KGNsaWVudDogU3RhdHNpZ0NsaWVudCk6IGJvb2xlYW4ge1xuICByZXR1cm4gY2xpZW50LmxvYWRpbmdTdGF0dXMgPT09ICdSZWFkeSc7XG59XG4iXX0=
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Generated bundle index. Do not edit.
|
|
4
|
+
*/
|
|
5
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
6
|
+
if (k2 === undefined) k2 = k;
|
|
7
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
8
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
9
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
10
|
+
}
|
|
11
|
+
Object.defineProperty(o, k2, desc);
|
|
12
|
+
}) : (function(o, m, k, k2) {
|
|
13
|
+
if (k2 === undefined) k2 = k;
|
|
14
|
+
o[k2] = m[k];
|
|
15
|
+
}));
|
|
16
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
17
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
18
|
+
};
|
|
19
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
20
|
+
__exportStar(require("./index"), exports);
|
|
21
|
+
//# sourceMappingURL=statsig-angular-bindings.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"statsig-angular-bindings.mjs","sources":["../../../../packages/angular-bindings/src/statsig-angular-bindings.ts"],"sourcesContent":["/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";AAAA;;AAEG;;;;;;;;;;;;;;;;AAEH,YAAwB,CAAA,OAAA,CAAA,SAAA,CAAA,EAAA,OAAA,CAAA"}
|
package/index.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../packages/angular-bindings/src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACtE,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memoizeDecorator.d.ts","sourceRoot":"","sources":["../../../packages/angular-bindings/src/memoizeDecorator.ts"],"names":[],"mappings":"AAAA,wBAAgB,OAAO,CACrB,YAAY,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,MAAM,GAC3C,eAAe,CAuBjB"}
|
package/package.json
CHANGED
|
@@ -1,12 +1,27 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@statsig/angular-bindings",
|
|
3
|
-
"version": "3.6.
|
|
4
|
-
"dependencies": {
|
|
3
|
+
"version": "3.6.2-beta.2",
|
|
4
|
+
"dependencies": {
|
|
5
|
+
"tslib": "^2.3.0"
|
|
6
|
+
},
|
|
5
7
|
"peerDependencies": {
|
|
6
8
|
"@angular/core": ">=12.0.0",
|
|
7
9
|
"@statsig/js-client": "3.6.0",
|
|
8
10
|
"@statsig/client-core": "3.6.0",
|
|
9
11
|
"rxjs": "^6.0.0 || ^7.0.0"
|
|
10
12
|
},
|
|
11
|
-
"sideEffects": false
|
|
12
|
-
|
|
13
|
+
"sideEffects": false,
|
|
14
|
+
"module": "fesm2022/statsig-angular-bindings.mjs",
|
|
15
|
+
"typings": "index.d.ts",
|
|
16
|
+
"exports": {
|
|
17
|
+
"./package.json": {
|
|
18
|
+
"default": "./package.json"
|
|
19
|
+
},
|
|
20
|
+
".": {
|
|
21
|
+
"types": "./index.d.ts",
|
|
22
|
+
"esm2022": "./esm2022/statsig-angular-bindings.mjs",
|
|
23
|
+
"esm": "./esm2022/statsig-angular-bindings.mjs",
|
|
24
|
+
"default": "./fesm2022/statsig-angular-bindings.mjs"
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"statsig-angular-bindings.d.ts","sourceRoot":"","sources":["../../../packages/angular-bindings/src/statsig-angular-bindings.ts"],"names":[],"mappings":"AAAA;;GAEG;;AAEH,cAAc,SAAS,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { InjectionToken } from '@angular/core';
|
|
2
|
+
import { FeatureGateEvaluationOptions, StatsigClient, StatsigOptions, StatsigUser } from '@statsig/js-client';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
import * as i1 from "./checkGate.directive";
|
|
5
|
+
type WithClient<T extends StatsigClient> = {
|
|
6
|
+
client: T;
|
|
7
|
+
};
|
|
8
|
+
type WithConfiguration = {
|
|
9
|
+
sdkKey: string;
|
|
10
|
+
user: StatsigUser;
|
|
11
|
+
options?: StatsigOptions;
|
|
12
|
+
};
|
|
13
|
+
export type StatsigInitConfig<T extends StatsigClient> = WithClient<T> | WithConfiguration;
|
|
14
|
+
export declare const STATSIG_INIT_CONFIG: InjectionToken<StatsigInitConfig<StatsigClient>>;
|
|
15
|
+
export type FeatureGateOptions = FeatureGateEvaluationOptions;
|
|
16
|
+
export declare class StatsigModule {
|
|
17
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<StatsigModule, never>;
|
|
18
|
+
static ɵmod: i0.ɵɵNgModuleDeclaration<StatsigModule, [typeof i1.CheckGateDirective], never, [typeof i1.CheckGateDirective]>;
|
|
19
|
+
static ɵinj: i0.ɵɵInjectorDeclaration<StatsigModule>;
|
|
20
|
+
}
|
|
21
|
+
export {};
|
|
22
|
+
//# sourceMappingURL=statsig.module.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"statsig.module.d.ts","sourceRoot":"","sources":["../../../packages/angular-bindings/src/statsig.module.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAY,MAAM,eAAe,CAAC;AAEzD,OAAO,EACL,4BAA4B,EAC5B,aAAa,EACb,cAAc,EACd,WAAW,EACZ,MAAM,oBAAoB,CAAC;;;AAI5B,KAAK,UAAU,CAAC,CAAC,SAAS,aAAa,IAAI;IAAE,MAAM,EAAE,CAAC,CAAA;CAAE,CAAC;AACzD,KAAK,iBAAiB,GAAG;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,WAAW,CAAC;IAClB,OAAO,CAAC,EAAE,cAAc,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,iBAAiB,CAAC,CAAC,SAAS,aAAa,IACjD,UAAU,CAAC,CAAC,CAAC,GACb,iBAAiB,CAAC;AAEtB,eAAO,MAAM,mBAAmB,kDAEZ,CAAC;AAErB,MAAM,MAAM,kBAAkB,GAAG,4BAA4B,CAAC;AAE9D,qBAKa,aAAa;yCAAb,aAAa;0CAAb,aAAa;0CAAb,aAAa;CAAG"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { OnDestroy } from '@angular/core';
|
|
2
|
+
import { Observable } from 'rxjs';
|
|
3
|
+
import { DataAdapterAsyncOptions, DataAdapterSyncOptions, DynamicConfig, DynamicConfigEvaluationOptions, Experiment, ExperimentEvaluationOptions, FeatureGateEvaluationOptions, Layer, LayerEvaluationOptions, StatsigEvent, StatsigUser } from '@statsig/client-core';
|
|
4
|
+
import { StatsigClient } from '@statsig/js-client';
|
|
5
|
+
import { StatsigInitConfig } from './statsig.module';
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
export declare class StatsigService implements OnDestroy {
|
|
8
|
+
private _renderVersion;
|
|
9
|
+
private _client;
|
|
10
|
+
private _isLoadingSubject;
|
|
11
|
+
isLoading$: Observable<boolean>;
|
|
12
|
+
constructor(provider: StatsigInitConfig<StatsigClient>);
|
|
13
|
+
ngOnDestroy(): void;
|
|
14
|
+
checkGate(gateName: string, options?: FeatureGateEvaluationOptions): boolean;
|
|
15
|
+
getDynamicConfig(configName: string, options?: DynamicConfigEvaluationOptions): DynamicConfig;
|
|
16
|
+
getExperiment(experimentName: string, options?: ExperimentEvaluationOptions): Experiment;
|
|
17
|
+
getLayer(layerName: string, options?: LayerEvaluationOptions): Layer;
|
|
18
|
+
logEvent(eventName: StatsigEvent | string, value?: string | number, metadata?: Record<string, string>): void;
|
|
19
|
+
updateUserAsync(user: StatsigUser, options?: DataAdapterAsyncOptions): Promise<void>;
|
|
20
|
+
updateUserSync(user: StatsigUser, options?: DataAdapterSyncOptions): void;
|
|
21
|
+
getClient(): StatsigClient;
|
|
22
|
+
private _checkGateImpl;
|
|
23
|
+
private _getDynamicConfigImpl;
|
|
24
|
+
private _getExperimentImpl;
|
|
25
|
+
private _getLayerImpl;
|
|
26
|
+
private _checkAndEmitLoadingStatus;
|
|
27
|
+
private _onValuesUpdated;
|
|
28
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<StatsigService, never>;
|
|
29
|
+
static ɵprov: i0.ɵɵInjectableDeclaration<StatsigService>;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=statsig.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"statsig.service.d.ts","sourceRoot":"","sources":["../../../packages/angular-bindings/src/statsig.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,SAAS,EAAE,MAAM,eAAe,CAAC;AAC9D,OAAO,EAAmB,UAAU,EAAE,MAAM,MAAM,CAAC;AAEnD,OAAO,EACL,uBAAuB,EACvB,sBAAsB,EACtB,aAAa,EACb,8BAA8B,EAC9B,UAAU,EACV,2BAA2B,EAC3B,4BAA4B,EAC5B,KAAK,EACL,sBAAsB,EAGtB,YAAY,EACZ,WAAW,EACZ,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAGnD,OAAO,EAAuB,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;;AAE1E,qBAGa,cAAe,YAAW,SAAS;IAC9C,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,OAAO,CAAgB;IAE/B,OAAO,CAAC,iBAAiB,CAAsC;IAC/D,UAAU,EAAE,UAAU,CAAC,OAAO,CAAC,CAAyC;gBAGzC,QAAQ,EAAE,iBAAiB,CAAC,aAAa,CAAC;IA+BzE,WAAW,IAAI,IAAI;IAOnB,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,4BAA4B,GAAG,OAAO;IAM5E,gBAAgB,CACd,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE,8BAA8B,GACvC,aAAa;IAQhB,aAAa,CACX,cAAc,EAAE,MAAM,EACtB,OAAO,CAAC,EAAE,2BAA2B,GACpC,UAAU;IAYb,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,sBAAsB,GAAG,KAAK;IAMpE,QAAQ,CACN,SAAS,EAAE,YAAY,GAAG,MAAM,EAChC,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,EACvB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAChC,IAAI;IAIP,eAAe,CACb,IAAI,EAAE,WAAW,EACjB,OAAO,CAAC,EAAE,uBAAuB,GAChC,OAAO,CAAC,IAAI,CAAC;IAIhB,cAAc,CAAC,IAAI,EAAE,WAAW,EAAE,OAAO,CAAC,EAAE,sBAAsB,GAAG,IAAI;IAIzE,SAAS,IAAI,aAAa;IAY1B,OAAO,CAAC,cAAc;IAgBtB,OAAO,CAAC,qBAAqB;IAY7B,OAAO,CAAC,kBAAkB;IAY1B,OAAO,CAAC,aAAa;IAQrB,OAAO,CAAC,0BAA0B;IAWlC,OAAO,CAAC,gBAAgB,CAItB;yCAlLS,cAAc;6CAAd,cAAc;CAmL1B"}
|
package/.eslintrc.json
DELETED
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"extends": ["../../.eslintrc.json"],
|
|
3
|
-
"ignorePatterns": ["!**/*"],
|
|
4
|
-
"overrides": [
|
|
5
|
-
{
|
|
6
|
-
"files": ["*.ts"],
|
|
7
|
-
"extends": [
|
|
8
|
-
"plugin:@nx/angular",
|
|
9
|
-
"plugin:@angular-eslint/template/process-inline-templates"
|
|
10
|
-
],
|
|
11
|
-
"rules": {
|
|
12
|
-
"@angular-eslint/directive-selector": [
|
|
13
|
-
"error",
|
|
14
|
-
{
|
|
15
|
-
"type": "attribute",
|
|
16
|
-
"prefix": "stg",
|
|
17
|
-
"style": "camelCase"
|
|
18
|
-
}
|
|
19
|
-
],
|
|
20
|
-
"@angular-eslint/component-selector": [
|
|
21
|
-
"error",
|
|
22
|
-
{
|
|
23
|
-
"type": "element",
|
|
24
|
-
"prefix": "stg",
|
|
25
|
-
"style": "kebab-case"
|
|
26
|
-
}
|
|
27
|
-
]
|
|
28
|
-
}
|
|
29
|
-
},
|
|
30
|
-
{
|
|
31
|
-
"files": ["*.html"],
|
|
32
|
-
"extends": ["plugin:@nx/angular-template"],
|
|
33
|
-
"rules": {}
|
|
34
|
-
},
|
|
35
|
-
{
|
|
36
|
-
"files": ["*.json"],
|
|
37
|
-
"parser": "jsonc-eslint-parser",
|
|
38
|
-
"rules": {
|
|
39
|
-
"@nx/dependency-checks": [
|
|
40
|
-
"error",
|
|
41
|
-
{
|
|
42
|
-
"ignoredDependencies": ["jest-preset-angular"]
|
|
43
|
-
}
|
|
44
|
-
]
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
]
|
|
48
|
-
}
|
package/jest.config.ts
DELETED
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
/* eslint-disable */
|
|
2
|
-
export default {
|
|
3
|
-
displayName: 'angular-bindings',
|
|
4
|
-
preset: '../../jest.preset.js',
|
|
5
|
-
setupFilesAfterEnv: ['<rootDir>/src/test-setup.ts'],
|
|
6
|
-
coverageDirectory: '../../coverage/packages/angular-bindings',
|
|
7
|
-
transform: {
|
|
8
|
-
'^.+\\.(ts|mjs|js|html)$': [
|
|
9
|
-
'jest-preset-angular',
|
|
10
|
-
{
|
|
11
|
-
tsconfig: '<rootDir>/tsconfig.spec.json',
|
|
12
|
-
stringifyContentPathRegex: '\\.(html|svg)$',
|
|
13
|
-
},
|
|
14
|
-
],
|
|
15
|
-
},
|
|
16
|
-
transformIgnorePatterns: ['node_modules/(?!.*\\.mjs$)'],
|
|
17
|
-
snapshotSerializers: [
|
|
18
|
-
'jest-preset-angular/build/serializers/no-ng-attributes',
|
|
19
|
-
'jest-preset-angular/build/serializers/ng-snapshot',
|
|
20
|
-
'jest-preset-angular/build/serializers/html-comment',
|
|
21
|
-
],
|
|
22
|
-
};
|
package/ng-package.json
DELETED
package/project.json
DELETED
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "angular-bindings",
|
|
3
|
-
"$schema": "../../node_modules/nx/schemas/project-schema.json",
|
|
4
|
-
"sourceRoot": "packages/angular-bindings/src",
|
|
5
|
-
"prefix": "lib",
|
|
6
|
-
"projectType": "library",
|
|
7
|
-
"tags": [],
|
|
8
|
-
"targets": {
|
|
9
|
-
"build": {
|
|
10
|
-
"executor": "@nx/angular:package",
|
|
11
|
-
"outputs": ["{workspaceRoot}/dist/{projectRoot}"],
|
|
12
|
-
"options": {
|
|
13
|
-
"project": "packages/angular-bindings/ng-package.json",
|
|
14
|
-
"tsConfig": "packages/angular-bindings/tsconfig.lib.json"
|
|
15
|
-
}
|
|
16
|
-
},
|
|
17
|
-
"test": {
|
|
18
|
-
"executor": "@nx/jest:jest",
|
|
19
|
-
"outputs": ["{workspaceRoot}/coverage/{projectRoot}"],
|
|
20
|
-
"options": {
|
|
21
|
-
"jestConfig": "packages/angular-bindings/jest.config.ts"
|
|
22
|
-
}
|
|
23
|
-
},
|
|
24
|
-
"lint": {
|
|
25
|
-
"executor": "@nx/eslint:lint"
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
}
|
|
@@ -1,72 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
Directive,
|
|
3
|
-
Input,
|
|
4
|
-
OnInit,
|
|
5
|
-
TemplateRef,
|
|
6
|
-
ViewContainerRef,
|
|
7
|
-
} from '@angular/core';
|
|
8
|
-
|
|
9
|
-
import { Log } from '@statsig/client-core';
|
|
10
|
-
|
|
11
|
-
import { FeatureGateOptions } from './statsig.module';
|
|
12
|
-
import { StatsigService } from './statsig.service';
|
|
13
|
-
|
|
14
|
-
@Directive({
|
|
15
|
-
selector: '[stgCheckGate]',
|
|
16
|
-
})
|
|
17
|
-
export class CheckGateDirective implements OnInit {
|
|
18
|
-
private _gate = '';
|
|
19
|
-
private _isHidden = true;
|
|
20
|
-
private _options: FeatureGateOptions = {};
|
|
21
|
-
|
|
22
|
-
@Input() set stgCheckGate(val: string) {
|
|
23
|
-
Log.debug('Setting gate', val);
|
|
24
|
-
if (val) {
|
|
25
|
-
this._gate = val;
|
|
26
|
-
this._updateView();
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
@Input() set stgCheckGateOptions(val: FeatureGateOptions) {
|
|
31
|
-
Log.debug('Setting options', val);
|
|
32
|
-
if (val) {
|
|
33
|
-
this._options = val;
|
|
34
|
-
this._updateView();
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
constructor(
|
|
39
|
-
private _templateRef: TemplateRef<unknown>,
|
|
40
|
-
private _viewContainer: ViewContainerRef,
|
|
41
|
-
private _statsigService: StatsigService,
|
|
42
|
-
) {
|
|
43
|
-
_statsigService.getClient().$on('values_updated', () => {
|
|
44
|
-
this._updateView();
|
|
45
|
-
});
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
ngOnInit(): void {
|
|
49
|
-
if (this._gate) {
|
|
50
|
-
this._updateView();
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
private _updateView() {
|
|
55
|
-
if (this._checkGate()) {
|
|
56
|
-
if (this._isHidden) {
|
|
57
|
-
Log.debug('Feature flag is enabled, showing the template');
|
|
58
|
-
this._viewContainer.createEmbeddedView(this._templateRef);
|
|
59
|
-
this._isHidden = false;
|
|
60
|
-
}
|
|
61
|
-
} else {
|
|
62
|
-
this._viewContainer.clear();
|
|
63
|
-
this._isHidden = true;
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
private _checkGate() {
|
|
68
|
-
return (
|
|
69
|
-
this._gate && this._statsigService.checkGate(this._gate, this._options)
|
|
70
|
-
);
|
|
71
|
-
}
|
|
72
|
-
}
|
package/src/memoizeDecorator.ts
DELETED
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
export function Memoize(
|
|
2
|
-
keyGenerator: (...args: unknown[]) => string,
|
|
3
|
-
): MethodDecorator {
|
|
4
|
-
return function (
|
|
5
|
-
_target: object,
|
|
6
|
-
_propertyKey: string | symbol,
|
|
7
|
-
descriptor: PropertyDescriptor,
|
|
8
|
-
) {
|
|
9
|
-
const orignal = descriptor.value as (...args: unknown[]) => unknown;
|
|
10
|
-
const cache = new Map<string, unknown>();
|
|
11
|
-
|
|
12
|
-
descriptor.value = function (...args: unknown[]) {
|
|
13
|
-
const key = keyGenerator(...args);
|
|
14
|
-
|
|
15
|
-
if (cache.has(key)) {
|
|
16
|
-
return cache.get(key);
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
const result = orignal.apply(this, args);
|
|
20
|
-
cache.set(key, result);
|
|
21
|
-
return result;
|
|
22
|
-
};
|
|
23
|
-
|
|
24
|
-
return descriptor;
|
|
25
|
-
};
|
|
26
|
-
}
|
package/src/statsig.module.ts
DELETED
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
import { InjectionToken, NgModule } from '@angular/core';
|
|
2
|
-
|
|
3
|
-
import {
|
|
4
|
-
FeatureGateEvaluationOptions,
|
|
5
|
-
StatsigClient,
|
|
6
|
-
StatsigOptions,
|
|
7
|
-
StatsigUser,
|
|
8
|
-
} from '@statsig/js-client';
|
|
9
|
-
|
|
10
|
-
import { CheckGateDirective } from './checkGate.directive';
|
|
11
|
-
|
|
12
|
-
type WithClient<T extends StatsigClient> = { client: T };
|
|
13
|
-
type WithConfiguration = {
|
|
14
|
-
sdkKey: string;
|
|
15
|
-
user: StatsigUser;
|
|
16
|
-
options?: StatsigOptions;
|
|
17
|
-
};
|
|
18
|
-
|
|
19
|
-
export type StatsigInitConfig<T extends StatsigClient> =
|
|
20
|
-
| WithClient<T>
|
|
21
|
-
| WithConfiguration;
|
|
22
|
-
|
|
23
|
-
export const STATSIG_INIT_CONFIG = new InjectionToken<
|
|
24
|
-
StatsigInitConfig<StatsigClient>
|
|
25
|
-
>('StatsigProvider');
|
|
26
|
-
|
|
27
|
-
export type FeatureGateOptions = FeatureGateEvaluationOptions;
|
|
28
|
-
|
|
29
|
-
@NgModule({
|
|
30
|
-
declarations: [CheckGateDirective],
|
|
31
|
-
exports: [CheckGateDirective],
|
|
32
|
-
providers: [],
|
|
33
|
-
})
|
|
34
|
-
export class StatsigModule {}
|
package/src/statsig.service.ts
DELETED
|
@@ -1,210 +0,0 @@
|
|
|
1
|
-
import { Inject, Injectable, OnDestroy } from '@angular/core';
|
|
2
|
-
import { BehaviorSubject, Observable } from 'rxjs';
|
|
3
|
-
|
|
4
|
-
import {
|
|
5
|
-
DataAdapterAsyncOptions,
|
|
6
|
-
DataAdapterSyncOptions,
|
|
7
|
-
DynamicConfig,
|
|
8
|
-
DynamicConfigEvaluationOptions,
|
|
9
|
-
Experiment,
|
|
10
|
-
ExperimentEvaluationOptions,
|
|
11
|
-
FeatureGateEvaluationOptions,
|
|
12
|
-
Layer,
|
|
13
|
-
LayerEvaluationOptions,
|
|
14
|
-
Log,
|
|
15
|
-
SDKType,
|
|
16
|
-
StatsigEvent,
|
|
17
|
-
StatsigUser,
|
|
18
|
-
} from '@statsig/client-core';
|
|
19
|
-
import { StatsigClient } from '@statsig/js-client';
|
|
20
|
-
|
|
21
|
-
import { Memoize } from './memoizeDecorator';
|
|
22
|
-
import { STATSIG_INIT_CONFIG, StatsigInitConfig } from './statsig.module';
|
|
23
|
-
|
|
24
|
-
@Injectable({
|
|
25
|
-
providedIn: 'root',
|
|
26
|
-
})
|
|
27
|
-
export class StatsigService implements OnDestroy {
|
|
28
|
-
private _renderVersion = 0;
|
|
29
|
-
private _client: StatsigClient;
|
|
30
|
-
|
|
31
|
-
private _isLoadingSubject = new BehaviorSubject<boolean>(true);
|
|
32
|
-
isLoading$: Observable<boolean> = this._isLoadingSubject.asObservable();
|
|
33
|
-
|
|
34
|
-
constructor(
|
|
35
|
-
@Inject(STATSIG_INIT_CONFIG) provider: StatsigInitConfig<StatsigClient>,
|
|
36
|
-
) {
|
|
37
|
-
if ('client' in provider) {
|
|
38
|
-
this._client = provider.client;
|
|
39
|
-
} else if ('sdkKey' in provider && 'user' in provider) {
|
|
40
|
-
this._client = new StatsigClient(
|
|
41
|
-
provider.sdkKey,
|
|
42
|
-
provider.user,
|
|
43
|
-
provider.options,
|
|
44
|
-
);
|
|
45
|
-
this._client
|
|
46
|
-
.initializeAsync()
|
|
47
|
-
.catch((error) => {
|
|
48
|
-
Log.error('Error initializing StatsigClient', error);
|
|
49
|
-
})
|
|
50
|
-
.finally(() => {
|
|
51
|
-
this._isLoadingSubject.next(false);
|
|
52
|
-
});
|
|
53
|
-
} else {
|
|
54
|
-
Log.error(
|
|
55
|
-
'Must provide a client or sdkKey and user to initialize StatsigService',
|
|
56
|
-
);
|
|
57
|
-
this._client = new StatsigClient('', {});
|
|
58
|
-
}
|
|
59
|
-
Log.debug('StatsigService created', this._client);
|
|
60
|
-
this._checkAndEmitLoadingStatus();
|
|
61
|
-
this._client.$on('values_updated', this._onValuesUpdated);
|
|
62
|
-
|
|
63
|
-
SDKType._setBindingType('angular');
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
ngOnDestroy(): void {
|
|
67
|
-
this._client.shutdown().catch((error) => {
|
|
68
|
-
Log.error('An error occured during shutdown', error);
|
|
69
|
-
});
|
|
70
|
-
this._client.off('values_updated', this._onValuesUpdated);
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
checkGate(gateName: string, options?: FeatureGateEvaluationOptions): boolean {
|
|
74
|
-
Log.debug(`checkGate caled for ${gateName}, rv: ${this._renderVersion}`);
|
|
75
|
-
|
|
76
|
-
return this._checkGateImpl(this._renderVersion, gateName, options);
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
getDynamicConfig(
|
|
80
|
-
configName: string,
|
|
81
|
-
options?: DynamicConfigEvaluationOptions,
|
|
82
|
-
): DynamicConfig {
|
|
83
|
-
Log.debug(
|
|
84
|
-
`getDynamicConfig called for ${configName}, rv: ${this._renderVersion}`,
|
|
85
|
-
);
|
|
86
|
-
|
|
87
|
-
return this._getDynamicConfigImpl(this._renderVersion, configName, options);
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
getExperiment(
|
|
91
|
-
experimentName: string,
|
|
92
|
-
options?: ExperimentEvaluationOptions,
|
|
93
|
-
): Experiment {
|
|
94
|
-
Log.debug(
|
|
95
|
-
`getExperiment caled for ${experimentName}, rv: ${this._renderVersion}`,
|
|
96
|
-
);
|
|
97
|
-
|
|
98
|
-
return this._getExperimentImpl(
|
|
99
|
-
this._renderVersion,
|
|
100
|
-
experimentName,
|
|
101
|
-
options,
|
|
102
|
-
);
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
getLayer(layerName: string, options?: LayerEvaluationOptions): Layer {
|
|
106
|
-
Log.debug(`getLayer caled for ${layerName}, rv: ${this._renderVersion}`);
|
|
107
|
-
|
|
108
|
-
return this._getLayerImpl(this._renderVersion, layerName, options);
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
logEvent(
|
|
112
|
-
eventName: StatsigEvent | string,
|
|
113
|
-
value?: string | number,
|
|
114
|
-
metadata?: Record<string, string>,
|
|
115
|
-
): void {
|
|
116
|
-
this._client.logEvent(eventName, value, metadata);
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
updateUserAsync(
|
|
120
|
-
user: StatsigUser,
|
|
121
|
-
options?: DataAdapterAsyncOptions,
|
|
122
|
-
): Promise<void> {
|
|
123
|
-
return this._client.updateUserAsync(user, options);
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
updateUserSync(user: StatsigUser, options?: DataAdapterSyncOptions): void {
|
|
127
|
-
this._client.updateUserSync(user, options);
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
getClient(): StatsigClient {
|
|
131
|
-
return this._client;
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
@Memoize((...args: unknown[]) => {
|
|
135
|
-
const [rv, gn, opt] = args as [
|
|
136
|
-
number,
|
|
137
|
-
string,
|
|
138
|
-
FeatureGateEvaluationOptions,
|
|
139
|
-
];
|
|
140
|
-
return `${rv}-${gn}-${JSON.stringify(opt)}`;
|
|
141
|
-
})
|
|
142
|
-
private _checkGateImpl(
|
|
143
|
-
_rv: number,
|
|
144
|
-
gateName: string,
|
|
145
|
-
options?: FeatureGateEvaluationOptions,
|
|
146
|
-
): boolean {
|
|
147
|
-
return this._client.checkGate(gateName, options);
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
@Memoize((...args: unknown[]) => {
|
|
151
|
-
const [rv, gn, opt] = args as [
|
|
152
|
-
number,
|
|
153
|
-
string,
|
|
154
|
-
DynamicConfigEvaluationOptions,
|
|
155
|
-
];
|
|
156
|
-
return `${rv}-${gn}-${JSON.stringify(opt)}`;
|
|
157
|
-
})
|
|
158
|
-
private _getDynamicConfigImpl(
|
|
159
|
-
_rv: number,
|
|
160
|
-
configName: string,
|
|
161
|
-
options?: DynamicConfigEvaluationOptions,
|
|
162
|
-
): DynamicConfig {
|
|
163
|
-
return this._client.getDynamicConfig(configName, options);
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
@Memoize((...args: unknown[]) => {
|
|
167
|
-
const [rv, en, opt] = args as [number, string, ExperimentEvaluationOptions];
|
|
168
|
-
return `${rv}-${en}-${JSON.stringify(opt)}`;
|
|
169
|
-
})
|
|
170
|
-
private _getExperimentImpl(
|
|
171
|
-
_rv: number,
|
|
172
|
-
experimentName: string,
|
|
173
|
-
options?: ExperimentEvaluationOptions,
|
|
174
|
-
): Experiment {
|
|
175
|
-
return this._client.getExperiment(experimentName, options);
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
@Memoize((...args: unknown[]) => {
|
|
179
|
-
const [rv, ln, opt] = args as [number, string, LayerEvaluationOptions];
|
|
180
|
-
return `${rv}-${ln}-${JSON.stringify(opt)}`;
|
|
181
|
-
})
|
|
182
|
-
private _getLayerImpl(
|
|
183
|
-
_rv: number,
|
|
184
|
-
layerName: string,
|
|
185
|
-
options?: LayerEvaluationOptions,
|
|
186
|
-
): Layer {
|
|
187
|
-
return this._client.getLayer(layerName, options);
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
private _checkAndEmitLoadingStatus(): void {
|
|
191
|
-
const isReady = _isReady(this._client);
|
|
192
|
-
if (isReady) {
|
|
193
|
-
this._isLoadingSubject.next(false);
|
|
194
|
-
Log.debug('Client is now ready, loading status set to false');
|
|
195
|
-
} else {
|
|
196
|
-
this._isLoadingSubject.next(true);
|
|
197
|
-
Log.debug('Client is not ready, loading status set to true');
|
|
198
|
-
}
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
private _onValuesUpdated = (): void => {
|
|
202
|
-
this._renderVersion++;
|
|
203
|
-
Log.debug('Values updated', this._renderVersion);
|
|
204
|
-
this._checkAndEmitLoadingStatus();
|
|
205
|
-
};
|
|
206
|
-
}
|
|
207
|
-
|
|
208
|
-
function _isReady(client: StatsigClient): boolean {
|
|
209
|
-
return client.loadingStatus === 'Ready';
|
|
210
|
-
}
|
package/src/test-setup.ts
DELETED
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import 'jest-preset-angular/setup-jest';
|
|
2
|
-
|
|
3
|
-
// @ts-expect-error https://thymikee.github.io/jest-preset-angular/docs/getting-started/test-environment
|
|
4
|
-
globalThis.ngJest = {
|
|
5
|
-
testEnvironmentOptions: {
|
|
6
|
-
errorOnUnknownElements: true,
|
|
7
|
-
errorOnUnknownProperties: true,
|
|
8
|
-
},
|
|
9
|
-
};
|
package/tsconfig.json
DELETED
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"extends": "../../tsconfig.base.json",
|
|
3
|
-
"compilerOptions": {
|
|
4
|
-
"jsx": "react-jsx",
|
|
5
|
-
"experimentalDecorators": true,
|
|
6
|
-
"emitDecoratorMetadata": true
|
|
7
|
-
},
|
|
8
|
-
"files": [],
|
|
9
|
-
"include": [],
|
|
10
|
-
"references": [
|
|
11
|
-
{
|
|
12
|
-
"path": "./tsconfig.lib.json"
|
|
13
|
-
},
|
|
14
|
-
{
|
|
15
|
-
"path": "./tsconfig.spec.json"
|
|
16
|
-
}
|
|
17
|
-
],
|
|
18
|
-
"angularCompilerOptions": {
|
|
19
|
-
"enableI18nLegacyMessageIdFormat": false,
|
|
20
|
-
"strictInjectionParameters": true,
|
|
21
|
-
"strictInputAccessModifiers": true,
|
|
22
|
-
"strictTemplates": true
|
|
23
|
-
}
|
|
24
|
-
}
|
package/tsconfig.lib.json
DELETED
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"extends": "./tsconfig.json",
|
|
3
|
-
"compilerOptions": {
|
|
4
|
-
"outDir": "../../dist/out-tsc",
|
|
5
|
-
"declaration": true,
|
|
6
|
-
"declarationMap": true,
|
|
7
|
-
"types": []
|
|
8
|
-
},
|
|
9
|
-
"exclude": [
|
|
10
|
-
"src/**/*.spec.ts",
|
|
11
|
-
"src/test-setup.ts",
|
|
12
|
-
"jest.config.ts",
|
|
13
|
-
"src/**/*.test.ts"
|
|
14
|
-
],
|
|
15
|
-
"include": ["src/**/*.ts"]
|
|
16
|
-
}
|
package/tsconfig.spec.json
DELETED
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"extends": "./tsconfig.json",
|
|
3
|
-
"compilerOptions": {
|
|
4
|
-
"outDir": "../../dist/out-tsc",
|
|
5
|
-
"module": "commonjs",
|
|
6
|
-
"target": "es2016",
|
|
7
|
-
"types": ["jest", "node"]
|
|
8
|
-
},
|
|
9
|
-
"files": ["src/test-setup.ts"],
|
|
10
|
-
"include": [
|
|
11
|
-
"jest.config.ts",
|
|
12
|
-
"src/**/*.test.ts",
|
|
13
|
-
"src/**/*.spec.ts",
|
|
14
|
-
"src/**/*.d.ts"
|
|
15
|
-
]
|
|
16
|
-
}
|