posthog-js 1.111.0 → 1.111.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/dist/array.full.js +1 -1
- package/dist/array.full.js.map +1 -1
- package/dist/array.js +1 -1
- package/dist/array.js.map +1 -1
- package/dist/es.js +1 -1
- package/dist/es.js.map +1 -1
- package/dist/lib/src/posthog-core.d.ts +1 -12
- package/dist/lib/src/types.d.ts +0 -5
- package/dist/lib/src/utils/request-router.d.ts +1 -0
- package/dist/module.d.ts +2 -17
- package/dist/module.js +1 -1
- package/dist/module.js.map +1 -1
- package/dist/recorder-v2.js.map +1 -1
- package/lib/package.json +1 -1
- package/lib/src/extensions/replay/config.js +2 -2
- package/lib/src/extensions/replay/config.js.map +1 -1
- package/lib/src/posthog-core.d.ts +1 -12
- package/lib/src/posthog-core.js +0 -35
- package/lib/src/posthog-core.js.map +1 -1
- package/lib/src/posthog-featureflags.js +2 -2
- package/lib/src/posthog-featureflags.js.map +1 -1
- package/lib/src/types.d.ts +0 -5
- package/lib/src/types.js.map +1 -1
- package/lib/src/utils/request-router.d.ts +1 -0
- package/lib/src/utils/request-router.js +13 -8
- package/lib/src/utils/request-router.js.map +1 -1
- package/package.json +1 -1
|
@@ -197,7 +197,7 @@ var PostHogFeatureFlags = /** @class */ (function () {
|
|
|
197
197
|
disable_flags: this.instance.config.advanced_disable_feature_flags || undefined,
|
|
198
198
|
});
|
|
199
199
|
var encoded_data = _base64Encode(json_data);
|
|
200
|
-
this.instance._send_request(this.instance.requestRouter.endpointFor('api', '/decide/?v=3'), { data: encoded_data }, { method: 'POST' },
|
|
200
|
+
this.instance._send_request(this.instance.requestRouter.endpointFor('api', '/decide/?v=3'), { data: encoded_data }, { method: 'POST' }, function (response) {
|
|
201
201
|
// reset anon_distinct_id after at least a single request with it
|
|
202
202
|
// makes it through
|
|
203
203
|
_this.$anon_distinct_id = undefined;
|
|
@@ -205,7 +205,7 @@ var PostHogFeatureFlags = /** @class */ (function () {
|
|
|
205
205
|
// :TRICKY: Reload - start another request if queued!
|
|
206
206
|
_this.setReloadingPaused(false);
|
|
207
207
|
_this._startReloadTimer();
|
|
208
|
-
})
|
|
208
|
+
});
|
|
209
209
|
};
|
|
210
210
|
/*
|
|
211
211
|
* Get feature flag's value for user.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"posthog-featureflags.js","sourceRoot":"","sources":["../../src/posthog-featureflags.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AAa1D,OAAO,EACH,iCAAiC,EACjC,qBAAqB,EACrB,2BAA2B,EAC3B,4BAA4B,EAC5B,kBAAkB,GACrB,MAAM,aAAa,CAAA;AAEpB,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAC7C,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAA;AAEvC,IAAM,gCAAgC,GAAG,uBAAuB,CAAA;AAChE,IAAM,kCAAkC,GAAG,yBAAyB,CAAA;AACpE,IAAM,iCAAiC,GAAG,wBAAwB,CAAA;AAElE,MAAM,CAAC,IAAM,wBAAwB,GAAG,UAAC,YAA+C;;IACpF,IAAM,kBAAkB,GAAqC,EAAE,CAAA;;QAC/D,KAA2B,IAAA,KAAA,SAAA,QAAQ,CAAC,YAAY,IAAI,EAAE,CAAC,CAAA,gBAAA,4BAAE;YAA9C,IAAA,KAAA,mBAAY,EAAX,GAAG,QAAA,EAAE,KAAK,QAAA;YAClB,IAAI,KAAK,EAAE;gBACP,kBAAkB,CAAC,GAAG,CAAC,GAAG,KAAK,CAAA;aAClC;SACJ;;;;;;;;;IACD,OAAO,kBAAkB,CAAA;AAC7B,CAAC,CAAA;AAED,MAAM,CAAC,IAAM,8BAA8B,GAAG,UAC1C,QAAiC,EACjC,WAA+B,EAC/B,YAAmD,EACnD,mBAAkD;;IADlD,6BAAA,EAAA,iBAAmD;IACnD,oCAAA,EAAA,wBAAkD;IAElD,IAAM,KAAK,GAAG,QAAQ,CAAC,cAAc,CAAC,CAAA;IACtC,IAAM,YAAY,GAAG,QAAQ,CAAC,qBAAqB,CAAC,CAAA;IACpD,IAAI,KAAK,EAAE;QACP,mBAAmB;QACnB,IAAI,QAAQ,CAAC,KAAK,CAAC,EAAE;YACjB,IAAM,sBAAsB,GAA4B,EAAE,CAAA;YAC1D,IAAI,KAAK,EAAE;gBACP,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;oBACnC,sBAAsB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAA;iBAC1C;aACJ;YACD,WAAW;gBACP,WAAW,CAAC,QAAQ;oBAChB,GAAC,gCAAgC,IAAG,KAAK;oBACzC,GAAC,qBAAqB,IAAG,sBAAsB;wBACjD,CAAA;SACT;aAAM;YACH,oBAAoB;YACpB,IAAI,eAAe,GAAG,KAAK,CAAA;YAC3B,IAAI,sBAAsB,GAAG,YAAY,CAAA;YACzC,IAAI,QAAQ,CAAC,yBAAyB,EAAE;gBACpC,4EAA4E;gBAC5E,eAAe,yBAAQ,YAAY,GAAK,eAAe,CAAE,CAAA;gBACzD,sBAAsB,yBAAQ,mBAAmB,GAAK,sBAAsB,CAAE,CAAA;aACjF;YACD,WAAW;gBACP,WAAW,CAAC,QAAQ;oBAChB,GAAC,gCAAgC,IAAG,MAAM,CAAC,IAAI,CAAC,wBAAwB,CAAC,eAAe,CAAC,CAAC;oBAC1F,GAAC,qBAAqB,IAAG,eAAe,IAAI,EAAE;oBAC9C,GAAC,iCAAiC,IAAG,sBAAsB,IAAI,EAAE;wBACnE,CAAA;SACT;KACJ;AACL,CAAC,CAAA;AAED;IAQI,6BAAY,QAAiB;QACzB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAA;QACxB,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAA;QAC9B,IAAI,CAAC,wBAAwB,GAAG,EAAE,CAAA;QAElC,IAAI,CAAC,wBAAwB,GAAG,KAAK,CAAA;QACrC,IAAI,CAAC,0BAA0B,GAAG,KAAK,CAAA;IAC3C,CAAC;IAED,sCAAQ,GAAR;QACI,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC,CAAA;IAC9C,CAAC;IAED,6CAAe,GAAf;QACI,IAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,qBAAqB,CAAC,CAAA;QACtE,IAAM,eAAe,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,kCAAkC,CAAC,CAAA;QACtF,IAAI,CAAC,eAAe,EAAE;YAClB,OAAO,YAAY,IAAI,EAAE,CAAA;SAC5B;QAED,IAAM,UAAU,GAAG,OAAO,CAAC,EAAE,EAAE,YAAY,CAAC,CAAA;QAC5C,IAAM,cAAc,GAAG,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAA;QACnD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,cAAc,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YAC5C,IAAI,eAAe,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,KAAK,KAAK,EAAE;gBAC9C,OAAO,UAAU,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAA;aACvC;iBAAM;gBACH,UAAU,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,GAAG,eAAe,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAA;aACrE;SACJ;QACD,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE;YACzB,MAAM,CAAC,IAAI,CAAC,4BAA4B,EAAE;gBACtC,YAAY,cAAA;gBACZ,eAAe,iBAAA;gBACf,UAAU,YAAA;aACb,CAAC,CAAA;YACF,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAA;SAChC;QACD,OAAO,UAAU,CAAA;IACrB,CAAC;IAED,6CAAe,GAAf;QACI,IAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,iCAAiC,CAAC,CAAA;QAClF,OAAO,YAAY,IAAI,EAAE,CAAA;IAC7B,CAAC;IAED;;;;;;;;OAQG;IACH,gDAAkB,GAAlB;QACI,IAAI,CAAC,IAAI,CAAC,wBAAwB,EAAE;YAChC,IAAI,CAAC,wBAAwB,GAAG,IAAI,CAAA;YACpC,IAAI,CAAC,iBAAiB,EAAE,CAAA;SAC3B;IACL,CAAC;IAED,oDAAsB,GAAtB,UAAuB,gBAAwB;QAC3C,IAAI,CAAC,iBAAiB,GAAG,gBAAgB,CAAA;IAC7C,CAAC;IAED,gDAAkB,GAAlB,UAAmB,QAAiB;QAChC,IAAI,CAAC,0BAA0B,GAAG,QAAQ,CAAA;IAC9C,CAAC;IAED,+CAAiB,GAAjB;QACI,IAAI,CAAC,wBAAwB,GAAG,KAAK,CAAA;IACzC,CAAC;IAED,+CAAiB,GAAjB;QAAA,iBASC;QARG,IAAI,IAAI,CAAC,wBAAwB,IAAI,CAAC,IAAI,CAAC,0BAA0B,EAAE;YACnE,UAAU,CAAC;gBACP,IAAI,CAAC,KAAI,CAAC,0BAA0B,IAAI,KAAI,CAAC,wBAAwB,EAAE;oBACnE,KAAI,CAAC,wBAAwB,GAAG,KAAK,CAAA;oBACrC,KAAI,CAAC,0BAA0B,EAAE,CAAA;iBACpC;YACL,CAAC,EAAE,CAAC,CAAC,CAAA;SACR;IACL,CAAC;IAED,wDAA0B,GAA1B;QAAA,iBAmCC;QAlCG,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,8BAA8B,EAAE;YACrD,OAAM;SACT;QAED,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAA;QAC7B,IAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAA;QACxC,IAAM,gBAAgB,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,4BAA4B,CAAC,CAAA;QACjF,IAAM,eAAe,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,2BAA2B,CAAC,CAAA;QAC/E,IAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;YAC7B,KAAK,EAAE,KAAK;YACZ,WAAW,EAAE,IAAI,CAAC,QAAQ,CAAC,eAAe,EAAE;YAC5C,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE;YACjC,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;YACzC,iBAAiB,EAAE,gBAAgB;YACnC,gBAAgB,EAAE,eAAe;YACjC,aAAa,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,8BAA8B,IAAI,SAAS;SAClF,CAAC,CAAA;QAEF,IAAM,YAAY,GAAG,aAAa,CAAC,SAAS,CAAC,CAAA;QAC7C,IAAI,CAAC,QAAQ,CAAC,aAAa,CACvB,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,WAAW,CAAC,KAAK,EAAE,cAAc,CAAC,EAC9D,EAAE,IAAI,EAAE,YAAY,EAAE,EACtB,EAAE,MAAM,EAAE,MAAM,EAAE,EAClB,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAC,UAAC,QAAQ;YACrC,iEAAiE;YACjE,mBAAmB;YACnB,KAAI,CAAC,iBAAiB,GAAG,SAAS,CAAA;YAClC,KAAI,CAAC,oBAAoB,CAAC,QAA0B,CAAC,CAAA;YAErD,qDAAqD;YACrD,KAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAA;YAC9B,KAAI,CAAC,iBAAiB,EAAE,CAAA;QAC5B,CAAC,CAAoB,CACxB,CAAA;IACL,CAAC;IAED;;;;;;;;;OASG;IACH,4CAAc,GAAd,UAAe,GAAW,EAAE,OAAsC;;;QAAtC,wBAAA,EAAA,YAAsC;QAC9D,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,oBAAoB,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE;YACzF,MAAM,CAAC,IAAI,CAAC,0BAA0B,GAAG,GAAG,GAAG,+CAA+C,CAAC,CAAA;YAC/F,OAAO,SAAS,CAAA;SACnB;QACD,IAAM,SAAS,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC,GAAG,CAAC,CAAA;QAC7C,IAAM,eAAe,GAAG,UAAG,SAAS,CAAE,CAAA;QACtC,IAAM,gBAAgB,GAA6B,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,kBAAkB,CAAC,IAAI,EAAE,CAAA;QAEvG,IAAI,OAAO,CAAC,UAAU,IAAI,CAAC,CAAC,YAAY,IAAI,OAAO,CAAC,EAAE;YAClD,IAAI,CAAC,CAAC,GAAG,IAAI,gBAAgB,CAAC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE;gBAChF,IAAI,QAAQ,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,EAAE;oBACjC,gBAAgB,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAA;iBAC9C;qBAAM;oBACH,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC,eAAe,CAAC,CAAA;iBAC5C;gBACD,MAAA,IAAI,CAAC,QAAQ,CAAC,WAAW,0CAAE,QAAQ,WAAG,GAAC,kBAAkB,IAAG,gBAAgB,MAAG,CAAA;gBAE/E,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,sBAAsB,EAAE,EAAE,aAAa,EAAE,GAAG,EAAE,sBAAsB,EAAE,SAAS,EAAE,CAAC,CAAA;aAC3G;SACJ;QACD,OAAO,SAAS,CAAA;IACpB,CAAC;IAED,mDAAqB,GAArB,UAAsB,GAAW;QAC7B,IAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,EAAE,CAAA;QACvC,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAA;IACxB,CAAC;IAED;;;;;;;;;OASG;IACH,8CAAgB,GAAhB,UAAiB,GAAW,EAAE,OAAsC;QAAtC,wBAAA,EAAA,YAAsC;QAChE,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,oBAAoB,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE;YACzF,MAAM,CAAC,IAAI,CAAC,4BAA4B,GAAG,GAAG,GAAG,+CAA+C,CAAC,CAAA;YACjG,OAAO,SAAS,CAAA;SACnB;QACD,OAAO,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE,OAAO,CAAC,CAAA;IAC9C,CAAC;IAED,oDAAsB,GAAtB,UAAuB,OAA6B;QAChD,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IAC/C,CAAC;IAED,uDAAyB,GAAzB,UAA0B,OAA6B;QACnD,IAAI,CAAC,wBAAwB,GAAG,IAAI,CAAC,wBAAwB,CAAC,MAAM,CAAC,UAAC,CAAC,IAAK,OAAA,CAAC,KAAK,OAAO,EAAb,CAAa,CAAC,CAAA;IAC9F,CAAC;IAED,kDAAoB,GAApB,UAAqB,QAAiC;QAClD,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE;YAC5B,OAAM;SACT;QACD,IAAI,CAAC,QAAQ,CAAC,oBAAoB,GAAG,IAAI,CAAA;QACzC,IAAM,YAAY,GAAG,IAAI,CAAC,eAAe,EAAE,CAAA;QAC3C,IAAM,mBAAmB,GAAG,IAAI,CAAC,eAAe,EAAE,CAAA;QAClD,8BAA8B,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,YAAY,EAAE,mBAAmB,CAAC,CAAA;QACtG,IAAI,CAAC,0BAA0B,EAAE,CAAA;IACrC,CAAC;IAED;;;;;;;;;;OAUG;IACH,sCAAQ,GAAR,UAAS,KAA4D;;QACjE,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE;YACvD,OAAO,MAAM,CAAC,oBAAoB,CAAC,gCAAgC,CAAC,CAAA;SACvE;QAED,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAA;QAE9B,IAAI,KAAK,KAAK,KAAK,EAAE;YACjB,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,UAAU,CAAC,kCAAkC,CAAC,CAAA;SAC3E;aAAM,IAAI,QAAQ,CAAC,KAAK,CAAC,EAAE;YACxB,IAAM,QAAQ,GAAqC,EAAE,CAAA;YACrD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;gBACnC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAA;aAC5B;YACD,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,QAAQ,WAAG,GAAC,kCAAkC,IAAG,QAAQ,MAAG,CAAA;SACzF;aAAM;YACH,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,QAAQ,WAAG,GAAC,kCAAkC,IAAG,KAAK,MAAG,CAAA;SACtF;IACL,CAAC;IACD;;;;;;;;;;;OAWG;IACH,4CAAc,GAAd,UAAe,QAA8B;QAA7C,iBAOC;QANG,IAAI,CAAC,sBAAsB,CAAC,QAAQ,CAAC,CAAA;QACrC,IAAI,IAAI,CAAC,QAAQ,CAAC,oBAAoB,EAAE;YAC9B,IAAA,KAA0B,IAAI,CAAC,gCAAgC,EAAE,EAA/D,KAAK,WAAA,EAAE,YAAY,kBAA4C,CAAA;YACvE,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC,CAAA;SAChC;QACD,OAAO,cAAM,OAAA,KAAI,CAAC,yBAAyB,CAAC,QAAQ,CAAC,EAAxC,CAAwC,CAAA;IACzD,CAAC;IAED,gEAAkC,GAAlC,UAAmC,GAAW,EAAE,UAAmB;;;QAC/D,IAAM,oBAAoB;YACtB,GAAC,8BAAuB,GAAG,CAAE,IAAG,UAAU;eAC7C,CAAA;QACD,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,4BAA4B,EAAE;YAChD,aAAa,EAAE,GAAG;YAClB,mBAAmB,EAAE,UAAU;YAC/B,IAAI,EAAE,oBAAoB;SAC7B,CAAC,CAAA;QACF,IAAI,CAAC,2BAA2B,CAAC,oBAAoB,EAAE,KAAK,CAAC,CAAA;QAE7D,IAAM,QAAQ,yBAAQ,IAAI,CAAC,eAAe,EAAE,gBAAG,GAAG,IAAG,UAAU,MAAE,CAAA;QACjE,MAAA,IAAI,CAAC,QAAQ,CAAC,WAAW,0CAAE,QAAQ;YAC/B,GAAC,gCAAgC,IAAG,MAAM,CAAC,IAAI,CAAC,wBAAwB,CAAC,QAAQ,CAAC,CAAC;YACnF,GAAC,qBAAqB,IAAG,QAAQ;gBACnC,CAAA;QACF,IAAI,CAAC,0BAA0B,EAAE,CAAA;IACrC,CAAC;IAED,oDAAsB,GAAtB,UAAuB,QAAoC,EAAE,YAAoB;QAAjF,iBAoBC;QApB4D,6BAAA,EAAA,oBAAoB;QAC7E,IAAM,8BAA8B,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,iCAAiC,CAAC,CAAA;QAEpG,IAAI,CAAC,8BAA8B,IAAI,YAAY,EAAE;YACjD,IAAI,CAAC,QAAQ,CAAC,aAAa,CACvB,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,WAAW,CACnC,KAAK,EACL,4CAAqC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAE,CACpE,EACD,EAAE,EACF,EAAE,MAAM,EAAE,KAAK,EAAE,EACjB,UAAC,QAAQ;;;gBACL,IAAM,mBAAmB,GAAI,QAAuC,CAAC,mBAAmB,CAAA;gBACxF,MAAA,KAAI,CAAC,QAAQ,CAAC,WAAW,0CAAE,QAAQ,WAAG,GAAC,iCAAiC,IAAG,mBAAmB,MAAG,CAAA;gBACjG,OAAO,QAAQ,CAAC,mBAAmB,CAAC,CAAA;YACxC,CAAC,CACJ,CAAA;SACJ;aAAM;YACH,OAAO,QAAQ,CAAC,8BAA8B,CAAC,CAAA;SAClD;IACL,CAAC;IAED,8DAAgC,GAAhC;QACI,IAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAA;QAC7B,IAAM,YAAY,GAAG,IAAI,CAAC,eAAe,EAAE,CAAA;QAE3C,gBAAgB;QAChB,IAAM,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC,UAAC,IAAI,IAAK,OAAA,YAAY,CAAC,IAAI,CAAC,EAAlB,CAAkB,CAAC,CAAA;QAC9D,IAAM,kBAAkB,GAAG,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC;aAC/C,MAAM,CAAC,UAAC,UAAU,IAAK,OAAA,YAAY,CAAC,UAAU,CAAC,EAAxB,CAAwB,CAAC;aAChD,MAAM,CAAC,UAAC,GAAqC,EAAE,GAAG;YAC/C,GAAG,CAAC,GAAG,CAAC,GAAG,YAAY,CAAC,GAAG,CAAC,CAAA;YAC5B,OAAO,GAAG,CAAA;QACd,CAAC,EAAE,EAAE,CAAC,CAAA;QAEV,OAAO;YACH,KAAK,EAAE,WAAW;YAClB,YAAY,EAAE,kBAAkB;SACnC,CAAA;IACL,CAAC;IAED,wDAA0B,GAA1B;QACU,IAAA,KAA0B,IAAI,CAAC,gCAAgC,EAAE,EAA/D,KAAK,WAAA,EAAE,YAAY,kBAA4C,CAAA;QACvE,IAAI,CAAC,wBAAwB,CAAC,OAAO,CAAC,UAAC,OAAO,IAAK,OAAA,OAAO,CAAC,KAAK,EAAE,YAAY,CAAC,EAA5B,CAA4B,CAAC,CAAA;IACpF,CAAC;IAED;;;;OAIG;IACH,yDAA2B,GAA3B,UAA4B,UAAsB,EAAE,kBAAyB;;QAAzB,mCAAA,EAAA,yBAAyB;QACzE,kCAAkC;QAClC,IAAM,kBAAkB,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,4BAA4B,CAAC,IAAI,EAAE,CAAA;QAEzF,IAAI,CAAC,QAAQ,CAAC,QAAQ;YAClB,GAAC,4BAA4B,0BACtB,kBAAkB,GAClB,UAAU,CAChB;gBACH,CAAA;QAEF,IAAI,kBAAkB,EAAE;YACpB,IAAI,CAAC,QAAQ,CAAC,kBAAkB,EAAE,CAAA;SACrC;IACL,CAAC;IAED,2DAA6B,GAA7B;QACI,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,4BAA4B,CAAC,CAAA;IAC1D,CAAC;IAED;;;;;;;OAOG;IACH,wDAA0B,GAA1B,UAA2B,UAA0C,EAAE,kBAAyB;;QAAzB,mCAAA,EAAA,yBAAyB;QAC5F,iCAAiC;QACjC,IAAM,kBAAkB,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,2BAA2B,CAAC,IAAI,EAAE,CAAA;QAExF,IAAI,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE;YAC9C,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,OAAO,CAAC,UAAC,SAAS;gBAC9C,kBAAkB,CAAC,SAAS,CAAC,yBACtB,kBAAkB,CAAC,SAAS,CAAC,GAC7B,UAAU,CAAC,SAAS,CAAC,CAC3B,CAAA;gBACD,OAAO,UAAU,CAAC,SAAS,CAAC,CAAA;YAChC,CAAC,CAAC,CAAA;SACL;QAED,IAAI,CAAC,QAAQ,CAAC,QAAQ;YAClB,GAAC,2BAA2B,0BACrB,kBAAkB,GAClB,UAAU,CAChB;gBACH,CAAA;QAEF,IAAI,kBAAkB,EAAE;YACpB,IAAI,CAAC,QAAQ,CAAC,kBAAkB,EAAE,CAAA;SACrC;IACL,CAAC;IAED,0DAA4B,GAA5B,UAA6B,UAAmB;;QAC5C,IAAI,UAAU,EAAE;YACZ,IAAM,kBAAkB,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,2BAA2B,CAAC,IAAI,EAAE,CAAA;YACxF,IAAI,CAAC,QAAQ,CAAC,QAAQ;gBAClB,GAAC,2BAA2B,0BAAQ,kBAAkB,gBAAG,UAAU,IAAG,EAAE,MAAE;oBAC5E,CAAA;SACL;aAAM;YACH,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,2BAA2B,CAAC,CAAA;SACxD;IACL,CAAC;IACL,0BAAC;AAAD,CAAC,AAtYD,IAsYC","sourcesContent":["import { _base64Encode, _entries, _extend } from './utils'\nimport { PostHog } from './posthog-core'\nimport {\n DecideResponse,\n FeatureFlagsCallback,\n EarlyAccessFeatureCallback,\n EarlyAccessFeatureResponse,\n Properties,\n JsonType,\n RequestCallback,\n} from './types'\nimport { PostHogPersistence } from './posthog-persistence'\n\nimport {\n PERSISTENCE_EARLY_ACCESS_FEATURES,\n ENABLED_FEATURE_FLAGS,\n STORED_GROUP_PROPERTIES_KEY,\n STORED_PERSON_PROPERTIES_KEY,\n FLAG_CALL_REPORTED,\n} from './constants'\n\nimport { _isArray } from './utils/type-utils'\nimport { logger } from './utils/logger'\n\nconst PERSISTENCE_ACTIVE_FEATURE_FLAGS = '$active_feature_flags'\nconst PERSISTENCE_OVERRIDE_FEATURE_FLAGS = '$override_feature_flags'\nconst PERSISTENCE_FEATURE_FLAG_PAYLOADS = '$feature_flag_payloads'\n\nexport const filterActiveFeatureFlags = (featureFlags?: Record<string, string | boolean>) => {\n const activeFeatureFlags: Record<string, string | boolean> = {}\n for (const [key, value] of _entries(featureFlags || {})) {\n if (value) {\n activeFeatureFlags[key] = value\n }\n }\n return activeFeatureFlags\n}\n\nexport const parseFeatureFlagDecideResponse = (\n response: Partial<DecideResponse>,\n persistence: PostHogPersistence,\n currentFlags: Record<string, string | boolean> = {},\n currentFlagPayloads: Record<string, JsonType> = {}\n) => {\n const flags = response['featureFlags']\n const flagPayloads = response['featureFlagPayloads']\n if (flags) {\n // using the v1 api\n if (_isArray(flags)) {\n const $enabled_feature_flags: Record<string, boolean> = {}\n if (flags) {\n for (let i = 0; i < flags.length; i++) {\n $enabled_feature_flags[flags[i]] = true\n }\n }\n persistence &&\n persistence.register({\n [PERSISTENCE_ACTIVE_FEATURE_FLAGS]: flags,\n [ENABLED_FEATURE_FLAGS]: $enabled_feature_flags,\n })\n } else {\n // using the v2+ api\n let newFeatureFlags = flags\n let newFeatureFlagPayloads = flagPayloads\n if (response.errorsWhileComputingFlags) {\n // if not all flags were computed, we upsert flags instead of replacing them\n newFeatureFlags = { ...currentFlags, ...newFeatureFlags }\n newFeatureFlagPayloads = { ...currentFlagPayloads, ...newFeatureFlagPayloads }\n }\n persistence &&\n persistence.register({\n [PERSISTENCE_ACTIVE_FEATURE_FLAGS]: Object.keys(filterActiveFeatureFlags(newFeatureFlags)),\n [ENABLED_FEATURE_FLAGS]: newFeatureFlags || {},\n [PERSISTENCE_FEATURE_FLAG_PAYLOADS]: newFeatureFlagPayloads || {},\n })\n }\n }\n}\n\nexport class PostHogFeatureFlags {\n instance: PostHog\n _override_warning: boolean\n featureFlagEventHandlers: FeatureFlagsCallback[]\n reloadFeatureFlagsQueued: boolean\n reloadFeatureFlagsInAction: boolean\n $anon_distinct_id: string | undefined\n\n constructor(instance: PostHog) {\n this.instance = instance\n this._override_warning = false\n this.featureFlagEventHandlers = []\n\n this.reloadFeatureFlagsQueued = false\n this.reloadFeatureFlagsInAction = false\n }\n\n getFlags(): string[] {\n return Object.keys(this.getFlagVariants())\n }\n\n getFlagVariants(): Record<string, string | boolean> {\n const enabledFlags = this.instance.get_property(ENABLED_FEATURE_FLAGS)\n const overriddenFlags = this.instance.get_property(PERSISTENCE_OVERRIDE_FEATURE_FLAGS)\n if (!overriddenFlags) {\n return enabledFlags || {}\n }\n\n const finalFlags = _extend({}, enabledFlags)\n const overriddenKeys = Object.keys(overriddenFlags)\n for (let i = 0; i < overriddenKeys.length; i++) {\n if (overriddenFlags[overriddenKeys[i]] === false) {\n delete finalFlags[overriddenKeys[i]]\n } else {\n finalFlags[overriddenKeys[i]] = overriddenFlags[overriddenKeys[i]]\n }\n }\n if (!this._override_warning) {\n logger.warn(' Overriding feature flags!', {\n enabledFlags,\n overriddenFlags,\n finalFlags,\n })\n this._override_warning = true\n }\n return finalFlags\n }\n\n getFlagPayloads(): Record<string, JsonType> {\n const flagPayloads = this.instance.get_property(PERSISTENCE_FEATURE_FLAG_PAYLOADS)\n return flagPayloads || {}\n }\n\n /**\n * Reloads feature flags asynchronously.\n *\n * Constraints:\n *\n * 1. Avoid parallel requests\n * 2. Delay a few milliseconds after each reloadFeatureFlags call to batch subsequent changes together\n * 3. Don't call this during initial load (as /decide will be called instead), see posthog-core.js\n */\n reloadFeatureFlags(): void {\n if (!this.reloadFeatureFlagsQueued) {\n this.reloadFeatureFlagsQueued = true\n this._startReloadTimer()\n }\n }\n\n setAnonymousDistinctId(anon_distinct_id: string): void {\n this.$anon_distinct_id = anon_distinct_id\n }\n\n setReloadingPaused(isPaused: boolean): void {\n this.reloadFeatureFlagsInAction = isPaused\n }\n\n resetRequestQueue(): void {\n this.reloadFeatureFlagsQueued = false\n }\n\n _startReloadTimer(): void {\n if (this.reloadFeatureFlagsQueued && !this.reloadFeatureFlagsInAction) {\n setTimeout(() => {\n if (!this.reloadFeatureFlagsInAction && this.reloadFeatureFlagsQueued) {\n this.reloadFeatureFlagsQueued = false\n this._reloadFeatureFlagsRequest()\n }\n }, 5)\n }\n }\n\n _reloadFeatureFlagsRequest(): void {\n if (this.instance.config.advanced_disable_feature_flags) {\n return\n }\n\n this.setReloadingPaused(true)\n const token = this.instance.config.token\n const personProperties = this.instance.get_property(STORED_PERSON_PROPERTIES_KEY)\n const groupProperties = this.instance.get_property(STORED_GROUP_PROPERTIES_KEY)\n const json_data = JSON.stringify({\n token: token,\n distinct_id: this.instance.get_distinct_id(),\n groups: this.instance.getGroups(),\n $anon_distinct_id: this.$anon_distinct_id,\n person_properties: personProperties,\n group_properties: groupProperties,\n disable_flags: this.instance.config.advanced_disable_feature_flags || undefined,\n })\n\n const encoded_data = _base64Encode(json_data)\n this.instance._send_request(\n this.instance.requestRouter.endpointFor('api', '/decide/?v=3'),\n { data: encoded_data },\n { method: 'POST' },\n this.instance._prepare_callback((response) => {\n // reset anon_distinct_id after at least a single request with it\n // makes it through\n this.$anon_distinct_id = undefined\n this.receivedFeatureFlags(response as DecideResponse)\n\n // :TRICKY: Reload - start another request if queued!\n this.setReloadingPaused(false)\n this._startReloadTimer()\n }) as RequestCallback\n )\n }\n\n /*\n * Get feature flag's value for user.\n *\n * ### Usage:\n *\n * if(posthog.getFeatureFlag('my-flag') === 'some-variant') { // do something }\n *\n * @param {Object|String} key Key of the feature flag.\n * @param {Object|String} options (optional) If {send_event: false}, we won't send an $feature_flag_call event to PostHog.\n */\n getFeatureFlag(key: string, options: { send_event?: boolean } = {}): boolean | string | undefined {\n if (!this.instance.decideEndpointWasHit && !(this.getFlags() && this.getFlags().length > 0)) {\n logger.warn('getFeatureFlag for key \"' + key + '\" failed. Feature flags didn\\'t load in time.')\n return undefined\n }\n const flagValue = this.getFlagVariants()[key]\n const flagReportValue = `${flagValue}`\n const flagCallReported: Record<string, string[]> = this.instance.get_property(FLAG_CALL_REPORTED) || {}\n\n if (options.send_event || !('send_event' in options)) {\n if (!(key in flagCallReported) || !flagCallReported[key].includes(flagReportValue)) {\n if (_isArray(flagCallReported[key])) {\n flagCallReported[key].push(flagReportValue)\n } else {\n flagCallReported[key] = [flagReportValue]\n }\n this.instance.persistence?.register({ [FLAG_CALL_REPORTED]: flagCallReported })\n\n this.instance.capture('$feature_flag_called', { $feature_flag: key, $feature_flag_response: flagValue })\n }\n }\n return flagValue\n }\n\n getFeatureFlagPayload(key: string): JsonType {\n const payloads = this.getFlagPayloads()\n return payloads[key]\n }\n\n /*\n * See if feature flag is enabled for user.\n *\n * ### Usage:\n *\n * if(posthog.isFeatureEnabled('beta-feature')) { // do something }\n *\n * @param {Object|String} key Key of the feature flag.\n * @param {Object|String} options (optional) If {send_event: false}, we won't send an $feature_flag_call event to PostHog.\n */\n isFeatureEnabled(key: string, options: { send_event?: boolean } = {}): boolean | undefined {\n if (!this.instance.decideEndpointWasHit && !(this.getFlags() && this.getFlags().length > 0)) {\n logger.warn('isFeatureEnabled for key \"' + key + '\" failed. Feature flags didn\\'t load in time.')\n return undefined\n }\n return !!this.getFeatureFlag(key, options)\n }\n\n addFeatureFlagsHandler(handler: FeatureFlagsCallback): void {\n this.featureFlagEventHandlers.push(handler)\n }\n\n removeFeatureFlagsHandler(handler: FeatureFlagsCallback): void {\n this.featureFlagEventHandlers = this.featureFlagEventHandlers.filter((h) => h !== handler)\n }\n\n receivedFeatureFlags(response: Partial<DecideResponse>): void {\n if (!this.instance.persistence) {\n return\n }\n this.instance.decideEndpointWasHit = true\n const currentFlags = this.getFlagVariants()\n const currentFlagPayloads = this.getFlagPayloads()\n parseFeatureFlagDecideResponse(response, this.instance.persistence, currentFlags, currentFlagPayloads)\n this._fireFeatureFlagsCallbacks()\n }\n\n /*\n * Override feature flags for debugging.\n *\n * ### Usage:\n *\n * - posthog.feature_flags.override(false)\n * - posthog.feature_flags.override(['beta-feature'])\n * - posthog.feature_flags.override({'beta-feature': 'variant', 'other-feature': True})\n *\n * @param {Object|Array|String} flags Flags to override with.\n */\n override(flags: boolean | string[] | Record<string, string | boolean>): void {\n if (!this.instance.__loaded || !this.instance.persistence) {\n return logger.uninitializedWarning('posthog.feature_flags.override')\n }\n\n this._override_warning = false\n\n if (flags === false) {\n this.instance.persistence.unregister(PERSISTENCE_OVERRIDE_FEATURE_FLAGS)\n } else if (_isArray(flags)) {\n const flagsObj: Record<string, string | boolean> = {}\n for (let i = 0; i < flags.length; i++) {\n flagsObj[flags[i]] = true\n }\n this.instance.persistence.register({ [PERSISTENCE_OVERRIDE_FEATURE_FLAGS]: flagsObj })\n } else {\n this.instance.persistence.register({ [PERSISTENCE_OVERRIDE_FEATURE_FLAGS]: flags })\n }\n }\n /*\n * Register an event listener that runs when feature flags become available or when they change.\n * If there are flags, the listener is called immediately in addition to being called on future changes.\n *\n * ### Usage:\n *\n * posthog.onFeatureFlags(function(featureFlags) { // do something })\n *\n * @param {Function} [callback] The callback function will be called once the feature flags are ready or when they are updated.\n * It'll return a list of feature flags enabled for the user.\n * @returns {Function} A function that can be called to unsubscribe the listener. Used by useEffect when the component unmounts.\n */\n onFeatureFlags(callback: FeatureFlagsCallback): () => void {\n this.addFeatureFlagsHandler(callback)\n if (this.instance.decideEndpointWasHit) {\n const { flags, flagVariants } = this._prepareFeatureFlagsForCallbacks()\n callback(flags, flagVariants)\n }\n return () => this.removeFeatureFlagsHandler(callback)\n }\n\n updateEarlyAccessFeatureEnrollment(key: string, isEnrolled: boolean): void {\n const enrollmentPersonProp = {\n [`$feature_enrollment/${key}`]: isEnrolled,\n }\n this.instance.capture('$feature_enrollment_update', {\n $feature_flag: key,\n $feature_enrollment: isEnrolled,\n $set: enrollmentPersonProp,\n })\n this.setPersonPropertiesForFlags(enrollmentPersonProp, false)\n\n const newFlags = { ...this.getFlagVariants(), [key]: isEnrolled }\n this.instance.persistence?.register({\n [PERSISTENCE_ACTIVE_FEATURE_FLAGS]: Object.keys(filterActiveFeatureFlags(newFlags)),\n [ENABLED_FEATURE_FLAGS]: newFlags,\n })\n this._fireFeatureFlagsCallbacks()\n }\n\n getEarlyAccessFeatures(callback: EarlyAccessFeatureCallback, force_reload = false): void {\n const existing_early_access_features = this.instance.get_property(PERSISTENCE_EARLY_ACCESS_FEATURES)\n\n if (!existing_early_access_features || force_reload) {\n this.instance._send_request(\n this.instance.requestRouter.endpointFor(\n 'api',\n `/api/early_access_features/?token=${this.instance.config.token}`\n ),\n {},\n { method: 'GET' },\n (response) => {\n const earlyAccessFeatures = (response as EarlyAccessFeatureResponse).earlyAccessFeatures\n this.instance.persistence?.register({ [PERSISTENCE_EARLY_ACCESS_FEATURES]: earlyAccessFeatures })\n return callback(earlyAccessFeatures)\n }\n )\n } else {\n return callback(existing_early_access_features)\n }\n }\n\n _prepareFeatureFlagsForCallbacks(): { flags: string[]; flagVariants: Record<string, string | boolean> } {\n const flags = this.getFlags()\n const flagVariants = this.getFlagVariants()\n\n // Return truthy\n const truthyFlags = flags.filter((flag) => flagVariants[flag])\n const truthyFlagVariants = Object.keys(flagVariants)\n .filter((variantKey) => flagVariants[variantKey])\n .reduce((res: Record<string, string | boolean>, key) => {\n res[key] = flagVariants[key]\n return res\n }, {})\n\n return {\n flags: truthyFlags,\n flagVariants: truthyFlagVariants,\n }\n }\n\n _fireFeatureFlagsCallbacks(): void {\n const { flags, flagVariants } = this._prepareFeatureFlagsForCallbacks()\n this.featureFlagEventHandlers.forEach((handler) => handler(flags, flagVariants))\n }\n\n /**\n * Set override person properties for feature flags.\n * This is used when dealing with new persons / where you don't want to wait for ingestion\n * to update user properties.\n */\n setPersonPropertiesForFlags(properties: Properties, reloadFeatureFlags = true): void {\n // Get persisted person properties\n const existingProperties = this.instance.get_property(STORED_PERSON_PROPERTIES_KEY) || {}\n\n this.instance.register({\n [STORED_PERSON_PROPERTIES_KEY]: {\n ...existingProperties,\n ...properties,\n },\n })\n\n if (reloadFeatureFlags) {\n this.instance.reloadFeatureFlags()\n }\n }\n\n resetPersonPropertiesForFlags(): void {\n this.instance.unregister(STORED_PERSON_PROPERTIES_KEY)\n }\n\n /**\n * Set override group properties for feature flags.\n * This is used when dealing with new groups / where you don't want to wait for ingestion\n * to update properties.\n * Takes in an object, the key of which is the group type.\n * For example:\n * setGroupPropertiesForFlags({'organization': { name: 'CYZ', employees: '11' } })\n */\n setGroupPropertiesForFlags(properties: { [type: string]: Properties }, reloadFeatureFlags = true): void {\n // Get persisted group properties\n const existingProperties = this.instance.get_property(STORED_GROUP_PROPERTIES_KEY) || {}\n\n if (Object.keys(existingProperties).length !== 0) {\n Object.keys(existingProperties).forEach((groupType) => {\n existingProperties[groupType] = {\n ...existingProperties[groupType],\n ...properties[groupType],\n }\n delete properties[groupType]\n })\n }\n\n this.instance.register({\n [STORED_GROUP_PROPERTIES_KEY]: {\n ...existingProperties,\n ...properties,\n },\n })\n\n if (reloadFeatureFlags) {\n this.instance.reloadFeatureFlags()\n }\n }\n\n resetGroupPropertiesForFlags(group_type?: string): void {\n if (group_type) {\n const existingProperties = this.instance.get_property(STORED_GROUP_PROPERTIES_KEY) || {}\n this.instance.register({\n [STORED_GROUP_PROPERTIES_KEY]: { ...existingProperties, [group_type]: {} },\n })\n } else {\n this.instance.unregister(STORED_GROUP_PROPERTIES_KEY)\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"posthog-featureflags.js","sourceRoot":"","sources":["../../src/posthog-featureflags.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AAY1D,OAAO,EACH,iCAAiC,EACjC,qBAAqB,EACrB,2BAA2B,EAC3B,4BAA4B,EAC5B,kBAAkB,GACrB,MAAM,aAAa,CAAA;AAEpB,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAC7C,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAA;AAEvC,IAAM,gCAAgC,GAAG,uBAAuB,CAAA;AAChE,IAAM,kCAAkC,GAAG,yBAAyB,CAAA;AACpE,IAAM,iCAAiC,GAAG,wBAAwB,CAAA;AAElE,MAAM,CAAC,IAAM,wBAAwB,GAAG,UAAC,YAA+C;;IACpF,IAAM,kBAAkB,GAAqC,EAAE,CAAA;;QAC/D,KAA2B,IAAA,KAAA,SAAA,QAAQ,CAAC,YAAY,IAAI,EAAE,CAAC,CAAA,gBAAA,4BAAE;YAA9C,IAAA,KAAA,mBAAY,EAAX,GAAG,QAAA,EAAE,KAAK,QAAA;YAClB,IAAI,KAAK,EAAE;gBACP,kBAAkB,CAAC,GAAG,CAAC,GAAG,KAAK,CAAA;aAClC;SACJ;;;;;;;;;IACD,OAAO,kBAAkB,CAAA;AAC7B,CAAC,CAAA;AAED,MAAM,CAAC,IAAM,8BAA8B,GAAG,UAC1C,QAAiC,EACjC,WAA+B,EAC/B,YAAmD,EACnD,mBAAkD;;IADlD,6BAAA,EAAA,iBAAmD;IACnD,oCAAA,EAAA,wBAAkD;IAElD,IAAM,KAAK,GAAG,QAAQ,CAAC,cAAc,CAAC,CAAA;IACtC,IAAM,YAAY,GAAG,QAAQ,CAAC,qBAAqB,CAAC,CAAA;IACpD,IAAI,KAAK,EAAE;QACP,mBAAmB;QACnB,IAAI,QAAQ,CAAC,KAAK,CAAC,EAAE;YACjB,IAAM,sBAAsB,GAA4B,EAAE,CAAA;YAC1D,IAAI,KAAK,EAAE;gBACP,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;oBACnC,sBAAsB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAA;iBAC1C;aACJ;YACD,WAAW;gBACP,WAAW,CAAC,QAAQ;oBAChB,GAAC,gCAAgC,IAAG,KAAK;oBACzC,GAAC,qBAAqB,IAAG,sBAAsB;wBACjD,CAAA;SACT;aAAM;YACH,oBAAoB;YACpB,IAAI,eAAe,GAAG,KAAK,CAAA;YAC3B,IAAI,sBAAsB,GAAG,YAAY,CAAA;YACzC,IAAI,QAAQ,CAAC,yBAAyB,EAAE;gBACpC,4EAA4E;gBAC5E,eAAe,yBAAQ,YAAY,GAAK,eAAe,CAAE,CAAA;gBACzD,sBAAsB,yBAAQ,mBAAmB,GAAK,sBAAsB,CAAE,CAAA;aACjF;YACD,WAAW;gBACP,WAAW,CAAC,QAAQ;oBAChB,GAAC,gCAAgC,IAAG,MAAM,CAAC,IAAI,CAAC,wBAAwB,CAAC,eAAe,CAAC,CAAC;oBAC1F,GAAC,qBAAqB,IAAG,eAAe,IAAI,EAAE;oBAC9C,GAAC,iCAAiC,IAAG,sBAAsB,IAAI,EAAE;wBACnE,CAAA;SACT;KACJ;AACL,CAAC,CAAA;AAED;IAQI,6BAAY,QAAiB;QACzB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAA;QACxB,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAA;QAC9B,IAAI,CAAC,wBAAwB,GAAG,EAAE,CAAA;QAElC,IAAI,CAAC,wBAAwB,GAAG,KAAK,CAAA;QACrC,IAAI,CAAC,0BAA0B,GAAG,KAAK,CAAA;IAC3C,CAAC;IAED,sCAAQ,GAAR;QACI,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC,CAAA;IAC9C,CAAC;IAED,6CAAe,GAAf;QACI,IAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,qBAAqB,CAAC,CAAA;QACtE,IAAM,eAAe,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,kCAAkC,CAAC,CAAA;QACtF,IAAI,CAAC,eAAe,EAAE;YAClB,OAAO,YAAY,IAAI,EAAE,CAAA;SAC5B;QAED,IAAM,UAAU,GAAG,OAAO,CAAC,EAAE,EAAE,YAAY,CAAC,CAAA;QAC5C,IAAM,cAAc,GAAG,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAA;QACnD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,cAAc,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YAC5C,IAAI,eAAe,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,KAAK,KAAK,EAAE;gBAC9C,OAAO,UAAU,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAA;aACvC;iBAAM;gBACH,UAAU,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,GAAG,eAAe,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAA;aACrE;SACJ;QACD,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE;YACzB,MAAM,CAAC,IAAI,CAAC,4BAA4B,EAAE;gBACtC,YAAY,cAAA;gBACZ,eAAe,iBAAA;gBACf,UAAU,YAAA;aACb,CAAC,CAAA;YACF,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAA;SAChC;QACD,OAAO,UAAU,CAAA;IACrB,CAAC;IAED,6CAAe,GAAf;QACI,IAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,iCAAiC,CAAC,CAAA;QAClF,OAAO,YAAY,IAAI,EAAE,CAAA;IAC7B,CAAC;IAED;;;;;;;;OAQG;IACH,gDAAkB,GAAlB;QACI,IAAI,CAAC,IAAI,CAAC,wBAAwB,EAAE;YAChC,IAAI,CAAC,wBAAwB,GAAG,IAAI,CAAA;YACpC,IAAI,CAAC,iBAAiB,EAAE,CAAA;SAC3B;IACL,CAAC;IAED,oDAAsB,GAAtB,UAAuB,gBAAwB;QAC3C,IAAI,CAAC,iBAAiB,GAAG,gBAAgB,CAAA;IAC7C,CAAC;IAED,gDAAkB,GAAlB,UAAmB,QAAiB;QAChC,IAAI,CAAC,0BAA0B,GAAG,QAAQ,CAAA;IAC9C,CAAC;IAED,+CAAiB,GAAjB;QACI,IAAI,CAAC,wBAAwB,GAAG,KAAK,CAAA;IACzC,CAAC;IAED,+CAAiB,GAAjB;QAAA,iBASC;QARG,IAAI,IAAI,CAAC,wBAAwB,IAAI,CAAC,IAAI,CAAC,0BAA0B,EAAE;YACnE,UAAU,CAAC;gBACP,IAAI,CAAC,KAAI,CAAC,0BAA0B,IAAI,KAAI,CAAC,wBAAwB,EAAE;oBACnE,KAAI,CAAC,wBAAwB,GAAG,KAAK,CAAA;oBACrC,KAAI,CAAC,0BAA0B,EAAE,CAAA;iBACpC;YACL,CAAC,EAAE,CAAC,CAAC,CAAA;SACR;IACL,CAAC;IAED,wDAA0B,GAA1B;QAAA,iBAmCC;QAlCG,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,8BAA8B,EAAE;YACrD,OAAM;SACT;QAED,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAA;QAC7B,IAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAA;QACxC,IAAM,gBAAgB,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,4BAA4B,CAAC,CAAA;QACjF,IAAM,eAAe,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,2BAA2B,CAAC,CAAA;QAC/E,IAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;YAC7B,KAAK,EAAE,KAAK;YACZ,WAAW,EAAE,IAAI,CAAC,QAAQ,CAAC,eAAe,EAAE;YAC5C,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE;YACjC,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;YACzC,iBAAiB,EAAE,gBAAgB;YACnC,gBAAgB,EAAE,eAAe;YACjC,aAAa,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,8BAA8B,IAAI,SAAS;SAClF,CAAC,CAAA;QAEF,IAAM,YAAY,GAAG,aAAa,CAAC,SAAS,CAAC,CAAA;QAC7C,IAAI,CAAC,QAAQ,CAAC,aAAa,CACvB,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,WAAW,CAAC,KAAK,EAAE,cAAc,CAAC,EAC9D,EAAE,IAAI,EAAE,YAAY,EAAE,EACtB,EAAE,MAAM,EAAE,MAAM,EAAE,EAClB,UAAC,QAAQ;YACL,iEAAiE;YACjE,mBAAmB;YACnB,KAAI,CAAC,iBAAiB,GAAG,SAAS,CAAA;YAClC,KAAI,CAAC,oBAAoB,CAAC,QAA0B,CAAC,CAAA;YAErD,qDAAqD;YACrD,KAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAA;YAC9B,KAAI,CAAC,iBAAiB,EAAE,CAAA;QAC5B,CAAC,CACJ,CAAA;IACL,CAAC;IAED;;;;;;;;;OASG;IACH,4CAAc,GAAd,UAAe,GAAW,EAAE,OAAsC;;;QAAtC,wBAAA,EAAA,YAAsC;QAC9D,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,oBAAoB,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE;YACzF,MAAM,CAAC,IAAI,CAAC,0BAA0B,GAAG,GAAG,GAAG,+CAA+C,CAAC,CAAA;YAC/F,OAAO,SAAS,CAAA;SACnB;QACD,IAAM,SAAS,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC,GAAG,CAAC,CAAA;QAC7C,IAAM,eAAe,GAAG,UAAG,SAAS,CAAE,CAAA;QACtC,IAAM,gBAAgB,GAA6B,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,kBAAkB,CAAC,IAAI,EAAE,CAAA;QAEvG,IAAI,OAAO,CAAC,UAAU,IAAI,CAAC,CAAC,YAAY,IAAI,OAAO,CAAC,EAAE;YAClD,IAAI,CAAC,CAAC,GAAG,IAAI,gBAAgB,CAAC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE;gBAChF,IAAI,QAAQ,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,EAAE;oBACjC,gBAAgB,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAA;iBAC9C;qBAAM;oBACH,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC,eAAe,CAAC,CAAA;iBAC5C;gBACD,MAAA,IAAI,CAAC,QAAQ,CAAC,WAAW,0CAAE,QAAQ,WAAG,GAAC,kBAAkB,IAAG,gBAAgB,MAAG,CAAA;gBAE/E,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,sBAAsB,EAAE,EAAE,aAAa,EAAE,GAAG,EAAE,sBAAsB,EAAE,SAAS,EAAE,CAAC,CAAA;aAC3G;SACJ;QACD,OAAO,SAAS,CAAA;IACpB,CAAC;IAED,mDAAqB,GAArB,UAAsB,GAAW;QAC7B,IAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,EAAE,CAAA;QACvC,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAA;IACxB,CAAC;IAED;;;;;;;;;OASG;IACH,8CAAgB,GAAhB,UAAiB,GAAW,EAAE,OAAsC;QAAtC,wBAAA,EAAA,YAAsC;QAChE,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,oBAAoB,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE;YACzF,MAAM,CAAC,IAAI,CAAC,4BAA4B,GAAG,GAAG,GAAG,+CAA+C,CAAC,CAAA;YACjG,OAAO,SAAS,CAAA;SACnB;QACD,OAAO,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE,OAAO,CAAC,CAAA;IAC9C,CAAC;IAED,oDAAsB,GAAtB,UAAuB,OAA6B;QAChD,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IAC/C,CAAC;IAED,uDAAyB,GAAzB,UAA0B,OAA6B;QACnD,IAAI,CAAC,wBAAwB,GAAG,IAAI,CAAC,wBAAwB,CAAC,MAAM,CAAC,UAAC,CAAC,IAAK,OAAA,CAAC,KAAK,OAAO,EAAb,CAAa,CAAC,CAAA;IAC9F,CAAC;IAED,kDAAoB,GAApB,UAAqB,QAAiC;QAClD,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE;YAC5B,OAAM;SACT;QACD,IAAI,CAAC,QAAQ,CAAC,oBAAoB,GAAG,IAAI,CAAA;QACzC,IAAM,YAAY,GAAG,IAAI,CAAC,eAAe,EAAE,CAAA;QAC3C,IAAM,mBAAmB,GAAG,IAAI,CAAC,eAAe,EAAE,CAAA;QAClD,8BAA8B,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,YAAY,EAAE,mBAAmB,CAAC,CAAA;QACtG,IAAI,CAAC,0BAA0B,EAAE,CAAA;IACrC,CAAC;IAED;;;;;;;;;;OAUG;IACH,sCAAQ,GAAR,UAAS,KAA4D;;QACjE,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE;YACvD,OAAO,MAAM,CAAC,oBAAoB,CAAC,gCAAgC,CAAC,CAAA;SACvE;QAED,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAA;QAE9B,IAAI,KAAK,KAAK,KAAK,EAAE;YACjB,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,UAAU,CAAC,kCAAkC,CAAC,CAAA;SAC3E;aAAM,IAAI,QAAQ,CAAC,KAAK,CAAC,EAAE;YACxB,IAAM,QAAQ,GAAqC,EAAE,CAAA;YACrD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;gBACnC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAA;aAC5B;YACD,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,QAAQ,WAAG,GAAC,kCAAkC,IAAG,QAAQ,MAAG,CAAA;SACzF;aAAM;YACH,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,QAAQ,WAAG,GAAC,kCAAkC,IAAG,KAAK,MAAG,CAAA;SACtF;IACL,CAAC;IACD;;;;;;;;;;;OAWG;IACH,4CAAc,GAAd,UAAe,QAA8B;QAA7C,iBAOC;QANG,IAAI,CAAC,sBAAsB,CAAC,QAAQ,CAAC,CAAA;QACrC,IAAI,IAAI,CAAC,QAAQ,CAAC,oBAAoB,EAAE;YAC9B,IAAA,KAA0B,IAAI,CAAC,gCAAgC,EAAE,EAA/D,KAAK,WAAA,EAAE,YAAY,kBAA4C,CAAA;YACvE,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC,CAAA;SAChC;QACD,OAAO,cAAM,OAAA,KAAI,CAAC,yBAAyB,CAAC,QAAQ,CAAC,EAAxC,CAAwC,CAAA;IACzD,CAAC;IAED,gEAAkC,GAAlC,UAAmC,GAAW,EAAE,UAAmB;;;QAC/D,IAAM,oBAAoB;YACtB,GAAC,8BAAuB,GAAG,CAAE,IAAG,UAAU;eAC7C,CAAA;QACD,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,4BAA4B,EAAE;YAChD,aAAa,EAAE,GAAG;YAClB,mBAAmB,EAAE,UAAU;YAC/B,IAAI,EAAE,oBAAoB;SAC7B,CAAC,CAAA;QACF,IAAI,CAAC,2BAA2B,CAAC,oBAAoB,EAAE,KAAK,CAAC,CAAA;QAE7D,IAAM,QAAQ,yBAAQ,IAAI,CAAC,eAAe,EAAE,gBAAG,GAAG,IAAG,UAAU,MAAE,CAAA;QACjE,MAAA,IAAI,CAAC,QAAQ,CAAC,WAAW,0CAAE,QAAQ;YAC/B,GAAC,gCAAgC,IAAG,MAAM,CAAC,IAAI,CAAC,wBAAwB,CAAC,QAAQ,CAAC,CAAC;YACnF,GAAC,qBAAqB,IAAG,QAAQ;gBACnC,CAAA;QACF,IAAI,CAAC,0BAA0B,EAAE,CAAA;IACrC,CAAC;IAED,oDAAsB,GAAtB,UAAuB,QAAoC,EAAE,YAAoB;QAAjF,iBAoBC;QApB4D,6BAAA,EAAA,oBAAoB;QAC7E,IAAM,8BAA8B,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,iCAAiC,CAAC,CAAA;QAEpG,IAAI,CAAC,8BAA8B,IAAI,YAAY,EAAE;YACjD,IAAI,CAAC,QAAQ,CAAC,aAAa,CACvB,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,WAAW,CACnC,KAAK,EACL,4CAAqC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAE,CACpE,EACD,EAAE,EACF,EAAE,MAAM,EAAE,KAAK,EAAE,EACjB,UAAC,QAAQ;;;gBACL,IAAM,mBAAmB,GAAI,QAAuC,CAAC,mBAAmB,CAAA;gBACxF,MAAA,KAAI,CAAC,QAAQ,CAAC,WAAW,0CAAE,QAAQ,WAAG,GAAC,iCAAiC,IAAG,mBAAmB,MAAG,CAAA;gBACjG,OAAO,QAAQ,CAAC,mBAAmB,CAAC,CAAA;YACxC,CAAC,CACJ,CAAA;SACJ;aAAM;YACH,OAAO,QAAQ,CAAC,8BAA8B,CAAC,CAAA;SAClD;IACL,CAAC;IAED,8DAAgC,GAAhC;QACI,IAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAA;QAC7B,IAAM,YAAY,GAAG,IAAI,CAAC,eAAe,EAAE,CAAA;QAE3C,gBAAgB;QAChB,IAAM,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC,UAAC,IAAI,IAAK,OAAA,YAAY,CAAC,IAAI,CAAC,EAAlB,CAAkB,CAAC,CAAA;QAC9D,IAAM,kBAAkB,GAAG,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC;aAC/C,MAAM,CAAC,UAAC,UAAU,IAAK,OAAA,YAAY,CAAC,UAAU,CAAC,EAAxB,CAAwB,CAAC;aAChD,MAAM,CAAC,UAAC,GAAqC,EAAE,GAAG;YAC/C,GAAG,CAAC,GAAG,CAAC,GAAG,YAAY,CAAC,GAAG,CAAC,CAAA;YAC5B,OAAO,GAAG,CAAA;QACd,CAAC,EAAE,EAAE,CAAC,CAAA;QAEV,OAAO;YACH,KAAK,EAAE,WAAW;YAClB,YAAY,EAAE,kBAAkB;SACnC,CAAA;IACL,CAAC;IAED,wDAA0B,GAA1B;QACU,IAAA,KAA0B,IAAI,CAAC,gCAAgC,EAAE,EAA/D,KAAK,WAAA,EAAE,YAAY,kBAA4C,CAAA;QACvE,IAAI,CAAC,wBAAwB,CAAC,OAAO,CAAC,UAAC,OAAO,IAAK,OAAA,OAAO,CAAC,KAAK,EAAE,YAAY,CAAC,EAA5B,CAA4B,CAAC,CAAA;IACpF,CAAC;IAED;;;;OAIG;IACH,yDAA2B,GAA3B,UAA4B,UAAsB,EAAE,kBAAyB;;QAAzB,mCAAA,EAAA,yBAAyB;QACzE,kCAAkC;QAClC,IAAM,kBAAkB,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,4BAA4B,CAAC,IAAI,EAAE,CAAA;QAEzF,IAAI,CAAC,QAAQ,CAAC,QAAQ;YAClB,GAAC,4BAA4B,0BACtB,kBAAkB,GAClB,UAAU,CAChB;gBACH,CAAA;QAEF,IAAI,kBAAkB,EAAE;YACpB,IAAI,CAAC,QAAQ,CAAC,kBAAkB,EAAE,CAAA;SACrC;IACL,CAAC;IAED,2DAA6B,GAA7B;QACI,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,4BAA4B,CAAC,CAAA;IAC1D,CAAC;IAED;;;;;;;OAOG;IACH,wDAA0B,GAA1B,UAA2B,UAA0C,EAAE,kBAAyB;;QAAzB,mCAAA,EAAA,yBAAyB;QAC5F,iCAAiC;QACjC,IAAM,kBAAkB,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,2BAA2B,CAAC,IAAI,EAAE,CAAA;QAExF,IAAI,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE;YAC9C,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,OAAO,CAAC,UAAC,SAAS;gBAC9C,kBAAkB,CAAC,SAAS,CAAC,yBACtB,kBAAkB,CAAC,SAAS,CAAC,GAC7B,UAAU,CAAC,SAAS,CAAC,CAC3B,CAAA;gBACD,OAAO,UAAU,CAAC,SAAS,CAAC,CAAA;YAChC,CAAC,CAAC,CAAA;SACL;QAED,IAAI,CAAC,QAAQ,CAAC,QAAQ;YAClB,GAAC,2BAA2B,0BACrB,kBAAkB,GAClB,UAAU,CAChB;gBACH,CAAA;QAEF,IAAI,kBAAkB,EAAE;YACpB,IAAI,CAAC,QAAQ,CAAC,kBAAkB,EAAE,CAAA;SACrC;IACL,CAAC;IAED,0DAA4B,GAA5B,UAA6B,UAAmB;;QAC5C,IAAI,UAAU,EAAE;YACZ,IAAM,kBAAkB,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,2BAA2B,CAAC,IAAI,EAAE,CAAA;YACxF,IAAI,CAAC,QAAQ,CAAC,QAAQ;gBAClB,GAAC,2BAA2B,0BAAQ,kBAAkB,gBAAG,UAAU,IAAG,EAAE,MAAE;oBAC5E,CAAA;SACL;aAAM;YACH,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,2BAA2B,CAAC,CAAA;SACxD;IACL,CAAC;IACL,0BAAC;AAAD,CAAC,AAtYD,IAsYC","sourcesContent":["import { _base64Encode, _entries, _extend } from './utils'\nimport { PostHog } from './posthog-core'\nimport {\n DecideResponse,\n FeatureFlagsCallback,\n EarlyAccessFeatureCallback,\n EarlyAccessFeatureResponse,\n Properties,\n JsonType,\n} from './types'\nimport { PostHogPersistence } from './posthog-persistence'\n\nimport {\n PERSISTENCE_EARLY_ACCESS_FEATURES,\n ENABLED_FEATURE_FLAGS,\n STORED_GROUP_PROPERTIES_KEY,\n STORED_PERSON_PROPERTIES_KEY,\n FLAG_CALL_REPORTED,\n} from './constants'\n\nimport { _isArray } from './utils/type-utils'\nimport { logger } from './utils/logger'\n\nconst PERSISTENCE_ACTIVE_FEATURE_FLAGS = '$active_feature_flags'\nconst PERSISTENCE_OVERRIDE_FEATURE_FLAGS = '$override_feature_flags'\nconst PERSISTENCE_FEATURE_FLAG_PAYLOADS = '$feature_flag_payloads'\n\nexport const filterActiveFeatureFlags = (featureFlags?: Record<string, string | boolean>) => {\n const activeFeatureFlags: Record<string, string | boolean> = {}\n for (const [key, value] of _entries(featureFlags || {})) {\n if (value) {\n activeFeatureFlags[key] = value\n }\n }\n return activeFeatureFlags\n}\n\nexport const parseFeatureFlagDecideResponse = (\n response: Partial<DecideResponse>,\n persistence: PostHogPersistence,\n currentFlags: Record<string, string | boolean> = {},\n currentFlagPayloads: Record<string, JsonType> = {}\n) => {\n const flags = response['featureFlags']\n const flagPayloads = response['featureFlagPayloads']\n if (flags) {\n // using the v1 api\n if (_isArray(flags)) {\n const $enabled_feature_flags: Record<string, boolean> = {}\n if (flags) {\n for (let i = 0; i < flags.length; i++) {\n $enabled_feature_flags[flags[i]] = true\n }\n }\n persistence &&\n persistence.register({\n [PERSISTENCE_ACTIVE_FEATURE_FLAGS]: flags,\n [ENABLED_FEATURE_FLAGS]: $enabled_feature_flags,\n })\n } else {\n // using the v2+ api\n let newFeatureFlags = flags\n let newFeatureFlagPayloads = flagPayloads\n if (response.errorsWhileComputingFlags) {\n // if not all flags were computed, we upsert flags instead of replacing them\n newFeatureFlags = { ...currentFlags, ...newFeatureFlags }\n newFeatureFlagPayloads = { ...currentFlagPayloads, ...newFeatureFlagPayloads }\n }\n persistence &&\n persistence.register({\n [PERSISTENCE_ACTIVE_FEATURE_FLAGS]: Object.keys(filterActiveFeatureFlags(newFeatureFlags)),\n [ENABLED_FEATURE_FLAGS]: newFeatureFlags || {},\n [PERSISTENCE_FEATURE_FLAG_PAYLOADS]: newFeatureFlagPayloads || {},\n })\n }\n }\n}\n\nexport class PostHogFeatureFlags {\n instance: PostHog\n _override_warning: boolean\n featureFlagEventHandlers: FeatureFlagsCallback[]\n reloadFeatureFlagsQueued: boolean\n reloadFeatureFlagsInAction: boolean\n $anon_distinct_id: string | undefined\n\n constructor(instance: PostHog) {\n this.instance = instance\n this._override_warning = false\n this.featureFlagEventHandlers = []\n\n this.reloadFeatureFlagsQueued = false\n this.reloadFeatureFlagsInAction = false\n }\n\n getFlags(): string[] {\n return Object.keys(this.getFlagVariants())\n }\n\n getFlagVariants(): Record<string, string | boolean> {\n const enabledFlags = this.instance.get_property(ENABLED_FEATURE_FLAGS)\n const overriddenFlags = this.instance.get_property(PERSISTENCE_OVERRIDE_FEATURE_FLAGS)\n if (!overriddenFlags) {\n return enabledFlags || {}\n }\n\n const finalFlags = _extend({}, enabledFlags)\n const overriddenKeys = Object.keys(overriddenFlags)\n for (let i = 0; i < overriddenKeys.length; i++) {\n if (overriddenFlags[overriddenKeys[i]] === false) {\n delete finalFlags[overriddenKeys[i]]\n } else {\n finalFlags[overriddenKeys[i]] = overriddenFlags[overriddenKeys[i]]\n }\n }\n if (!this._override_warning) {\n logger.warn(' Overriding feature flags!', {\n enabledFlags,\n overriddenFlags,\n finalFlags,\n })\n this._override_warning = true\n }\n return finalFlags\n }\n\n getFlagPayloads(): Record<string, JsonType> {\n const flagPayloads = this.instance.get_property(PERSISTENCE_FEATURE_FLAG_PAYLOADS)\n return flagPayloads || {}\n }\n\n /**\n * Reloads feature flags asynchronously.\n *\n * Constraints:\n *\n * 1. Avoid parallel requests\n * 2. Delay a few milliseconds after each reloadFeatureFlags call to batch subsequent changes together\n * 3. Don't call this during initial load (as /decide will be called instead), see posthog-core.js\n */\n reloadFeatureFlags(): void {\n if (!this.reloadFeatureFlagsQueued) {\n this.reloadFeatureFlagsQueued = true\n this._startReloadTimer()\n }\n }\n\n setAnonymousDistinctId(anon_distinct_id: string): void {\n this.$anon_distinct_id = anon_distinct_id\n }\n\n setReloadingPaused(isPaused: boolean): void {\n this.reloadFeatureFlagsInAction = isPaused\n }\n\n resetRequestQueue(): void {\n this.reloadFeatureFlagsQueued = false\n }\n\n _startReloadTimer(): void {\n if (this.reloadFeatureFlagsQueued && !this.reloadFeatureFlagsInAction) {\n setTimeout(() => {\n if (!this.reloadFeatureFlagsInAction && this.reloadFeatureFlagsQueued) {\n this.reloadFeatureFlagsQueued = false\n this._reloadFeatureFlagsRequest()\n }\n }, 5)\n }\n }\n\n _reloadFeatureFlagsRequest(): void {\n if (this.instance.config.advanced_disable_feature_flags) {\n return\n }\n\n this.setReloadingPaused(true)\n const token = this.instance.config.token\n const personProperties = this.instance.get_property(STORED_PERSON_PROPERTIES_KEY)\n const groupProperties = this.instance.get_property(STORED_GROUP_PROPERTIES_KEY)\n const json_data = JSON.stringify({\n token: token,\n distinct_id: this.instance.get_distinct_id(),\n groups: this.instance.getGroups(),\n $anon_distinct_id: this.$anon_distinct_id,\n person_properties: personProperties,\n group_properties: groupProperties,\n disable_flags: this.instance.config.advanced_disable_feature_flags || undefined,\n })\n\n const encoded_data = _base64Encode(json_data)\n this.instance._send_request(\n this.instance.requestRouter.endpointFor('api', '/decide/?v=3'),\n { data: encoded_data },\n { method: 'POST' },\n (response) => {\n // reset anon_distinct_id after at least a single request with it\n // makes it through\n this.$anon_distinct_id = undefined\n this.receivedFeatureFlags(response as DecideResponse)\n\n // :TRICKY: Reload - start another request if queued!\n this.setReloadingPaused(false)\n this._startReloadTimer()\n }\n )\n }\n\n /*\n * Get feature flag's value for user.\n *\n * ### Usage:\n *\n * if(posthog.getFeatureFlag('my-flag') === 'some-variant') { // do something }\n *\n * @param {Object|String} key Key of the feature flag.\n * @param {Object|String} options (optional) If {send_event: false}, we won't send an $feature_flag_call event to PostHog.\n */\n getFeatureFlag(key: string, options: { send_event?: boolean } = {}): boolean | string | undefined {\n if (!this.instance.decideEndpointWasHit && !(this.getFlags() && this.getFlags().length > 0)) {\n logger.warn('getFeatureFlag for key \"' + key + '\" failed. Feature flags didn\\'t load in time.')\n return undefined\n }\n const flagValue = this.getFlagVariants()[key]\n const flagReportValue = `${flagValue}`\n const flagCallReported: Record<string, string[]> = this.instance.get_property(FLAG_CALL_REPORTED) || {}\n\n if (options.send_event || !('send_event' in options)) {\n if (!(key in flagCallReported) || !flagCallReported[key].includes(flagReportValue)) {\n if (_isArray(flagCallReported[key])) {\n flagCallReported[key].push(flagReportValue)\n } else {\n flagCallReported[key] = [flagReportValue]\n }\n this.instance.persistence?.register({ [FLAG_CALL_REPORTED]: flagCallReported })\n\n this.instance.capture('$feature_flag_called', { $feature_flag: key, $feature_flag_response: flagValue })\n }\n }\n return flagValue\n }\n\n getFeatureFlagPayload(key: string): JsonType {\n const payloads = this.getFlagPayloads()\n return payloads[key]\n }\n\n /*\n * See if feature flag is enabled for user.\n *\n * ### Usage:\n *\n * if(posthog.isFeatureEnabled('beta-feature')) { // do something }\n *\n * @param {Object|String} key Key of the feature flag.\n * @param {Object|String} options (optional) If {send_event: false}, we won't send an $feature_flag_call event to PostHog.\n */\n isFeatureEnabled(key: string, options: { send_event?: boolean } = {}): boolean | undefined {\n if (!this.instance.decideEndpointWasHit && !(this.getFlags() && this.getFlags().length > 0)) {\n logger.warn('isFeatureEnabled for key \"' + key + '\" failed. Feature flags didn\\'t load in time.')\n return undefined\n }\n return !!this.getFeatureFlag(key, options)\n }\n\n addFeatureFlagsHandler(handler: FeatureFlagsCallback): void {\n this.featureFlagEventHandlers.push(handler)\n }\n\n removeFeatureFlagsHandler(handler: FeatureFlagsCallback): void {\n this.featureFlagEventHandlers = this.featureFlagEventHandlers.filter((h) => h !== handler)\n }\n\n receivedFeatureFlags(response: Partial<DecideResponse>): void {\n if (!this.instance.persistence) {\n return\n }\n this.instance.decideEndpointWasHit = true\n const currentFlags = this.getFlagVariants()\n const currentFlagPayloads = this.getFlagPayloads()\n parseFeatureFlagDecideResponse(response, this.instance.persistence, currentFlags, currentFlagPayloads)\n this._fireFeatureFlagsCallbacks()\n }\n\n /*\n * Override feature flags for debugging.\n *\n * ### Usage:\n *\n * - posthog.feature_flags.override(false)\n * - posthog.feature_flags.override(['beta-feature'])\n * - posthog.feature_flags.override({'beta-feature': 'variant', 'other-feature': True})\n *\n * @param {Object|Array|String} flags Flags to override with.\n */\n override(flags: boolean | string[] | Record<string, string | boolean>): void {\n if (!this.instance.__loaded || !this.instance.persistence) {\n return logger.uninitializedWarning('posthog.feature_flags.override')\n }\n\n this._override_warning = false\n\n if (flags === false) {\n this.instance.persistence.unregister(PERSISTENCE_OVERRIDE_FEATURE_FLAGS)\n } else if (_isArray(flags)) {\n const flagsObj: Record<string, string | boolean> = {}\n for (let i = 0; i < flags.length; i++) {\n flagsObj[flags[i]] = true\n }\n this.instance.persistence.register({ [PERSISTENCE_OVERRIDE_FEATURE_FLAGS]: flagsObj })\n } else {\n this.instance.persistence.register({ [PERSISTENCE_OVERRIDE_FEATURE_FLAGS]: flags })\n }\n }\n /*\n * Register an event listener that runs when feature flags become available or when they change.\n * If there are flags, the listener is called immediately in addition to being called on future changes.\n *\n * ### Usage:\n *\n * posthog.onFeatureFlags(function(featureFlags) { // do something })\n *\n * @param {Function} [callback] The callback function will be called once the feature flags are ready or when they are updated.\n * It'll return a list of feature flags enabled for the user.\n * @returns {Function} A function that can be called to unsubscribe the listener. Used by useEffect when the component unmounts.\n */\n onFeatureFlags(callback: FeatureFlagsCallback): () => void {\n this.addFeatureFlagsHandler(callback)\n if (this.instance.decideEndpointWasHit) {\n const { flags, flagVariants } = this._prepareFeatureFlagsForCallbacks()\n callback(flags, flagVariants)\n }\n return () => this.removeFeatureFlagsHandler(callback)\n }\n\n updateEarlyAccessFeatureEnrollment(key: string, isEnrolled: boolean): void {\n const enrollmentPersonProp = {\n [`$feature_enrollment/${key}`]: isEnrolled,\n }\n this.instance.capture('$feature_enrollment_update', {\n $feature_flag: key,\n $feature_enrollment: isEnrolled,\n $set: enrollmentPersonProp,\n })\n this.setPersonPropertiesForFlags(enrollmentPersonProp, false)\n\n const newFlags = { ...this.getFlagVariants(), [key]: isEnrolled }\n this.instance.persistence?.register({\n [PERSISTENCE_ACTIVE_FEATURE_FLAGS]: Object.keys(filterActiveFeatureFlags(newFlags)),\n [ENABLED_FEATURE_FLAGS]: newFlags,\n })\n this._fireFeatureFlagsCallbacks()\n }\n\n getEarlyAccessFeatures(callback: EarlyAccessFeatureCallback, force_reload = false): void {\n const existing_early_access_features = this.instance.get_property(PERSISTENCE_EARLY_ACCESS_FEATURES)\n\n if (!existing_early_access_features || force_reload) {\n this.instance._send_request(\n this.instance.requestRouter.endpointFor(\n 'api',\n `/api/early_access_features/?token=${this.instance.config.token}`\n ),\n {},\n { method: 'GET' },\n (response) => {\n const earlyAccessFeatures = (response as EarlyAccessFeatureResponse).earlyAccessFeatures\n this.instance.persistence?.register({ [PERSISTENCE_EARLY_ACCESS_FEATURES]: earlyAccessFeatures })\n return callback(earlyAccessFeatures)\n }\n )\n } else {\n return callback(existing_early_access_features)\n }\n }\n\n _prepareFeatureFlagsForCallbacks(): { flags: string[]; flagVariants: Record<string, string | boolean> } {\n const flags = this.getFlags()\n const flagVariants = this.getFlagVariants()\n\n // Return truthy\n const truthyFlags = flags.filter((flag) => flagVariants[flag])\n const truthyFlagVariants = Object.keys(flagVariants)\n .filter((variantKey) => flagVariants[variantKey])\n .reduce((res: Record<string, string | boolean>, key) => {\n res[key] = flagVariants[key]\n return res\n }, {})\n\n return {\n flags: truthyFlags,\n flagVariants: truthyFlagVariants,\n }\n }\n\n _fireFeatureFlagsCallbacks(): void {\n const { flags, flagVariants } = this._prepareFeatureFlagsForCallbacks()\n this.featureFlagEventHandlers.forEach((handler) => handler(flags, flagVariants))\n }\n\n /**\n * Set override person properties for feature flags.\n * This is used when dealing with new persons / where you don't want to wait for ingestion\n * to update user properties.\n */\n setPersonPropertiesForFlags(properties: Properties, reloadFeatureFlags = true): void {\n // Get persisted person properties\n const existingProperties = this.instance.get_property(STORED_PERSON_PROPERTIES_KEY) || {}\n\n this.instance.register({\n [STORED_PERSON_PROPERTIES_KEY]: {\n ...existingProperties,\n ...properties,\n },\n })\n\n if (reloadFeatureFlags) {\n this.instance.reloadFeatureFlags()\n }\n }\n\n resetPersonPropertiesForFlags(): void {\n this.instance.unregister(STORED_PERSON_PROPERTIES_KEY)\n }\n\n /**\n * Set override group properties for feature flags.\n * This is used when dealing with new groups / where you don't want to wait for ingestion\n * to update properties.\n * Takes in an object, the key of which is the group type.\n * For example:\n * setGroupPropertiesForFlags({'organization': { name: 'CYZ', employees: '11' } })\n */\n setGroupPropertiesForFlags(properties: { [type: string]: Properties }, reloadFeatureFlags = true): void {\n // Get persisted group properties\n const existingProperties = this.instance.get_property(STORED_GROUP_PROPERTIES_KEY) || {}\n\n if (Object.keys(existingProperties).length !== 0) {\n Object.keys(existingProperties).forEach((groupType) => {\n existingProperties[groupType] = {\n ...existingProperties[groupType],\n ...properties[groupType],\n }\n delete properties[groupType]\n })\n }\n\n this.instance.register({\n [STORED_GROUP_PROPERTIES_KEY]: {\n ...existingProperties,\n ...properties,\n },\n })\n\n if (reloadFeatureFlags) {\n this.instance.reloadFeatureFlags()\n }\n }\n\n resetGroupPropertiesForFlags(group_type?: string): void {\n if (group_type) {\n const existingProperties = this.instance.get_property(STORED_GROUP_PROPERTIES_KEY) || {}\n this.instance.register({\n [STORED_GROUP_PROPERTIES_KEY]: { ...existingProperties, [group_type]: {} },\n })\n } else {\n this.instance.unregister(STORED_GROUP_PROPERTIES_KEY)\n }\n }\n}\n"]}
|
package/lib/src/types.d.ts
CHANGED
|
@@ -119,7 +119,6 @@ export interface PostHogConfig {
|
|
|
119
119
|
advanced_disable_toolbar_metrics: boolean;
|
|
120
120
|
get_device_id: (uuid: string) => string;
|
|
121
121
|
name: string;
|
|
122
|
-
callback_fn: string;
|
|
123
122
|
_onCapture: (eventName: string, eventData: CaptureResult) => void;
|
|
124
123
|
capture_performance?: boolean;
|
|
125
124
|
disable_compression: boolean;
|
|
@@ -319,10 +318,6 @@ export interface PostData {
|
|
|
319
318
|
compression?: Compression;
|
|
320
319
|
data?: string;
|
|
321
320
|
}
|
|
322
|
-
export interface JSC {
|
|
323
|
-
(): void;
|
|
324
|
-
[key: string]: (response: any) => void;
|
|
325
|
-
}
|
|
326
321
|
export type SnippetArrayItem = [method: string, ...args: any[]];
|
|
327
322
|
export type JsonType = string | number | boolean | null | {
|
|
328
323
|
[key: string]: JsonType;
|
package/lib/src/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AA+LA,MAAM,CAAN,IAAY,WAGX;AAHD,WAAY,WAAW;IACnB,iCAAkB,CAAA;IAClB,gCAAiB,CAAA;AACrB,CAAC,EAHW,WAAW,KAAX,WAAW,QAGtB","sourcesContent":["import type { MaskInputOptions, SlimDOMOptions } from 'rrweb-snapshot'\nimport { PostHog } from './posthog-core'\nimport { RetryQueue } from './retry-queue'\n\nexport type Property = any\nexport type Properties = Record<string, Property>\n\nexport interface CaptureResult {\n uuid: string\n event: string\n properties: Properties\n $set?: Properties\n $set_once?: Properties\n timestamp?: Date\n}\nexport type CaptureCallback = (response: any, data: any) => void\n\nexport type AutocaptureCompatibleElement = 'a' | 'button' | 'form' | 'input' | 'select' | 'textarea' | 'label'\nexport type DomAutocaptureEvents = 'click' | 'change' | 'submit'\n\n/**\n * If an array is passed for an allowlist, autocapture events will only be sent for elements matching\n * at least one of the elements in the array. Multiple allowlists can be used\n */\nexport interface AutocaptureConfig {\n /**\n * List of URLs to allow autocapture on, can be strings to match\n * or regexes e.g. ['https://example.com', 'test.com/.*']\n */\n url_allowlist?: (string | RegExp)[]\n\n /**\n * List of DOM events to allow autocapture on e.g. ['click', 'change', 'submit']\n */\n dom_event_allowlist?: DomAutocaptureEvents[]\n\n /**\n * List of DOM elements to allow autocapture on\n * e.g. ['a', 'button', 'form', 'input', 'select', 'textarea', 'label']\n * we consider the tree of elements from the root to the target element of the click event\n * so for the tree div > div > button > svg\n * if the allowlist has button then we allow the capture when the button or the svg is the click target\n * but not if either of the divs are detected as the click target\n */\n element_allowlist?: AutocaptureCompatibleElement[]\n\n /**\n * List of CSS selectors to allow autocapture on\n * e.g. ['[ph-capture]']\n * we consider the tree of elements from the root to the target element of the click event\n * so for the tree div > div > button > svg\n * and allow list config `['[id]']`\n * we will capture the click if the click-target or its parents has any id\n */\n css_selector_allowlist?: string[]\n\n /**\n * Exclude certain element attributes from autocapture\n * E.g. ['aria-label'] or [data-attr-pii]\n */\n element_attribute_ignorelist?: string[]\n\n capture_copied_text?: boolean\n}\n\nexport interface PostHogConfig {\n api_host: string\n api_method: string\n api_transport?: 'XHR' | 'fetch'\n ui_host: string | null\n token: string\n autocapture: boolean | AutocaptureConfig\n rageclick: boolean\n cross_subdomain_cookie: boolean\n persistence: 'localStorage' | 'cookie' | 'memory' | 'localStorage+cookie' | 'sessionStorage'\n persistence_name: string\n cookie_name: string\n loaded: (posthog_instance: PostHog) => void\n store_google: boolean\n custom_campaign_params: string[]\n // a list of strings to be tested against navigator.userAgent to determine if the source is a bot\n // this is **added to** the default list of bots that we check\n // defaults to the empty array\n custom_blocked_useragents: string[]\n save_referrer: boolean\n verbose: boolean\n capture_pageview: boolean\n capture_pageleave: boolean\n debug: boolean\n cookie_expiration: number\n upgrade: boolean\n disable_session_recording: boolean\n disable_persistence: boolean\n /** @deprecated - use `disable_persistence` instead */\n disable_cookie: boolean\n enable_recording_console_log?: boolean\n secure_cookie: boolean\n ip: boolean\n opt_out_capturing_by_default: boolean\n opt_out_persistence_by_default: boolean\n /** Opt out of user agent filtering such as googlebot or other bots. Defaults to `false` */\n opt_out_useragent_filter: boolean\n opt_out_capturing_persistence_type: 'localStorage' | 'cookie'\n opt_out_capturing_cookie_prefix: string | null\n opt_in_site_apps: boolean\n respect_dnt: boolean\n /** @deprecated - use `property_denylist` instead */\n property_blacklist: string[]\n property_denylist: string[]\n request_headers: { [header_name: string]: string }\n on_request_error: (error: MinimalHTTPResponse) => void\n /** @deprecated - use `request_headers` instead */\n xhr_headers?: { [header_name: string]: string }\n /** @deprecated - use `on_request_error` instead */\n on_xhr_error?: (failedRequest: XMLHttpRequest) => void\n inapp_protocol: string\n inapp_link_new_window: boolean\n request_batching: boolean\n sanitize_properties: ((properties: Properties, event_name: string) => Properties) | null\n properties_string_max_length: number\n session_recording: SessionRecordingOptions\n session_idle_timeout_seconds: number\n mask_all_element_attributes: boolean\n mask_all_text: boolean\n advanced_disable_decide: boolean\n advanced_disable_feature_flags: boolean\n advanced_disable_feature_flags_on_first_load: boolean\n advanced_disable_toolbar_metrics: boolean\n get_device_id: (uuid: string) => string\n name: string\n callback_fn: string\n _onCapture: (eventName: string, eventData: CaptureResult) => void\n capture_performance?: boolean\n // Should only be used for testing. Could negatively impact performance.\n disable_compression: boolean\n bootstrap: {\n distinctID?: string\n isIdentifiedID?: boolean\n featureFlags?: Record<string, boolean | string>\n featureFlagPayloads?: Record<string, JsonType>\n }\n segment?: any\n __preview_send_client_session_params?: boolean\n disable_scroll_properties?: boolean\n // Let the pageview scroll stats use a custom css selector for the root element, e.g. `main`\n scroll_root_selector?: string | string[]\n}\n\nexport interface OptInOutCapturingOptions {\n capture: (event: string, properties: Properties, options: CaptureOptions) => void\n capture_event_name: string\n capture_properties: Properties\n enable_persistence: boolean\n clear_persistence: boolean\n persistence_type: 'cookie' | 'localStorage' | 'localStorage+cookie'\n cookie_prefix: string\n cookie_expiration: number\n cross_subdomain_cookie: boolean\n secure_cookie: boolean\n}\n\nexport interface isFeatureEnabledOptions {\n send_event: boolean\n}\n\nexport interface SessionRecordingOptions {\n blockClass?: string | RegExp\n blockSelector?: string | null\n ignoreClass?: string\n maskTextClass?: string | RegExp\n maskTextSelector?: string | null\n maskTextFn?: ((text: string) => string) | null\n maskAllInputs?: boolean\n maskInputOptions?: MaskInputOptions\n maskInputFn?: ((text: string, element?: HTMLElement) => string) | null\n slimDOMOptions?: SlimDOMOptions | 'all' | true\n collectFonts?: boolean\n inlineStylesheet?: boolean\n recorderVersion?: 'v1' | 'v2'\n recordCrossOriginIframes?: boolean\n /** @deprecated - use maskCapturedNetworkRequestFn instead */\n maskNetworkRequestFn?: ((data: NetworkRequest) => NetworkRequest | null | undefined) | null\n /** Modify the network request before it is captured. Returning null or undefined stops it being captured */\n maskCapturedNetworkRequestFn?: ((data: CapturedNetworkRequest) => CapturedNetworkRequest | null | undefined) | null\n // our settings here only support a subset of those proposed for rrweb's network capture plugin\n recordHeaders?: boolean\n recordBody?: boolean\n}\n\nexport type SessionIdChangedCallback = (sessionId: string, windowId: string | null | undefined) => void\n\nexport enum Compression {\n GZipJS = 'gzip-js',\n Base64 = 'base64',\n}\n\nexport interface XHROptions {\n transport?: 'XHR' | 'fetch' | 'sendBeacon'\n method?: 'POST' | 'GET'\n urlQueryArgs?: { compression: Compression }\n verbose?: boolean\n blob?: boolean\n sendBeacon?: boolean\n}\n\nexport interface CaptureOptions extends XHROptions {\n $set?: Properties /** used with $identify */\n $set_once?: Properties /** used with $identify */\n _url?: string /** Used to override the desired endpoint for the captured event */\n _batchKey?: string /** key of queue, e.g. 'sessionRecording' vs 'event' */\n _metrics?: Properties\n _noTruncate?: boolean /** if set, overrides and disables config.properties_string_max_length */\n send_instantly?: boolean /** if set skips the batched queue */\n timestamp?: Date\n}\n\nexport interface RetryQueueElement {\n retryAt: Date\n requestData: QueuedRequestData\n}\nexport interface QueuedRequestData {\n url: string\n data: Properties\n options: CaptureOptions\n headers?: Properties\n callback?: RequestCallback\n retriesPerformedSoFar?: number\n}\n\n// Minimal class to allow interop between different request methods (xhr / fetch)\nexport interface MinimalHTTPResponse {\n statusCode: number\n responseText: string\n}\n\nexport interface RequestData extends QueuedRequestData {\n retryQueue: RetryQueue\n timeout?: number\n onError?: (req: MinimalHTTPResponse) => void\n onResponse?: (req: MinimalHTTPResponse) => void\n}\n\nexport type FlagVariant = { flag: string; variant: string }\n\nexport interface DecideResponse {\n status: number\n supportedCompression: Compression[]\n config: {\n enable_collect_everything: boolean\n }\n custom_properties: AutoCaptureCustomProperty[] // TODO: delete, not sent\n featureFlags: Record<string, string | boolean>\n featureFlagPayloads: Record<string, JsonType>\n errorsWhileComputingFlags: boolean\n autocapture_opt_out?: boolean\n capturePerformance?: boolean\n analytics?: {\n endpoint?: string\n }\n elementsChainAsString?: boolean\n // this is currently in development and may have breaking changes without a major version bump\n autocaptureExceptions?:\n | boolean\n | {\n endpoint?: string\n errors_to_ignore: string[]\n }\n sessionRecording?: {\n endpoint?: string\n consoleLogRecordingEnabled?: boolean\n recorderVersion?: 'v1' | 'v2'\n // the API returns a decimal between 0 and 1 as a string\n sampleRate?: string | null\n minimumDurationMilliseconds?: number\n recordCanvas?: boolean | null\n canvasFps?: number | null\n // the API returns a decimal between 0 and 1 as a string\n canvasQuality?: string | null\n linkedFlag?: string | FlagVariant | null\n networkPayloadCapture?: Pick<NetworkRecordOptions, 'recordBody' | 'recordHeaders'>\n }\n surveys?: boolean\n toolbarParams: ToolbarParams\n editorParams?: ToolbarParams /** @deprecated, renamed to toolbarParams, still present on older API responses */\n toolbarVersion: 'toolbar' /** @deprecated, moved to toolbarParams */\n isAuthenticated: boolean\n siteApps: { id: number; url: string }[]\n}\n\nexport type FeatureFlagsCallback = (flags: string[], variants: Record<string, string | boolean>) => void\n\n// TODO: delete custom_properties after changeless typescript refactor\nexport interface AutoCaptureCustomProperty {\n name: string\n css_selector: string\n event_selectors: string[]\n}\n\nexport interface CompressionData {\n data: string\n compression?: Compression\n}\n\nexport interface GDPROptions {\n capture?: (\n event: string,\n properties: Properties,\n options: CaptureOptions\n ) => void /** function used for capturing a PostHog event to record the opt-in action */\n captureEventName?: string /** event name to be used for capturing the opt-in action */\n captureProperties?: Properties /** set of properties to be captured along with the opt-in action */\n /** persistence mechanism used */\n persistenceType?: 'cookie' | 'localStorage' | 'localStorage+cookie'\n persistencePrefix?: string /** [__ph_opt_in_out] - custom prefix to be used in the cookie/localstorage name */\n cookieExpiration?: number /** number of days until the opt-in cookie expires */\n crossSubdomainCookie?: boolean /** whether the opt-in cookie is set as cross-subdomain or not */\n secureCookie?: boolean /** whether the opt-in cookie is set as secure or not */\n respectDnt?: boolean\n window?: Window\n}\n\nexport type RequestCallback = (response: Record<string, any>, data?: Properties) => void\n\nexport interface PersistentStore {\n is_supported: () => boolean\n error: (error: any) => void\n parse: (name: string) => any\n get: (name: string) => any\n set: (name: string, value: any, expire_days?: number | null, cross_subdomain?: boolean, secure?: boolean) => void\n remove: (name: string, cross_subdomain?: boolean) => void\n}\n\n// eslint-disable-next-line @typescript-eslint/ban-types\nexport type Breaker = {}\nexport type EventHandler = (event: Event) => boolean | void\n\nexport type ToolbarUserIntent = 'add-action' | 'edit-action'\nexport type ToolbarSource = 'url' | 'localstorage'\nexport type ToolbarVersion = 'toolbar'\n\n/* sync with posthog */\nexport interface ToolbarParams {\n token?: string /** public posthog-js token */\n temporaryToken?: string /** private temporary user token */\n actionId?: number\n userIntent?: ToolbarUserIntent\n source?: ToolbarSource\n toolbarVersion?: ToolbarVersion\n instrument?: boolean\n distinctId?: string\n userEmail?: string\n dataAttributes?: string[]\n featureFlags?: Record<string, string | boolean>\n}\n\nexport interface PostData {\n buffer?: BlobPart\n compression?: Compression\n data?: string\n}\n\nexport interface JSC {\n (): void\n [key: string]: (response: any) => void\n}\n\nexport type SnippetArrayItem = [method: string, ...args: any[]]\n\nexport type JsonType = string | number | boolean | null | { [key: string]: JsonType } | Array<JsonType>\n\n/** A feature that isn't publicly available yet.*/\nexport interface EarlyAccessFeature {\n // Sync this with the backend's EarlyAccessFeatureSerializer!\n name: string\n description: string\n stage: 'concept' | 'alpha' | 'beta'\n documentationUrl: string | null\n flagKey: string | null\n}\n\nexport type EarlyAccessFeatureCallback = (earlyAccessFeatures: EarlyAccessFeature[]) => void\n\nexport interface EarlyAccessFeatureResponse {\n earlyAccessFeatures: EarlyAccessFeature[]\n}\n\nexport type Headers = Record<string, string>\n\n/* for rrweb/network@1\n ** when that is released as part of rrweb this can be removed\n ** don't rely on this type, it may change without notice\n */\nexport type InitiatorType =\n | 'audio'\n | 'beacon'\n | 'body'\n | 'css'\n | 'early-hint'\n | 'embed'\n | 'fetch'\n | 'frame'\n | 'iframe'\n | 'icon'\n | 'image'\n | 'img'\n | 'input'\n | 'link'\n | 'navigation'\n | 'object'\n | 'ping'\n | 'script'\n | 'track'\n | 'video'\n | 'xmlhttprequest'\n\nexport type NetworkRecordOptions = {\n initiatorTypes?: InitiatorType[]\n maskRequestFn?: (data: CapturedNetworkRequest) => CapturedNetworkRequest | undefined\n recordHeaders?: boolean | { request: boolean; response: boolean }\n recordBody?: boolean | string[] | { request: boolean | string[]; response: boolean | string[] }\n recordInitialRequests?: boolean\n // whether to record PerformanceEntry events for network requests\n recordPerformance?: boolean\n // the PerformanceObserver will only observe these entry types\n performanceEntryTypeToObserve: string[]\n // the maximum size of the request/response body to record\n // NB this will be at most 1MB even if set larger\n payloadSizeLimitBytes: number\n}\n\n/** @deprecated - use CapturedNetworkRequest instead */\nexport type NetworkRequest = {\n url: string\n}\n\n// In rrweb this is called NetworkRequest, but we already exposed that as having only URL\n// we also want to vary from the rrweb NetworkRequest because we want to include\n// all PerformanceEntry properties too.\n// that has 4 required properties\n// readonly duration: DOMHighResTimeStamp;\n// readonly entryType: string;\n// readonly name: string;\n// readonly startTime: DOMHighResTimeStamp;\n// NB: properties below here are ALPHA, don't rely on them, they may change without notice\nexport type CapturedNetworkRequest = Omit<PerformanceEntry, 'toJSON'> & {\n // properties below here are ALPHA, don't rely on them, they may change without notice\n method?: string\n initiatorType?: InitiatorType\n status?: number\n timeOrigin?: number\n timestamp?: number\n startTime?: number\n endTime?: number\n requestHeaders?: Headers\n requestBody?: string | null\n responseHeaders?: Headers\n responseBody?: string | null\n // was this captured before fetch/xhr could have been wrapped\n isInitial?: boolean\n}\n"]}
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AA8LA,MAAM,CAAN,IAAY,WAGX;AAHD,WAAY,WAAW;IACnB,iCAAkB,CAAA;IAClB,gCAAiB,CAAA;AACrB,CAAC,EAHW,WAAW,KAAX,WAAW,QAGtB","sourcesContent":["import type { MaskInputOptions, SlimDOMOptions } from 'rrweb-snapshot'\nimport { PostHog } from './posthog-core'\nimport { RetryQueue } from './retry-queue'\n\nexport type Property = any\nexport type Properties = Record<string, Property>\n\nexport interface CaptureResult {\n uuid: string\n event: string\n properties: Properties\n $set?: Properties\n $set_once?: Properties\n timestamp?: Date\n}\nexport type CaptureCallback = (response: any, data: any) => void\n\nexport type AutocaptureCompatibleElement = 'a' | 'button' | 'form' | 'input' | 'select' | 'textarea' | 'label'\nexport type DomAutocaptureEvents = 'click' | 'change' | 'submit'\n\n/**\n * If an array is passed for an allowlist, autocapture events will only be sent for elements matching\n * at least one of the elements in the array. Multiple allowlists can be used\n */\nexport interface AutocaptureConfig {\n /**\n * List of URLs to allow autocapture on, can be strings to match\n * or regexes e.g. ['https://example.com', 'test.com/.*']\n */\n url_allowlist?: (string | RegExp)[]\n\n /**\n * List of DOM events to allow autocapture on e.g. ['click', 'change', 'submit']\n */\n dom_event_allowlist?: DomAutocaptureEvents[]\n\n /**\n * List of DOM elements to allow autocapture on\n * e.g. ['a', 'button', 'form', 'input', 'select', 'textarea', 'label']\n * we consider the tree of elements from the root to the target element of the click event\n * so for the tree div > div > button > svg\n * if the allowlist has button then we allow the capture when the button or the svg is the click target\n * but not if either of the divs are detected as the click target\n */\n element_allowlist?: AutocaptureCompatibleElement[]\n\n /**\n * List of CSS selectors to allow autocapture on\n * e.g. ['[ph-capture]']\n * we consider the tree of elements from the root to the target element of the click event\n * so for the tree div > div > button > svg\n * and allow list config `['[id]']`\n * we will capture the click if the click-target or its parents has any id\n */\n css_selector_allowlist?: string[]\n\n /**\n * Exclude certain element attributes from autocapture\n * E.g. ['aria-label'] or [data-attr-pii]\n */\n element_attribute_ignorelist?: string[]\n\n capture_copied_text?: boolean\n}\n\nexport interface PostHogConfig {\n api_host: string\n api_method: string\n api_transport?: 'XHR' | 'fetch'\n ui_host: string | null\n token: string\n autocapture: boolean | AutocaptureConfig\n rageclick: boolean\n cross_subdomain_cookie: boolean\n persistence: 'localStorage' | 'cookie' | 'memory' | 'localStorage+cookie' | 'sessionStorage'\n persistence_name: string\n cookie_name: string\n loaded: (posthog_instance: PostHog) => void\n store_google: boolean\n custom_campaign_params: string[]\n // a list of strings to be tested against navigator.userAgent to determine if the source is a bot\n // this is **added to** the default list of bots that we check\n // defaults to the empty array\n custom_blocked_useragents: string[]\n save_referrer: boolean\n verbose: boolean\n capture_pageview: boolean\n capture_pageleave: boolean\n debug: boolean\n cookie_expiration: number\n upgrade: boolean\n disable_session_recording: boolean\n disable_persistence: boolean\n /** @deprecated - use `disable_persistence` instead */\n disable_cookie: boolean\n enable_recording_console_log?: boolean\n secure_cookie: boolean\n ip: boolean\n opt_out_capturing_by_default: boolean\n opt_out_persistence_by_default: boolean\n /** Opt out of user agent filtering such as googlebot or other bots. Defaults to `false` */\n opt_out_useragent_filter: boolean\n opt_out_capturing_persistence_type: 'localStorage' | 'cookie'\n opt_out_capturing_cookie_prefix: string | null\n opt_in_site_apps: boolean\n respect_dnt: boolean\n /** @deprecated - use `property_denylist` instead */\n property_blacklist: string[]\n property_denylist: string[]\n request_headers: { [header_name: string]: string }\n on_request_error: (error: MinimalHTTPResponse) => void\n /** @deprecated - use `request_headers` instead */\n xhr_headers?: { [header_name: string]: string }\n /** @deprecated - use `on_request_error` instead */\n on_xhr_error?: (failedRequest: XMLHttpRequest) => void\n inapp_protocol: string\n inapp_link_new_window: boolean\n request_batching: boolean\n sanitize_properties: ((properties: Properties, event_name: string) => Properties) | null\n properties_string_max_length: number\n session_recording: SessionRecordingOptions\n session_idle_timeout_seconds: number\n mask_all_element_attributes: boolean\n mask_all_text: boolean\n advanced_disable_decide: boolean\n advanced_disable_feature_flags: boolean\n advanced_disable_feature_flags_on_first_load: boolean\n advanced_disable_toolbar_metrics: boolean\n get_device_id: (uuid: string) => string\n name: string\n _onCapture: (eventName: string, eventData: CaptureResult) => void\n capture_performance?: boolean\n // Should only be used for testing. Could negatively impact performance.\n disable_compression: boolean\n bootstrap: {\n distinctID?: string\n isIdentifiedID?: boolean\n featureFlags?: Record<string, boolean | string>\n featureFlagPayloads?: Record<string, JsonType>\n }\n segment?: any\n __preview_send_client_session_params?: boolean\n disable_scroll_properties?: boolean\n // Let the pageview scroll stats use a custom css selector for the root element, e.g. `main`\n scroll_root_selector?: string | string[]\n}\n\nexport interface OptInOutCapturingOptions {\n capture: (event: string, properties: Properties, options: CaptureOptions) => void\n capture_event_name: string\n capture_properties: Properties\n enable_persistence: boolean\n clear_persistence: boolean\n persistence_type: 'cookie' | 'localStorage' | 'localStorage+cookie'\n cookie_prefix: string\n cookie_expiration: number\n cross_subdomain_cookie: boolean\n secure_cookie: boolean\n}\n\nexport interface isFeatureEnabledOptions {\n send_event: boolean\n}\n\nexport interface SessionRecordingOptions {\n blockClass?: string | RegExp\n blockSelector?: string | null\n ignoreClass?: string\n maskTextClass?: string | RegExp\n maskTextSelector?: string | null\n maskTextFn?: ((text: string) => string) | null\n maskAllInputs?: boolean\n maskInputOptions?: MaskInputOptions\n maskInputFn?: ((text: string, element?: HTMLElement) => string) | null\n slimDOMOptions?: SlimDOMOptions | 'all' | true\n collectFonts?: boolean\n inlineStylesheet?: boolean\n recorderVersion?: 'v1' | 'v2'\n recordCrossOriginIframes?: boolean\n /** @deprecated - use maskCapturedNetworkRequestFn instead */\n maskNetworkRequestFn?: ((data: NetworkRequest) => NetworkRequest | null | undefined) | null\n /** Modify the network request before it is captured. Returning null or undefined stops it being captured */\n maskCapturedNetworkRequestFn?: ((data: CapturedNetworkRequest) => CapturedNetworkRequest | null | undefined) | null\n // our settings here only support a subset of those proposed for rrweb's network capture plugin\n recordHeaders?: boolean\n recordBody?: boolean\n}\n\nexport type SessionIdChangedCallback = (sessionId: string, windowId: string | null | undefined) => void\n\nexport enum Compression {\n GZipJS = 'gzip-js',\n Base64 = 'base64',\n}\n\nexport interface XHROptions {\n transport?: 'XHR' | 'fetch' | 'sendBeacon'\n method?: 'POST' | 'GET'\n urlQueryArgs?: { compression: Compression }\n verbose?: boolean\n blob?: boolean\n sendBeacon?: boolean\n}\n\nexport interface CaptureOptions extends XHROptions {\n $set?: Properties /** used with $identify */\n $set_once?: Properties /** used with $identify */\n _url?: string /** Used to override the desired endpoint for the captured event */\n _batchKey?: string /** key of queue, e.g. 'sessionRecording' vs 'event' */\n _metrics?: Properties\n _noTruncate?: boolean /** if set, overrides and disables config.properties_string_max_length */\n send_instantly?: boolean /** if set skips the batched queue */\n timestamp?: Date\n}\n\nexport interface RetryQueueElement {\n retryAt: Date\n requestData: QueuedRequestData\n}\nexport interface QueuedRequestData {\n url: string\n data: Properties\n options: CaptureOptions\n headers?: Properties\n callback?: RequestCallback\n retriesPerformedSoFar?: number\n}\n\n// Minimal class to allow interop between different request methods (xhr / fetch)\nexport interface MinimalHTTPResponse {\n statusCode: number\n responseText: string\n}\n\nexport interface RequestData extends QueuedRequestData {\n retryQueue: RetryQueue\n timeout?: number\n onError?: (req: MinimalHTTPResponse) => void\n onResponse?: (req: MinimalHTTPResponse) => void\n}\n\nexport type FlagVariant = { flag: string; variant: string }\n\nexport interface DecideResponse {\n status: number\n supportedCompression: Compression[]\n config: {\n enable_collect_everything: boolean\n }\n custom_properties: AutoCaptureCustomProperty[] // TODO: delete, not sent\n featureFlags: Record<string, string | boolean>\n featureFlagPayloads: Record<string, JsonType>\n errorsWhileComputingFlags: boolean\n autocapture_opt_out?: boolean\n capturePerformance?: boolean\n analytics?: {\n endpoint?: string\n }\n elementsChainAsString?: boolean\n // this is currently in development and may have breaking changes without a major version bump\n autocaptureExceptions?:\n | boolean\n | {\n endpoint?: string\n errors_to_ignore: string[]\n }\n sessionRecording?: {\n endpoint?: string\n consoleLogRecordingEnabled?: boolean\n recorderVersion?: 'v1' | 'v2'\n // the API returns a decimal between 0 and 1 as a string\n sampleRate?: string | null\n minimumDurationMilliseconds?: number\n recordCanvas?: boolean | null\n canvasFps?: number | null\n // the API returns a decimal between 0 and 1 as a string\n canvasQuality?: string | null\n linkedFlag?: string | FlagVariant | null\n networkPayloadCapture?: Pick<NetworkRecordOptions, 'recordBody' | 'recordHeaders'>\n }\n surveys?: boolean\n toolbarParams: ToolbarParams\n editorParams?: ToolbarParams /** @deprecated, renamed to toolbarParams, still present on older API responses */\n toolbarVersion: 'toolbar' /** @deprecated, moved to toolbarParams */\n isAuthenticated: boolean\n siteApps: { id: number; url: string }[]\n}\n\nexport type FeatureFlagsCallback = (flags: string[], variants: Record<string, string | boolean>) => void\n\n// TODO: delete custom_properties after changeless typescript refactor\nexport interface AutoCaptureCustomProperty {\n name: string\n css_selector: string\n event_selectors: string[]\n}\n\nexport interface CompressionData {\n data: string\n compression?: Compression\n}\n\nexport interface GDPROptions {\n capture?: (\n event: string,\n properties: Properties,\n options: CaptureOptions\n ) => void /** function used for capturing a PostHog event to record the opt-in action */\n captureEventName?: string /** event name to be used for capturing the opt-in action */\n captureProperties?: Properties /** set of properties to be captured along with the opt-in action */\n /** persistence mechanism used */\n persistenceType?: 'cookie' | 'localStorage' | 'localStorage+cookie'\n persistencePrefix?: string /** [__ph_opt_in_out] - custom prefix to be used in the cookie/localstorage name */\n cookieExpiration?: number /** number of days until the opt-in cookie expires */\n crossSubdomainCookie?: boolean /** whether the opt-in cookie is set as cross-subdomain or not */\n secureCookie?: boolean /** whether the opt-in cookie is set as secure or not */\n respectDnt?: boolean\n window?: Window\n}\n\nexport type RequestCallback = (response: Record<string, any>, data?: Properties) => void\n\nexport interface PersistentStore {\n is_supported: () => boolean\n error: (error: any) => void\n parse: (name: string) => any\n get: (name: string) => any\n set: (name: string, value: any, expire_days?: number | null, cross_subdomain?: boolean, secure?: boolean) => void\n remove: (name: string, cross_subdomain?: boolean) => void\n}\n\n// eslint-disable-next-line @typescript-eslint/ban-types\nexport type Breaker = {}\nexport type EventHandler = (event: Event) => boolean | void\n\nexport type ToolbarUserIntent = 'add-action' | 'edit-action'\nexport type ToolbarSource = 'url' | 'localstorage'\nexport type ToolbarVersion = 'toolbar'\n\n/* sync with posthog */\nexport interface ToolbarParams {\n token?: string /** public posthog-js token */\n temporaryToken?: string /** private temporary user token */\n actionId?: number\n userIntent?: ToolbarUserIntent\n source?: ToolbarSource\n toolbarVersion?: ToolbarVersion\n instrument?: boolean\n distinctId?: string\n userEmail?: string\n dataAttributes?: string[]\n featureFlags?: Record<string, string | boolean>\n}\n\nexport interface PostData {\n buffer?: BlobPart\n compression?: Compression\n data?: string\n}\n\nexport type SnippetArrayItem = [method: string, ...args: any[]]\n\nexport type JsonType = string | number | boolean | null | { [key: string]: JsonType } | Array<JsonType>\n\n/** A feature that isn't publicly available yet.*/\nexport interface EarlyAccessFeature {\n // Sync this with the backend's EarlyAccessFeatureSerializer!\n name: string\n description: string\n stage: 'concept' | 'alpha' | 'beta'\n documentationUrl: string | null\n flagKey: string | null\n}\n\nexport type EarlyAccessFeatureCallback = (earlyAccessFeatures: EarlyAccessFeature[]) => void\n\nexport interface EarlyAccessFeatureResponse {\n earlyAccessFeatures: EarlyAccessFeature[]\n}\n\nexport type Headers = Record<string, string>\n\n/* for rrweb/network@1\n ** when that is released as part of rrweb this can be removed\n ** don't rely on this type, it may change without notice\n */\nexport type InitiatorType =\n | 'audio'\n | 'beacon'\n | 'body'\n | 'css'\n | 'early-hint'\n | 'embed'\n | 'fetch'\n | 'frame'\n | 'iframe'\n | 'icon'\n | 'image'\n | 'img'\n | 'input'\n | 'link'\n | 'navigation'\n | 'object'\n | 'ping'\n | 'script'\n | 'track'\n | 'video'\n | 'xmlhttprequest'\n\nexport type NetworkRecordOptions = {\n initiatorTypes?: InitiatorType[]\n maskRequestFn?: (data: CapturedNetworkRequest) => CapturedNetworkRequest | undefined\n recordHeaders?: boolean | { request: boolean; response: boolean }\n recordBody?: boolean | string[] | { request: boolean | string[]; response: boolean | string[] }\n recordInitialRequests?: boolean\n // whether to record PerformanceEntry events for network requests\n recordPerformance?: boolean\n // the PerformanceObserver will only observe these entry types\n performanceEntryTypeToObserve: string[]\n // the maximum size of the request/response body to record\n // NB this will be at most 1MB even if set larger\n payloadSizeLimitBytes: number\n}\n\n/** @deprecated - use CapturedNetworkRequest instead */\nexport type NetworkRequest = {\n url: string\n}\n\n// In rrweb this is called NetworkRequest, but we already exposed that as having only URL\n// we also want to vary from the rrweb NetworkRequest because we want to include\n// all PerformanceEntry properties too.\n// that has 4 required properties\n// readonly duration: DOMHighResTimeStamp;\n// readonly entryType: string;\n// readonly name: string;\n// readonly startTime: DOMHighResTimeStamp;\n// NB: properties below here are ALPHA, don't rely on them, they may change without notice\nexport type CapturedNetworkRequest = Omit<PerformanceEntry, 'toJSON'> & {\n // properties below here are ALPHA, don't rely on them, they may change without notice\n method?: string\n initiatorType?: InitiatorType\n status?: number\n timeOrigin?: number\n timestamp?: number\n startTime?: number\n endTime?: number\n requestHeaders?: Headers\n requestBody?: string | null\n responseHeaders?: Headers\n responseBody?: string | null\n // was this captured before fetch/xhr could have been wrapped\n isInitial?: boolean\n}\n"]}
|
|
@@ -12,6 +12,7 @@ export declare enum RequestRouterRegion {
|
|
|
12
12
|
export type RequestRouterTarget = 'api' | 'ui' | 'assets';
|
|
13
13
|
export declare class RequestRouter {
|
|
14
14
|
instance: PostHog;
|
|
15
|
+
private _regionCache;
|
|
15
16
|
constructor(instance: PostHog);
|
|
16
17
|
get apiHost(): string;
|
|
17
18
|
get uiHost(): string | undefined;
|
|
@@ -11,6 +11,7 @@ export var RequestRouterRegion;
|
|
|
11
11
|
})(RequestRouterRegion || (RequestRouterRegion = {}));
|
|
12
12
|
var RequestRouter = /** @class */ (function () {
|
|
13
13
|
function RequestRouter(instance) {
|
|
14
|
+
this._regionCache = {};
|
|
14
15
|
this.instance = instance;
|
|
15
16
|
}
|
|
16
17
|
Object.defineProperty(RequestRouter.prototype, "apiHost", {
|
|
@@ -30,15 +31,19 @@ var RequestRouter = /** @class */ (function () {
|
|
|
30
31
|
});
|
|
31
32
|
Object.defineProperty(RequestRouter.prototype, "region", {
|
|
32
33
|
get: function () {
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
34
|
+
// We don't need to compute this every time so we cache the result
|
|
35
|
+
if (!this._regionCache[this.apiHost]) {
|
|
36
|
+
if (/https:\/\/(app|us|us-assets)(\.i)?\.posthog\.com/i.test(this.apiHost)) {
|
|
37
|
+
this._regionCache[this.apiHost] = RequestRouterRegion.US;
|
|
38
|
+
}
|
|
39
|
+
else if (/https:\/\/(eu|eu-assets)(\.i)?\.posthog\.com/i.test(this.apiHost)) {
|
|
40
|
+
this._regionCache[this.apiHost] = RequestRouterRegion.EU;
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
this._regionCache[this.apiHost] = RequestRouterRegion.CUSTOM;
|
|
44
|
+
}
|
|
41
45
|
}
|
|
46
|
+
return this._regionCache[this.apiHost];
|
|
42
47
|
},
|
|
43
48
|
enumerable: false,
|
|
44
49
|
configurable: true
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"request-router.js","sourceRoot":"","sources":["../../../src/utils/request-router.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AAEH,MAAM,CAAN,IAAY,mBAIX;AAJD,WAAY,mBAAmB;IAC3B,gCAAS,CAAA;IACT,gCAAS,CAAA;IACT,wCAAiB,CAAA;AACrB,CAAC,EAJW,mBAAmB,KAAnB,mBAAmB,QAI9B;AAID;
|
|
1
|
+
{"version":3,"file":"request-router.js","sourceRoot":"","sources":["../../../src/utils/request-router.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AAEH,MAAM,CAAN,IAAY,mBAIX;AAJD,WAAY,mBAAmB;IAC3B,gCAAS,CAAA;IACT,gCAAS,CAAA;IACT,wCAAiB,CAAA;AACrB,CAAC,EAJW,mBAAmB,KAAnB,mBAAmB,QAI9B;AAID;IAII,uBAAY,QAAiB;QAFrB,iBAAY,GAAwC,EAAE,CAAA;QAG1D,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAA;IAC5B,CAAC;IAED,sBAAI,kCAAO;aAAX;YACI,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;QAClE,CAAC;;;OAAA;IACD,sBAAI,iCAAM;aAAV;;YACI,OAAO,MAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,0CAAE,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;QAC3D,CAAC;;;OAAA;IAED,sBAAI,iCAAM;aAAV;YACI,kEAAkE;YAClE,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE;gBAClC,IAAI,mDAAmD,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE;oBACxE,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,mBAAmB,CAAC,EAAE,CAAA;iBAC3D;qBAAM,IAAI,+CAA+C,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE;oBAC3E,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,mBAAmB,CAAC,EAAE,CAAA;iBAC3D;qBAAM;oBACH,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,mBAAmB,CAAC,MAAM,CAAA;iBAC/D;aACJ;YACD,OAAO,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QAC1C,CAAC;;;OAAA;IAED,mCAAW,GAAX,UAAY,MAA2B,EAAE,IAAiB;QAAjB,qBAAA,EAAA,SAAiB;QACtD,IAAI,IAAI,EAAE;YACN,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,WAAI,IAAI,CAAE,CAAA;SAC7C;QAED,IAAI,MAAM,KAAK,IAAI,EAAE;YACjB,OAAO,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI,CAAA;SAC9C;QAED,IAAI,IAAI,CAAC,MAAM,KAAK,mBAAmB,CAAC,MAAM,EAAE;YAC5C,OAAO,IAAI,CAAC,OAAO,GAAG,IAAI,CAAA;SAC7B;QAED,IAAM,MAAM,GAAG,eAAe,GAAG,IAAI,CAAA;QAErC,QAAQ,MAAM,EAAE;YACZ,KAAK,QAAQ;gBACT,OAAO,kBAAW,IAAI,CAAC,MAAM,qBAAW,MAAM,CAAE,CAAA;YACpD,KAAK,KAAK;gBACN,OAAO,kBAAW,IAAI,CAAC,MAAM,cAAI,MAAM,CAAE,CAAA;SAChD;IACL,CAAC;IACL,oBAAC;AAAD,CAAC,AAnDD,IAmDC","sourcesContent":["import { PostHog } from '../posthog-core'\n\n/**\n * The request router helps simplify the logic to determine which endpoints should be called for which things\n * The basic idea is that for a given region (US or EU), we have a set of endpoints that we should call depending\n * on the type of request (events, replays, decide, etc.) and handle overrides that may come from configs or the decide endpoint\n */\n\nexport enum RequestRouterRegion {\n US = 'us',\n EU = 'eu',\n CUSTOM = 'custom',\n}\n\nexport type RequestRouterTarget = 'api' | 'ui' | 'assets'\n\nexport class RequestRouter {\n instance: PostHog\n private _regionCache: Record<string, RequestRouterRegion> = {}\n\n constructor(instance: PostHog) {\n this.instance = instance\n }\n\n get apiHost(): string {\n return this.instance.config.api_host.trim().replace(/\\/$/, '')\n }\n get uiHost(): string | undefined {\n return this.instance.config.ui_host?.replace(/\\/$/, '')\n }\n\n get region(): RequestRouterRegion {\n // We don't need to compute this every time so we cache the result\n if (!this._regionCache[this.apiHost]) {\n if (/https:\\/\\/(app|us|us-assets)(\\.i)?\\.posthog\\.com/i.test(this.apiHost)) {\n this._regionCache[this.apiHost] = RequestRouterRegion.US\n } else if (/https:\\/\\/(eu|eu-assets)(\\.i)?\\.posthog\\.com/i.test(this.apiHost)) {\n this._regionCache[this.apiHost] = RequestRouterRegion.EU\n } else {\n this._regionCache[this.apiHost] = RequestRouterRegion.CUSTOM\n }\n }\n return this._regionCache[this.apiHost]\n }\n\n endpointFor(target: RequestRouterTarget, path: string = ''): string {\n if (path) {\n path = path[0] === '/' ? path : `/${path}`\n }\n\n if (target === 'ui') {\n return (this.uiHost || this.apiHost) + path\n }\n\n if (this.region === RequestRouterRegion.CUSTOM) {\n return this.apiHost + path\n }\n\n const suffix = 'i.posthog.com' + path\n\n switch (target) {\n case 'assets':\n return `https://${this.region}-assets.${suffix}`\n case 'api':\n return `https://${this.region}.${suffix}`\n }\n }\n}\n"]}
|
package/package.json
CHANGED