@kameleoon/javascript-sdk-core 5.8.0 → 5.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +10 -0
- package/dist/kameleoonClient.d.ts +1 -1
- package/dist/kameleoonClient.js +1 -1
- package/dist/kameleoonClientInterface.d.ts +2 -2
- package/dist/kameleoonData/conversion.d.ts +4 -1
- package/dist/kameleoonData/conversion.js +1 -1
- package/dist/kameleoonData/customData.js +1 -1
- package/dist/kameleoonData/types.d.ts +3 -0
- package/dist/requester/constants.js +1 -1
- package/dist/requester/types.d.ts +2 -1
- package/dist/requester/types.js +1 -1
- package/dist/types.d.ts +5 -0
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,15 @@
|
|
|
1
1
|
# Change Log
|
|
2
2
|
|
|
3
|
+
## 5.9.0 (2025-03-24)
|
|
4
|
+
|
|
5
|
+
### Features
|
|
6
|
+
|
|
7
|
+
- Added new optional parameters `negative` and `metadata` to the [`trackConversion`](trackConversion) method.
|
|
8
|
+
- Added new optional parameter `metadata` to the [`Conversion`](Conversion) data constructor.
|
|
9
|
+
|
|
10
|
+
[trackConversion]: https://developers.kameleoon.com/feature-management-and-experimentation/web-sdks/js-sdk#trackconversion
|
|
11
|
+
[Conversion]: https://developers.kameleoon.com/feature-management-and-experimentation/web-sdks/js-sdk#conversion
|
|
12
|
+
|
|
3
13
|
## 5.8.0 (2025-03-18)
|
|
4
14
|
|
|
5
15
|
### Features
|
|
@@ -30,7 +30,7 @@ export declare class KameleoonClient implements IKameleoonClient {
|
|
|
30
30
|
initialize(): Promise<boolean>;
|
|
31
31
|
addData(visitorCode: string, ...data: KameleoonDataType[]): void;
|
|
32
32
|
getRemoteVisitorData({ visitorCode, shouldAddData, filters, }: RemoteVisitorDataParamsType): Promise<KameleoonDataType[]>;
|
|
33
|
-
trackConversion({ visitorCode, goalId, revenue, }: TrackConversionParamsType): void;
|
|
33
|
+
trackConversion({ visitorCode, goalId, negative, revenue, metadata, }: TrackConversionParamsType): void;
|
|
34
34
|
flush(visitorCode?: string): void;
|
|
35
35
|
getFeatureFlags(): FeatureFlagType[];
|
|
36
36
|
getVisitorFeatureFlags(visitorCode: string): FeatureFlagType[];
|
package/dist/kameleoonClient.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.KameleoonClient=void 0;var _tsRes=require("ts-res"),_cacheManager=require("./cacheManager"),_clientConfiguration=require("./clientConfiguration"),_clientSettings=require("./clientSettings"),_constants=require("./constants"),_kameleoonData=require("./kameleoonData"),_kameleoonError=require("./kameleoonError"),_requester=require("./requester"),_storage=require("./storage"),_types=require("./types"),_utilities=require("./utilities"),_variationConfiguration=require("./variationConfiguration"),_eventSource=require("./eventSource"),_visitorCodeManager=require("./visitorCodeManager"),_eventManager=require("./eventManager"),_tracking=require("./tracking"),_logging=require("./logging"),_hasher=require("./hasher");function _defineProperty(a,b,c){return(b=_toPropertyKey(b))in a?Object.defineProperty(a,b,{value:c,enumerable:!0,configurable:!0,writable:!0}):a[b]=c,a}function _toPropertyKey(a){var b=_toPrimitive(a,"string");return"symbol"==typeof b?b:b+""}function _toPrimitive(a,b){if("object"!=typeof a||!a)return a;var c=a[Symbol.toPrimitive];if(void 0!==c){var d=c.call(a,b||"default");if("object"!=typeof d)return d;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===b?String:Number)(a)}class KameleoonClient{constructor(a){var b;let{siteCode:c,dependencies:d,configuration:e,internalConfiguration:f,stubMode:g}=a;if(_defineProperty(this,"variationConfiguration",void 0),_defineProperty(this,"clientConfiguration",void 0),_defineProperty(this,"dataManager",void 0),_defineProperty(this,"consentDataStorage",void 0),_defineProperty(this,"trackingCache",void 0),_defineProperty(this,"requester",void 0),_defineProperty(this,"externalPackageInfo",void 0),_defineProperty(this,"initialized",!1),_defineProperty(this,"visitorCodeManager",void 0),_defineProperty(this,"eventManager",void 0),_defineProperty(this,"tracker",void 0),_defineProperty(this,"environment",void 0),_defineProperty(this,"stubMode",void 0),this.stubMode=g,g)return this.variationConfiguration={},this.clientConfiguration={},this.dataManager={},this.consentDataStorage={},this.trackingCache={},this.requester={},this.externalPackageInfo={},this.visitorCodeManager={},this.eventManager={},this.tracker={},void(this.environment="");const h=null===f||void 0===f?void 0:f.externals.externalLogger;h&&_logging.KameleoonLogger.setLogger(h),_logging.KameleoonLogger.debug`CALL: new KameleoonClient(siteCode: ${c}, dependencies: ${d}, configuration: ${e})`;const{settings:i}=new _clientSettings.ClientSettings(c,e);this.environment=i.environment;const{externalStorage:j,externalEventSource:k,externalPackageInfo:l,externalVisitorCodeManager:m,externalRequester:n,externalPRNG:o}=f.externals,{useAbortController:p}=f.settings,q=new _cacheManager.CacheManager(_constants.CACHE_CLEANUP_TIMEOUT),r=new _storage.DataStorage(j,_storage.KameleoonStorageKey.ClientData),s=new _storage.DataStorage(j,_storage.KameleoonStorageKey.TargetingData),t=new _storage.DataStorage(j,_storage.KameleoonStorageKey.DataInfo),u=new _storage.DataStorage(j,_storage.KameleoonStorageKey.VariationData),v=new _storage.DataStorage(j,_storage.KameleoonStorageKey.ForcedExperimentVariation),w=new _storage.DataStorage(j,_storage.KameleoonStorageKey.ForcedFeatureVariation),x=new _storage.DataStorage(j,_storage.KameleoonStorageKey.ConsentData),y=new _storage.DataStorage(j,_storage.KameleoonStorageKey.TrackingData),z=new _kameleoonData.DataManager({dataStorage:s,infoStorage:t,cleanupInterval:i.cleanupInterval,packageInfo:l}),A=null!==(b=null===d||void 0===d?void 0:d.urlProvider)&&void 0!==b?b:new _requester.UrlProvider;A.initialize({domain:i.networkDomain,siteCode:i.siteCode,packageInfo:l,environment:i.environment});const B=new _requester.Requester({urlProvider:A,useAbortController:p,packageInfo:l,externalRequester:n,requestTimeout:i.requestTimeout,trackRetryDelay:i.trackRetryDelay}),C=new _eventSource.KameleoonEventSource({siteCode:i.siteCode,externalEventSource:k,urlProvider:A}),D=new _eventManager.EventManager,E=new _clientConfiguration.ClientConfiguration({urlProvider:A,storage:r,updateInterval:i.updateInterval,dataManager:z,eventManager:D,requester:B,eventSource:C,externalVisitorCodeManager:m}),F=new _variationConfiguration.VariationConfiguration(u,v,w,m,E),G=new _tracking.Tracker({dataManager:z,trackingStorage:y,variationConfiguration:F,requester:B,trackingInterval:i.trackingInterval,prng:o});this.tracker=G,this.variationConfiguration=F,this.requester=B,this.trackingCache=q,this.dataManager=z,this.clientConfiguration=E,this.externalPackageInfo=l,this.consentDataStorage=x,this.visitorCodeManager=m,this.eventManager=D,null!==i.cleanupInterval&&new _storage.StorageCleanupManager(j,i.cleanupInterval),_logging.KameleoonLogger.debug`RETURN: new KameleoonClient(siteCode: ${c}, dependencies: ${d}, configuration: ${e})`}async initialize(){if(this.stubMode)return!1;_logging.KameleoonLogger.info("CALL: KameleoonClient.initialize()");const a=await this.clientConfiguration.initialize();return a.throw(),this.initialized=!0,_logging.KameleoonLogger.info`RETURN: KameleoonClient.initialize() -> (result: ${a.ok})`,a.ok}addData(a){if(this.stubMode)throw new _kameleoonError.KameleoonError(_kameleoonError.KameleoonException.Initialization);for(var b=arguments.length,c=Array(1<b?b-1:0),d=1;d<b;d++)c[d-1]=arguments[d];if(_logging.KameleoonLogger.info`CALL: KameleoonClient.addData(visitorCode: ${a}, data: ${c})`,this.visitorCodeManager.validateVisitorCode(a).throw(),!this.initialized)throw new _kameleoonError.KameleoonError(_kameleoonError.KameleoonException.Initialization);this.dataManager.storeData(a,...c).throw(),_logging.KameleoonLogger.info`RETURN: KameleoonClient.addData(visitorCode: ${a}, data: ${c})`}async getRemoteVisitorData(a){let{visitorCode:b,shouldAddData:c=!0,filters:d=_constants.DEFAULT_VISITOR_DATA_FILTERS}=a;if(this.stubMode)throw new _kameleoonError.KameleoonError(_kameleoonError.KameleoonException.Initialization);if(_logging.KameleoonLogger.info`CALL: KameleoonClient.getRemoteVisitorData(visitorCode: ${b}, shouldAddData: ${c}, filters: ${d})`,!this.initialized)throw new _kameleoonError.KameleoonError(_kameleoonError.KameleoonException.Initialization);this.visitorCodeManager.validateVisitorCode(b).throw();const{previousVisitAmount:e}=d;if("number"==typeof e&&(1>e||25<e))throw new _kameleoonError.KameleoonError(_kameleoonError.KameleoonException.VisitAmount);const f=this.dataManager.isUniqueIdentifier(b),g=await this.requester.getVisitorData({visitorCode:b,filters:d,isMappingIdentifier:f}),h=g.throw(),{visitorData:i,storageVisitorData:j,visitsData:k,mappingIdentifier:l}=_utilities.Parser.parseVisitorData({data:h,filters:d,visitorCode:b,dataManager:this.dataManager,variationConfiguration:this.variationConfiguration});for(const d of j)(c||this.dataManager.isPersistentCustomData(d))&&this.addData(b,d);return k&&c&&this.addData(b,k),null!==d&&void 0!==d&&d.visitorCode&&l&&this.dataManager.setMappingIdentifier(b,l),_logging.KameleoonLogger.info`RETURN: KameleoonClient.getRemoteVisitorData(visitorCode: ${b}, shouldAddData: ${c}, filters: ${d}) -> (visitorData: ${i})`,i}trackConversion(a){let{visitorCode:b,goalId:c,revenue:d}=a;this.stubMode||(_logging.KameleoonLogger.info`CALL: KameleoonClient.trackConversion(visitorCode: ${b}, goalId: ${c}, revenue: ${d})`,this.addData(b,new _kameleoonData.Conversion({goalId:c,revenue:d})),this.flush(b),_logging.KameleoonLogger.info`RETURN: KameleoonClient.trackConversion(visitorCode: ${b}, goalId: ${c}, revenue: ${d})`)}flush(a){if(this.stubMode)throw new _kameleoonError.KameleoonError(_kameleoonError.KameleoonException.Initialization);if(_logging.KameleoonLogger.info`CALL: KameleoonClient.flush(visitorCode: ${a})`,!this.initialized)throw new _kameleoonError.KameleoonError(_kameleoonError.KameleoonException.Initialization);if("string"==typeof a)return this.visitorCodeManager.validateVisitorCode(a).throw(),this.tracker.scheduleVisitor(a,this._isConsentProvided(a)),void _logging.KameleoonLogger.info`RETURN: KameleoonClient.flush(visitorCode: ${a})`;for(const b of this.dataManager.unsentDataVisitors)this.tracker.scheduleVisitor(b,this._isConsentProvided(b));_logging.KameleoonLogger.info`RETURN: KameleoonClient.flush(visitorCode: ${a})`}getFeatureFlags(){if(this.stubMode)throw new _kameleoonError.KameleoonError(_kameleoonError.KameleoonException.Initialization);if(_logging.KameleoonLogger.info("CALL: KameleoonClient.getFeatureFlags()"),!this.initialized)throw new _kameleoonError.KameleoonError(_kameleoonError.KameleoonException.Initialization);const a=this.clientConfiguration.featureFlags,b=[];return a.forEach(a=>{let{id:c,featureKey:d}=a;b.push({id:c,key:d})}),_logging.KameleoonLogger.info`RETURN: KameleoonClient.getFeatureFlags() -> (FeatureFlags: ${b})`,b}getVisitorFeatureFlags(a){if(this.stubMode)throw new _kameleoonError.KameleoonError(_kameleoonError.KameleoonException.Initialization);if(_logging.KameleoonLogger.info`CALL: KameleoonClient.getVisitorFeatureFlags(visitorCode: ${a})`,!this.initialized)throw new _kameleoonError.KameleoonError(_kameleoonError.KameleoonException.Initialization);this.visitorCodeManager.validateVisitorCode(a).throw();const b=this._getActiveFeatureVariations(a),c=[];return b.forEach(a=>{let{featureFlagId:b,featureKey:d}=a;c.push({id:b,key:d})}),_logging.KameleoonLogger.info`RETURN: KameleoonClient.getVisitorFeatureFlags(visitorCode: ${a}) -> (FeatureFlags: ${c})`,c}getVariation(a){let{visitorCode:b,featureKey:c,track:d=!0}=a;if(this.stubMode)throw new _kameleoonError.KameleoonError(_kameleoonError.KameleoonException.Initialization);_logging.KameleoonLogger.info`CALL: KameleoonClient.getVariation(visitorCode: ${b}, featureKey: ${c}, track: ${d})`,this.visitorCodeManager.validateVisitorCode(b).throw();const e=this._getFeatureVariation({visitorCode:b,featureKey:c,track:d}).throw();return _logging.KameleoonLogger.info`RETURN: KameleoonClient.getVariation(visitorCode: ${b}, featureKey: ${c}, track: ${d}) -> (variation: ${e})`,e}getVariations(a){let{visitorCode:b,onlyActive:c=!1,track:d=!0}=a;if(this.stubMode)throw new _kameleoonError.KameleoonError(_kameleoonError.KameleoonException.Initialization);_logging.KameleoonLogger.info`CALL: KameleoonClient.getVariations(visitorCode: ${b}, onlyActive: ${c}, track: ${d})`,this.visitorCodeManager.validateVisitorCode(b).throw();const e=new Map,f=this.clientConfiguration.featureFlags;for(const g of f.values()){const a=this._getFeatureVariation({visitorCode:b,featureKey:g.featureKey,track:d});a.ok&&(!c||a.data.key!==_constants.OFF_VARIATION_KEY)&&e.set(g.featureKey,a.data)}return _logging.KameleoonLogger.info`RETURN: KameleoonClient.getVariations(visitorCode: ${b}, onlyActive: ${c}, track: ${d}) -> (variations: ${e})`,e}getActiveFeatureFlags(a){if(this.stubMode)throw new _kameleoonError.KameleoonError(_kameleoonError.KameleoonException.Initialization);if(_logging.KameleoonLogger.info`CALL: KameleoonClient.getActiveFeatureFlags(visitorCode: ${a})`,!this.initialized)throw new _kameleoonError.KameleoonError(_kameleoonError.KameleoonException.Initialization);this.visitorCodeManager.validateVisitorCode(a).throw();const b=this._getActiveFeatureVariations(a),c=new Map;return b.forEach(b=>{const{variationKey:d,featureKey:e,variationId:f,experimentId:g}=b;let h=[];null!==f&&null!==g&&(h=this._getFeatureVariables({visitorCode:a,featureKey:e,variationKey:d}));const i=h.map(a=>_utilities.Parser.parseFeatureVariable(a).throw());c.set(b.featureKey,{key:d,id:f,experimentId:g,variables:i})}),_logging.KameleoonLogger.info`RETURN: KameleoonClient.getActiveFeatureFlags(visitorCode: ${a}) -> (FeatureFlags: ${c})`,c}getFeatureFlagVariationKey(a,b){if(this.stubMode)throw new _kameleoonError.KameleoonError(_kameleoonError.KameleoonException.Initialization);_logging.KameleoonLogger.info`CALL: KameleoonClient.getFeatureFlagVariationKey(visitorCode: ${a}, featureKey: ${b})`,this.visitorCodeManager.validateVisitorCode(a).throw();const{key:c}=this._getFeatureVariation({visitorCode:a,featureKey:b,track:!0}).throw();return _logging.KameleoonLogger.info`RETURN: KameleoonClient.getFeatureFlagVariationKey(visitorCode: ${a}, featureKey: ${b}) -> (variationKey: ${c})`,c}getFeatureFlagVariable(a){let{visitorCode:b,featureKey:c,variableKey:d}=a;if(this.stubMode)throw new _kameleoonError.KameleoonError(_kameleoonError.KameleoonException.Initialization);_logging.KameleoonLogger.info`CALL: KameleoonClient.getFeatureFlagVariable(visitorCode: ${b}, featureKey: ${c}, variableKey: ${d})`,this.visitorCodeManager.validateVisitorCode(b).throw();const{key:e}=this._getFeatureVariation({visitorCode:b,featureKey:c,track:!0}).throw(),f=this._getFeatureVariables({visitorCode:b,featureKey:c,variationKey:e}),g=f.find(a=>a.key===d);if(!g)throw new _kameleoonError.KameleoonError(_kameleoonError.KameleoonException.FeatureFlagVariableNotFound,d,b);const{type:h,value:i}=_utilities.Parser.parseFeatureVariable(g).throw(),j={type:h,value:i};return _logging.KameleoonLogger.info`RETURN: KameleoonClient.getFeatureFlagVariable(visitorCode: ${b}, featureKey: ${c}, variableKey: ${d}) -> (FeatureFlagVariable: ${j})`,j}getFeatureFlagVariables(a,b){if(this.stubMode)throw new _kameleoonError.KameleoonError(_kameleoonError.KameleoonException.Initialization);_logging.KameleoonLogger.info`CALL: KameleoonClient.getFeatureFlagVariables(visitorCode: ${a}, featureKey: ${b})`,this.visitorCodeManager.validateVisitorCode(a).throw();const{key:c}=this._getFeatureVariation({visitorCode:a,featureKey:b,track:!0}).throw(),d=this._getFeatureVariables({visitorCode:a,featureKey:b,variationKey:c}),e=[];for(const c of d){const a=_utilities.Parser.parseFeatureVariable(c).throw();e.push(a)}return _logging.KameleoonLogger.info`RETURN: KameleoonClient.getFeatureFlagVariables(visitorCode: ${a}, featureKey: ${b}) -> (FeatureFlagVariables: ${e})`,e}isFeatureFlagActive(a,b){if(this.stubMode)throw new _kameleoonError.KameleoonError(_kameleoonError.KameleoonException.Initialization);let[c,d,e]=["","",!0];"string"==typeof a?(_logging.KameleoonLogger.info`CALL: KameleoonClient.isFeatureFlagActive(visitorCode: ${c}, featureKey: ${d})`,c=a,d=b):(_logging.KameleoonLogger.info`CALL: KameleoonClient.isFeatureFlagActive(visitorCode: ${c}, featureKey: ${d}, track ${e})`,[c,d]=[a.visitorCode,a.featureKey],a.track!==void 0&&(e=a.track)),this.visitorCodeManager.validateVisitorCode(c).throw();try{const{key:a}=this._getFeatureVariation({visitorCode:c,featureKey:d,track:e}).throw(),b=a!==_constants.OFF_VARIATION_KEY;return _logging.KameleoonLogger.info`RETURN: KameleoonClient.isFeatureFlagActive(visitorCode: ${c}, featureKey: ${d}, track: ${e}) -> (isActive: ${b})`,b}catch(a){if(a instanceof _kameleoonError.KameleoonError&&a.type===_kameleoonError.KameleoonException.FeatureFlagEnvironmentDisabled)return _logging.KameleoonLogger.info`RETURN: KameleoonClient.isFeatureFlagActive(visitorCode: ${c}, featureKey: ${d}, track: ${e}) -> (isActive: false)`,!1;throw a}}async getRemoteData(a){if(this.stubMode)return null;_logging.KameleoonLogger.info`CALL: KameleoonClient.getRemoteData(key: ${a})`;const b=await this.requester.getRemoteData(a);return _logging.KameleoonLogger.info`RETURN: KameleoonClient.getRemoteData(key: ${a}) -> (remoteData: ${b})`,b.throw()}async getVisitorWarehouseAudience(a){let{visitorCode:b,customDataIndex:c,warehouseKey:d}=a;if(this.stubMode)return null;_logging.KameleoonLogger.info`CALL: KameleoonClient.getVisitorWarehouseAudience(visitorCode: ${b}, customDataIndex: ${c}, warehouseKey: ${d})`,this.visitorCodeManager.validateVisitorCode(b).throw();const e=await this.getRemoteData(d||b);if(!e)throw new _kameleoonError.KameleoonError(_kameleoonError.KameleoonException.RemoteData,`No data found for ${d||b} key`);if(!e[_constants.WAREHOUSE_AUDIENCE_KEY]||0===Object.keys(e[_constants.WAREHOUSE_AUDIENCE_KEY]).length)return _logging.KameleoonLogger.info`RETURN: KameleoonClient.getVisitorWarehouseAudience(visitorCode: ${b}, customDataIndex: ${c}, warehouseKey: ${d}) -> (customData: null)`,null;const f=new _kameleoonData.CustomData(c,...Object.keys(e[_constants.WAREHOUSE_AUDIENCE_KEY]));return this.dataManager.storeData(b,f),_logging.KameleoonLogger.info`RETURN: KameleoonClient.getVisitorWarehouseAudience(visitorCode: ${b}, customDataIndex: ${c}, warehouseKey: ${d}) -> (customData: ${f})`,f}onEvent(a,b){if(this.stubMode)throw new _kameleoonError.KameleoonError(_kameleoonError.KameleoonException.Initialization);if(_logging.KameleoonLogger.info`CALL: KameleoonClient.onEvent(event: ${a}, callback)`,!this.initialized)throw new _kameleoonError.KameleoonError(_kameleoonError.KameleoonException.Initialization);this.eventManager.addEventHandler(a,b),_logging.KameleoonLogger.info`RETURN: KameleoonClient.onEvent(event: ${a}, callback)`}getEngineTrackingCode(a){if(this.stubMode)return"";_logging.KameleoonLogger.info`CALL: KameleoonClient.getEngineTrackingCode(visitorCode: ${a})`,this.visitorCodeManager.validateVisitorCode(a).throw();const b=_utilities.Utilities.getTrackingCode(this.trackingCache,a);return _logging.KameleoonLogger.info`RETURN: KameleoonClient.getEngineTrackingCode(visitorCode: ${a}) -> (trackingCode: ${b})`,b}isInitialized(){return _logging.KameleoonLogger.debug`CALL/RETURN: KameleoonClient.isInitialized() -> (initialized: ${this.initialized})`,this.initialized}setLogLevel(a){_logging.KameleoonLogger.setLogLevel(a)}setForcedVariation(a){let{visitorCode:b,experimentId:c,variationKey:d,forceTargeting:e=!0}=a;this.stubMode||(_logging.KameleoonLogger.info`CALL: KameleoonClient.setForcedVariation(visitorCode: '${b}', experimentId: ${c}, variationKey: '${d}', forceTargeting: ${e})`,this.visitorCodeManager.validateVisitorCode(b).throw(),this._setForcedVariation({visitorCode:b,experimentId:c,variationKey:d,forceTargeting:e}).throw(),_logging.KameleoonLogger.info`RETURN: KameleoonClient.setForcedVariation(visitorCode: '${b}', experimentId: ${c}, variationKey: '${d}', forceTargeting: ${e})`)}setUserConsent(a){let{visitorCode:b,consent:c,setData:d}=a;this.stubMode||(_logging.KameleoonLogger.info`CALL: KameleoonClient.setUserConsent(visitorCode: ${b}, consent: ${c}, setData: ${d})`,this.visitorCodeManager.validateVisitorCode(b).throw(),this.updateConsentData(b,c),c?d({visitorCode:b,key:_storage.KameleoonStorageKey.VisitorCode,maxAge:_visitorCodeManager.DEFAULT_MAX_AGE,path:_visitorCodeManager.PATH}):this.visitorCodeManager.consentRequired&&d({visitorCode:"",key:_storage.KameleoonStorageKey.VisitorCode,maxAge:_visitorCodeManager.ZERO_MAX_AGE,path:_visitorCodeManager.PATH}),_logging.KameleoonLogger.info`RETURN: KameleoonClient.setUserConsent(visitorCode: ${b}, consent: ${c}, setData: ${d})`)}updateConsentData(a,b){const c=this.consentDataStorage.read();if(!c.ok)return void(c.error.type===_kameleoonError.KameleoonException.StorageEmpty&&this.consentDataStorage.write({[a]:{consent:b}}));const d=c.data;d[a]={consent:b},this.consentDataStorage.write(d)}_isConsentProvided(a){_logging.KameleoonLogger.debug`CALL: KameleoonClient._isConsentProvided(visitorCode: ${a})`;const{isConsentRequired:b}=this.clientConfiguration,c=this.consentDataStorage.read();let d=!1;if(!b)d=!0;else if(c.ok){const b=c.data[a];d="boolean"==typeof b?b:b&&b.consent}return _logging.KameleoonLogger.debug`RETURN: KameleoonClient._isConsentProvided(visitorCode: ${a}) -> (isConsentProvided: ${d})`,d}_getFeatureVariables(a){let{visitorCode:b,featureKey:c,variationKey:d}=a;_logging.KameleoonLogger.debug`CALL: KameleoonClient._getFeatureVariables(visitorCode: ${b}, featureKey: ${c}, variationKey: ${d})`;const e=this.clientConfiguration.featureFlags,f=e.get(c);if(!f)throw new _kameleoonError.KameleoonError(_kameleoonError.KameleoonException.FeatureFlagConfigurationNotFound,c);const g=f.variations.find(a=>a.key===d);if(!g)throw new _kameleoonError.KameleoonError(_kameleoonError.KameleoonException.FeatureFlagVariationNotFound,d,b);return _logging.KameleoonLogger.debug`RETURN: KameleoonClient._getFeatureVariables(visitorCode: ${b}, featureKey: ${c}, variationKey: ${d}) -> (variables: ${g.variables})`,g.variables}_getActiveFeatureVariations(a){_logging.KameleoonLogger.debug`CALL: KameleoonClient._getActiveFeatureVariations(visitorCode: ${a})`;const b=this.clientConfiguration.featureFlags,c=[];for(const d of b.values()){if(!d.environmentEnabled)continue;const b=this._evaluate({visitorCode:a,featureFlag:d,track:!1,save:!1});b.variationKey!==_constants.OFF_VARIATION_KEY&&c.push({variationKey:b.variationKey,variationId:b.variationId,experimentId:b.experimentId,featureFlagId:d.id,featureKey:d.featureKey,rule:null,isTargetedRule:b.ruleType===_clientConfiguration.RuleType.TARGETED_DELIVERY})}return _logging.KameleoonLogger.debug`RETURN: KameleoonClient._getActiveFeatureVariations(visitorCode: ${a}) -> (activeVariations: ${c})`,c}_evaluate(a){let{visitorCode:b,featureFlag:c,track:d,save:e}=a;_logging.KameleoonLogger.debug`CALL: KameleoonClient._evaluate(visitorCode: ${b}, featureFlag: ${c}, track: ${d}, save: ${e})`;let f,g=null;const h=this.variationConfiguration.getForcedFeatureVariation(b,c.featureKey);if(h.ok&&(g=h.data),g)f=KameleoonClient.EvaluatedExperiment.fromForcedFeatureVariation(c.defaultVariationKey,g);else if(this._isVisitorNotInHoldout(b,d,e)&&this._isFFUnrestrictedByMEGroup(b,c)){const a=this.dataManager.getVisitorData(b),g=this.dataManager.getVisitorIdentifier(b),h=this.variationConfiguration.getVariation({visitorCode:b,visitorIdentifier:g,featureFlag:c,track:d,withAssignment:e,targetingData:a,clientConfiguration:this.clientConfiguration,dataManager:this.dataManager,packageInfo:this.externalPackageInfo}).throw();f=KameleoonClient.EvaluatedExperiment.fromVariationData(h)}else f=KameleoonClient.EvaluatedExperiment.fromDefaultVariationKey(c.defaultVariationKey);return e&&!f.isSimulated&&null!==f.experimentId&&null!==f.variationId&&this.variationConfiguration.updateStoredVariations(b,{[f.experimentId]:{variationId:f.variationId,isTargetedRule:f.ruleType===_clientConfiguration.RuleType.TARGETED_DELIVERY,status:d?_types.TrackingStatus.Unsent:_types.TrackingStatus.Sent}}),this.eventManager.fireEvent(_eventManager.EventType.Evaluation,{featureKey:c.featureKey,variation:{key:f.variationKey,experimentId:f.experimentId,id:f.variationId}}),_logging.KameleoonLogger.debug`RETURN: KameleoonClient._evaluate(visitorCode: ${b}, featureFlag: ${c}, track: ${d}, save: ${e}) -> (evalExp: ${f})`,f}_isFFUnrestrictedByMEGroup(a,b){const c=b.mutuallyExclusiveGroup;if(!c)return!0;_logging.KameleoonLogger.debug`CALL: KameleoonClient._isFFUnrestrictedByMEGroup(visitorCode: ${a}, featureFlag: ${b})`;let d=!0;const e=this.clientConfiguration.meGroups.get(c);if(e){const f=this.dataManager.getVisitorIdentifier(a),g=_hasher.Hasher.getHashDoubleForMEGroup(f,c);_logging.KameleoonLogger.debug`Calculated meGroup hash ${g} for code: '${f}', meGroup: '${c}'`,d=e.getFeatureFlagByHash(g)===b}return _logging.KameleoonLogger.debug`RETURN: KameleoonClient._isFFUnrestrictedByMEGroup(visitorCode: '${a}', featureFlag: ${b}) -> (selected: ${d})`,d}_getFeatureVariation(a){let{visitorCode:b,featureKey:c,track:d}=a;if(_logging.KameleoonLogger.debug`CALL: KameleoonClient._getFeatureVariation(visitorCode: ${b}, featureKey: ${c}, track: ${d})`,!this.initialized)return(0,_tsRes.Err)(new _kameleoonError.KameleoonError(_kameleoonError.KameleoonException.Initialization));const e=this.clientConfiguration.featureFlags,f=e.get(c);if(!f)return(0,_tsRes.Err)(new _kameleoonError.KameleoonError(_kameleoonError.KameleoonException.FeatureFlagConfigurationNotFound,c));if(!f.environmentEnabled)return(0,_tsRes.Err)(new _kameleoonError.KameleoonError(_kameleoonError.KameleoonException.FeatureFlagEnvironmentDisabled,f.featureKey,this.environment));const g=this._evaluate({visitorCode:b,featureFlag:f,track:d,save:!0}),{experimentId:h,variationId:i,variationKey:j,isSimulated:k}=g;let l=new Map,m=!1;try{const a=this._getFeatureVariables({visitorCode:b,featureKey:c,variationKey:j});a.forEach(a=>{m||a.type!==_types.VariableType.JS&&a.type!==_types.VariableType.CSS||(m=!0);const b=_utilities.Parser.parseFeatureVariable(a).throw();l.set(a.key,b)})}catch(_){}h&&"number"==typeof i&&!k&&_utilities.Utilities.updateCache({cacheManager:this.trackingCache,hasJsCssVariables:m,visitorCode:b,experimentId:h,variationId:i}),d&&!k&&this.tracker.scheduleVisitor(b,this._isConsentProvided(b));const n={key:j,id:i,experimentId:h,variables:l};return _logging.KameleoonLogger.debug`RETURN: KameleoonClient._getFeatureVariation(visitorCode: ${b}, featureKey: ${c}, track: ${d}) -> (variation: ${n})`,(0,_tsRes.Ok)(n)}_isVisitorNotInHoldout(a,b,c){const d=this.clientConfiguration.holdout;if(!d)return!0;_logging.KameleoonLogger.debug`CALL: KameleoonClient._isVisitorNotInHoldout(visitorCode: ${a}, track: ${b}, save: ${c})`;let e=!0;const f=this.dataManager.getVisitorIdentifier(a),g=_hasher.Hasher.getHashDouble({visitorIdentifier:f,respoolTime:null,id:d.experimentId+""});_logging.KameleoonLogger.debug`Calculated holdoutHash: ${g} for visitorCode: ${f}`;let h=_utilities.Utilities.getVariationByHash(d.variationByExposition,g);return null!==h&&(e=h.variationKey!==_constants.IN_HOLDOUT_VARIATION_KEY,c&&this.variationConfiguration.updateStoredVariations(a,{[d.experimentId]:{variationId:h.variationId,isTargetedRule:!1,status:b?_types.TrackingStatus.Unsent:_types.TrackingStatus.Sent}})),_logging.KameleoonLogger.debug`RETURN: KameleoonClient._isVisitorNotInHoldout(visitorCode: ${a}, track: ${b}, save: ${c}) -> (isNotInHoldout: ${e})`,e}_setForcedVariation(a){let{visitorCode:b,experimentId:c,variationKey:d,forceTargeting:e=!0}=a;if(_logging.KameleoonLogger.debug`CALL: KameleoonClient._setForcedVariation(visitorCode: '${b}', experimentId: ${c}, variationKey: '${d}', forceTargeting: ${e})`,null===d){const a=this.variationConfiguration.updateForcedExperimentVariation(b,c,null);return _logging.KameleoonLogger.debug`RETURN: KameleoonClient._setForcedVariation(visitorCode: '${b}', experimentId: ${c}, variationKey: '${d}', forceTargeting: ${e}) -> (writeResult: ${a})`,a}let f=null,g=null;if(f=this.clientConfiguration.experimentMap.get(c),!f)return _logging.KameleoonLogger.error`Experiment with id ${c} not found for visitor ${b}`,(0,_tsRes.Err)(new _kameleoonError.KameleoonError(_kameleoonError.KameleoonException.FeatureFlagExperimentNotFound,c,b));if(g=f.variations.get(d),void 0===g)return _logging.KameleoonLogger.error`Variation with key ${d} not found in experiment ${f} for visitor ${b}`,(0,_tsRes.Err)(new _kameleoonError.KameleoonError(_kameleoonError.KameleoonException.FeatureFlagVariationNotFound,d,b));f={type:f.type,experimentId:c},g={variationKey:d,variationId:g};const h=this.variationConfiguration.updateForcedExperimentVariation(b,c,{rule:f,varByExp:g,forceTargeting:e});return _logging.KameleoonLogger.debug`RETURN: KameleoonClient._setForcedVariation(visitorCode: '${b}', experimentId: ${c}, variationKey: '${d}', forceTargeting: ${e}) -> (writeResult: ${h})`,h}}exports.KameleoonClient=KameleoonClient,_defineProperty(KameleoonClient,"EvaluatedExperiment",class{static fromForcedFeatureVariation(a,b){var c,d,e;let f=a;return b.varByExp?f=b.varByExp.variationKey:b.rule&&b.rule.type===_clientConfiguration.RuleType.EXPERIMENTATION&&(f=_constants.OFF_VARIATION_KEY),{variationKey:f,variationId:(null===(c=b.varByExp)||void 0===c?void 0:c.variationId)||null,experimentId:(null===(d=b.rule)||void 0===d?void 0:d.experimentId)||null,ruleType:(null===(e=b.rule)||void 0===e?void 0:e.type)||null,isSimulated:b.simulated}}static fromVariationData(a){var b,c;return{variationKey:a.variationKey,variationId:a.variationId,experimentId:a.experimentId,ruleType:null!==(b=null===(c=a.rule)||void 0===c?void 0:c.type)&&void 0!==b?b:null,isSimulated:!1}}static fromDefaultVariationKey(a){return{variationKey:a,variationId:null,experimentId:null,ruleType:null,isSimulated:!1}}});
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.KameleoonClient=void 0;var _tsRes=require("ts-res"),_cacheManager=require("./cacheManager"),_clientConfiguration=require("./clientConfiguration"),_clientSettings=require("./clientSettings"),_constants=require("./constants"),_kameleoonData=require("./kameleoonData"),_kameleoonError=require("./kameleoonError"),_requester=require("./requester"),_storage=require("./storage"),_types=require("./types"),_utilities=require("./utilities"),_variationConfiguration=require("./variationConfiguration"),_eventSource=require("./eventSource"),_visitorCodeManager=require("./visitorCodeManager"),_eventManager=require("./eventManager"),_tracking=require("./tracking"),_logging=require("./logging"),_hasher=require("./hasher");function _defineProperty(a,b,c){return(b=_toPropertyKey(b))in a?Object.defineProperty(a,b,{value:c,enumerable:!0,configurable:!0,writable:!0}):a[b]=c,a}function _toPropertyKey(a){var b=_toPrimitive(a,"string");return"symbol"==typeof b?b:b+""}function _toPrimitive(a,b){if("object"!=typeof a||!a)return a;var c=a[Symbol.toPrimitive];if(void 0!==c){var d=c.call(a,b||"default");if("object"!=typeof d)return d;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===b?String:Number)(a)}class KameleoonClient{constructor(a){var b;let{siteCode:c,dependencies:d,configuration:e,internalConfiguration:f,stubMode:g}=a;if(_defineProperty(this,"variationConfiguration",void 0),_defineProperty(this,"clientConfiguration",void 0),_defineProperty(this,"dataManager",void 0),_defineProperty(this,"consentDataStorage",void 0),_defineProperty(this,"trackingCache",void 0),_defineProperty(this,"requester",void 0),_defineProperty(this,"externalPackageInfo",void 0),_defineProperty(this,"initialized",!1),_defineProperty(this,"visitorCodeManager",void 0),_defineProperty(this,"eventManager",void 0),_defineProperty(this,"tracker",void 0),_defineProperty(this,"environment",void 0),_defineProperty(this,"stubMode",void 0),this.stubMode=g,g)return this.variationConfiguration={},this.clientConfiguration={},this.dataManager={},this.consentDataStorage={},this.trackingCache={},this.requester={},this.externalPackageInfo={},this.visitorCodeManager={},this.eventManager={},this.tracker={},void(this.environment="");const h=null===f||void 0===f?void 0:f.externals.externalLogger;h&&_logging.KameleoonLogger.setLogger(h),_logging.KameleoonLogger.debug`CALL: new KameleoonClient(siteCode: ${c}, dependencies: ${d}, configuration: ${e})`;const{settings:i}=new _clientSettings.ClientSettings(c,e);this.environment=i.environment;const{externalStorage:j,externalEventSource:k,externalPackageInfo:l,externalVisitorCodeManager:m,externalRequester:n,externalPRNG:o}=f.externals,{useAbortController:p}=f.settings,q=new _cacheManager.CacheManager(_constants.CACHE_CLEANUP_TIMEOUT),r=new _storage.DataStorage(j,_storage.KameleoonStorageKey.ClientData),s=new _storage.DataStorage(j,_storage.KameleoonStorageKey.TargetingData),t=new _storage.DataStorage(j,_storage.KameleoonStorageKey.DataInfo),u=new _storage.DataStorage(j,_storage.KameleoonStorageKey.VariationData),v=new _storage.DataStorage(j,_storage.KameleoonStorageKey.ForcedExperimentVariation),w=new _storage.DataStorage(j,_storage.KameleoonStorageKey.ForcedFeatureVariation),x=new _storage.DataStorage(j,_storage.KameleoonStorageKey.ConsentData),y=new _storage.DataStorage(j,_storage.KameleoonStorageKey.TrackingData),z=new _kameleoonData.DataManager({dataStorage:s,infoStorage:t,cleanupInterval:i.cleanupInterval,packageInfo:l}),A=null!==(b=null===d||void 0===d?void 0:d.urlProvider)&&void 0!==b?b:new _requester.UrlProvider;A.initialize({domain:i.networkDomain,siteCode:i.siteCode,packageInfo:l,environment:i.environment});const B=new _requester.Requester({urlProvider:A,useAbortController:p,packageInfo:l,externalRequester:n,requestTimeout:i.requestTimeout,trackRetryDelay:i.trackRetryDelay}),C=new _eventSource.KameleoonEventSource({siteCode:i.siteCode,externalEventSource:k,urlProvider:A}),D=new _eventManager.EventManager,E=new _clientConfiguration.ClientConfiguration({urlProvider:A,storage:r,updateInterval:i.updateInterval,dataManager:z,eventManager:D,requester:B,eventSource:C,externalVisitorCodeManager:m}),F=new _variationConfiguration.VariationConfiguration(u,v,w,m,E),G=new _tracking.Tracker({dataManager:z,trackingStorage:y,variationConfiguration:F,requester:B,trackingInterval:i.trackingInterval,prng:o});this.tracker=G,this.variationConfiguration=F,this.requester=B,this.trackingCache=q,this.dataManager=z,this.clientConfiguration=E,this.externalPackageInfo=l,this.consentDataStorage=x,this.visitorCodeManager=m,this.eventManager=D,null!==i.cleanupInterval&&new _storage.StorageCleanupManager(j,i.cleanupInterval),_logging.KameleoonLogger.debug`RETURN: new KameleoonClient(siteCode: ${c}, dependencies: ${d}, configuration: ${e})`}async initialize(){if(this.stubMode)return!1;_logging.KameleoonLogger.info("CALL: KameleoonClient.initialize()");const a=await this.clientConfiguration.initialize();return a.throw(),this.initialized=!0,_logging.KameleoonLogger.info`RETURN: KameleoonClient.initialize() -> (result: ${a.ok})`,a.ok}addData(a){if(this.stubMode)throw new _kameleoonError.KameleoonError(_kameleoonError.KameleoonException.Initialization);for(var b=arguments.length,c=Array(1<b?b-1:0),d=1;d<b;d++)c[d-1]=arguments[d];if(_logging.KameleoonLogger.info`CALL: KameleoonClient.addData(visitorCode: ${a}, data: ${c})`,this.visitorCodeManager.validateVisitorCode(a).throw(),!this.initialized)throw new _kameleoonError.KameleoonError(_kameleoonError.KameleoonException.Initialization);this.dataManager.storeData(a,...c).throw(),_logging.KameleoonLogger.info`RETURN: KameleoonClient.addData(visitorCode: ${a}, data: ${c})`}async getRemoteVisitorData(a){let{visitorCode:b,shouldAddData:c=!0,filters:d=_constants.DEFAULT_VISITOR_DATA_FILTERS}=a;if(this.stubMode)throw new _kameleoonError.KameleoonError(_kameleoonError.KameleoonException.Initialization);if(_logging.KameleoonLogger.info`CALL: KameleoonClient.getRemoteVisitorData(visitorCode: ${b}, shouldAddData: ${c}, filters: ${d})`,!this.initialized)throw new _kameleoonError.KameleoonError(_kameleoonError.KameleoonException.Initialization);this.visitorCodeManager.validateVisitorCode(b).throw();const{previousVisitAmount:e}=d;if("number"==typeof e&&(1>e||25<e))throw new _kameleoonError.KameleoonError(_kameleoonError.KameleoonException.VisitAmount);const f=this.dataManager.isUniqueIdentifier(b),g=await this.requester.getVisitorData({visitorCode:b,filters:d,isMappingIdentifier:f}),h=g.throw(),{visitorData:i,storageVisitorData:j,visitsData:k,mappingIdentifier:l}=_utilities.Parser.parseVisitorData({data:h,filters:d,visitorCode:b,dataManager:this.dataManager,variationConfiguration:this.variationConfiguration});for(const d of j)(c||this.dataManager.isPersistentCustomData(d))&&this.addData(b,d);return k&&c&&this.addData(b,k),null!==d&&void 0!==d&&d.visitorCode&&l&&this.dataManager.setMappingIdentifier(b,l),_logging.KameleoonLogger.info`RETURN: KameleoonClient.getRemoteVisitorData(visitorCode: ${b}, shouldAddData: ${c}, filters: ${d}) -> (visitorData: ${i})`,i}trackConversion(a){let{visitorCode:b,goalId:c,negative:d,revenue:e,metadata:f}=a;this.stubMode||(_logging.KameleoonLogger.info`CALL: KameleoonClient.trackConversion(visitorCode: ${b}, goalId: ${c}, negative: ${d}, revenue: ${e}, metadata: ${f})`,this.addData(b,new _kameleoonData.Conversion({goalId:c,revenue:e,negative:d,metadata:f})),this.flush(b),_logging.KameleoonLogger.info`RETURN: KameleoonClient.trackConversion(visitorCode: ${b}, goalId: ${c}, negative: ${d}, revenue: ${e}, metadata: ${f})`)}flush(a){if(this.stubMode)throw new _kameleoonError.KameleoonError(_kameleoonError.KameleoonException.Initialization);if(_logging.KameleoonLogger.info`CALL: KameleoonClient.flush(visitorCode: ${a})`,!this.initialized)throw new _kameleoonError.KameleoonError(_kameleoonError.KameleoonException.Initialization);if("string"==typeof a)return this.visitorCodeManager.validateVisitorCode(a).throw(),this.tracker.scheduleVisitor(a,this._isConsentProvided(a)),void _logging.KameleoonLogger.info`RETURN: KameleoonClient.flush(visitorCode: ${a})`;for(const b of this.dataManager.unsentDataVisitors)this.tracker.scheduleVisitor(b,this._isConsentProvided(b));_logging.KameleoonLogger.info`RETURN: KameleoonClient.flush(visitorCode: ${a})`}getFeatureFlags(){if(this.stubMode)throw new _kameleoonError.KameleoonError(_kameleoonError.KameleoonException.Initialization);if(_logging.KameleoonLogger.info("CALL: KameleoonClient.getFeatureFlags()"),!this.initialized)throw new _kameleoonError.KameleoonError(_kameleoonError.KameleoonException.Initialization);const a=this.clientConfiguration.featureFlags,b=[];return a.forEach(a=>{let{id:c,featureKey:d}=a;b.push({id:c,key:d})}),_logging.KameleoonLogger.info`RETURN: KameleoonClient.getFeatureFlags() -> (FeatureFlags: ${b})`,b}getVisitorFeatureFlags(a){if(this.stubMode)throw new _kameleoonError.KameleoonError(_kameleoonError.KameleoonException.Initialization);if(_logging.KameleoonLogger.info`CALL: KameleoonClient.getVisitorFeatureFlags(visitorCode: ${a})`,!this.initialized)throw new _kameleoonError.KameleoonError(_kameleoonError.KameleoonException.Initialization);this.visitorCodeManager.validateVisitorCode(a).throw();const b=this._getActiveFeatureVariations(a),c=[];return b.forEach(a=>{let{featureFlagId:b,featureKey:d}=a;c.push({id:b,key:d})}),_logging.KameleoonLogger.info`RETURN: KameleoonClient.getVisitorFeatureFlags(visitorCode: ${a}) -> (FeatureFlags: ${c})`,c}getVariation(a){let{visitorCode:b,featureKey:c,track:d=!0}=a;if(this.stubMode)throw new _kameleoonError.KameleoonError(_kameleoonError.KameleoonException.Initialization);_logging.KameleoonLogger.info`CALL: KameleoonClient.getVariation(visitorCode: ${b}, featureKey: ${c}, track: ${d})`,this.visitorCodeManager.validateVisitorCode(b).throw();const e=this._getFeatureVariation({visitorCode:b,featureKey:c,track:d}).throw();return _logging.KameleoonLogger.info`RETURN: KameleoonClient.getVariation(visitorCode: ${b}, featureKey: ${c}, track: ${d}) -> (variation: ${e})`,e}getVariations(a){let{visitorCode:b,onlyActive:c=!1,track:d=!0}=a;if(this.stubMode)throw new _kameleoonError.KameleoonError(_kameleoonError.KameleoonException.Initialization);_logging.KameleoonLogger.info`CALL: KameleoonClient.getVariations(visitorCode: ${b}, onlyActive: ${c}, track: ${d})`,this.visitorCodeManager.validateVisitorCode(b).throw();const e=new Map,f=this.clientConfiguration.featureFlags;for(const g of f.values()){const a=this._getFeatureVariation({visitorCode:b,featureKey:g.featureKey,track:d});a.ok&&(!c||a.data.key!==_constants.OFF_VARIATION_KEY)&&e.set(g.featureKey,a.data)}return _logging.KameleoonLogger.info`RETURN: KameleoonClient.getVariations(visitorCode: ${b}, onlyActive: ${c}, track: ${d}) -> (variations: ${e})`,e}getActiveFeatureFlags(a){if(this.stubMode)throw new _kameleoonError.KameleoonError(_kameleoonError.KameleoonException.Initialization);if(_logging.KameleoonLogger.info`CALL: KameleoonClient.getActiveFeatureFlags(visitorCode: ${a})`,!this.initialized)throw new _kameleoonError.KameleoonError(_kameleoonError.KameleoonException.Initialization);this.visitorCodeManager.validateVisitorCode(a).throw();const b=this._getActiveFeatureVariations(a),c=new Map;return b.forEach(b=>{const{variationKey:d,featureKey:e,variationId:f,experimentId:g}=b;let h=[];null!==f&&null!==g&&(h=this._getFeatureVariables({visitorCode:a,featureKey:e,variationKey:d}));const i=h.map(a=>_utilities.Parser.parseFeatureVariable(a).throw());c.set(b.featureKey,{key:d,id:f,experimentId:g,variables:i})}),_logging.KameleoonLogger.info`RETURN: KameleoonClient.getActiveFeatureFlags(visitorCode: ${a}) -> (FeatureFlags: ${c})`,c}getFeatureFlagVariationKey(a,b){if(this.stubMode)throw new _kameleoonError.KameleoonError(_kameleoonError.KameleoonException.Initialization);_logging.KameleoonLogger.info`CALL: KameleoonClient.getFeatureFlagVariationKey(visitorCode: ${a}, featureKey: ${b})`,this.visitorCodeManager.validateVisitorCode(a).throw();const{key:c}=this._getFeatureVariation({visitorCode:a,featureKey:b,track:!0}).throw();return _logging.KameleoonLogger.info`RETURN: KameleoonClient.getFeatureFlagVariationKey(visitorCode: ${a}, featureKey: ${b}) -> (variationKey: ${c})`,c}getFeatureFlagVariable(a){let{visitorCode:b,featureKey:c,variableKey:d}=a;if(this.stubMode)throw new _kameleoonError.KameleoonError(_kameleoonError.KameleoonException.Initialization);_logging.KameleoonLogger.info`CALL: KameleoonClient.getFeatureFlagVariable(visitorCode: ${b}, featureKey: ${c}, variableKey: ${d})`,this.visitorCodeManager.validateVisitorCode(b).throw();const{key:e}=this._getFeatureVariation({visitorCode:b,featureKey:c,track:!0}).throw(),f=this._getFeatureVariables({visitorCode:b,featureKey:c,variationKey:e}),g=f.find(a=>a.key===d);if(!g)throw new _kameleoonError.KameleoonError(_kameleoonError.KameleoonException.FeatureFlagVariableNotFound,d,b);const{type:h,value:i}=_utilities.Parser.parseFeatureVariable(g).throw(),j={type:h,value:i};return _logging.KameleoonLogger.info`RETURN: KameleoonClient.getFeatureFlagVariable(visitorCode: ${b}, featureKey: ${c}, variableKey: ${d}) -> (FeatureFlagVariable: ${j})`,j}getFeatureFlagVariables(a,b){if(this.stubMode)throw new _kameleoonError.KameleoonError(_kameleoonError.KameleoonException.Initialization);_logging.KameleoonLogger.info`CALL: KameleoonClient.getFeatureFlagVariables(visitorCode: ${a}, featureKey: ${b})`,this.visitorCodeManager.validateVisitorCode(a).throw();const{key:c}=this._getFeatureVariation({visitorCode:a,featureKey:b,track:!0}).throw(),d=this._getFeatureVariables({visitorCode:a,featureKey:b,variationKey:c}),e=[];for(const c of d){const a=_utilities.Parser.parseFeatureVariable(c).throw();e.push(a)}return _logging.KameleoonLogger.info`RETURN: KameleoonClient.getFeatureFlagVariables(visitorCode: ${a}, featureKey: ${b}) -> (FeatureFlagVariables: ${e})`,e}isFeatureFlagActive(a,b){if(this.stubMode)throw new _kameleoonError.KameleoonError(_kameleoonError.KameleoonException.Initialization);let[c,d,e]=["","",!0];"string"==typeof a?(_logging.KameleoonLogger.info`CALL: KameleoonClient.isFeatureFlagActive(visitorCode: ${c}, featureKey: ${d})`,c=a,d=b):(_logging.KameleoonLogger.info`CALL: KameleoonClient.isFeatureFlagActive(visitorCode: ${c}, featureKey: ${d}, track ${e})`,[c,d]=[a.visitorCode,a.featureKey],a.track!==void 0&&(e=a.track)),this.visitorCodeManager.validateVisitorCode(c).throw();try{const{key:a}=this._getFeatureVariation({visitorCode:c,featureKey:d,track:e}).throw(),b=a!==_constants.OFF_VARIATION_KEY;return _logging.KameleoonLogger.info`RETURN: KameleoonClient.isFeatureFlagActive(visitorCode: ${c}, featureKey: ${d}, track: ${e}) -> (isActive: ${b})`,b}catch(a){if(a instanceof _kameleoonError.KameleoonError&&a.type===_kameleoonError.KameleoonException.FeatureFlagEnvironmentDisabled)return _logging.KameleoonLogger.info`RETURN: KameleoonClient.isFeatureFlagActive(visitorCode: ${c}, featureKey: ${d}, track: ${e}) -> (isActive: false)`,!1;throw a}}async getRemoteData(a){if(this.stubMode)return null;_logging.KameleoonLogger.info`CALL: KameleoonClient.getRemoteData(key: ${a})`;const b=await this.requester.getRemoteData(a);return _logging.KameleoonLogger.info`RETURN: KameleoonClient.getRemoteData(key: ${a}) -> (remoteData: ${b})`,b.throw()}async getVisitorWarehouseAudience(a){let{visitorCode:b,customDataIndex:c,warehouseKey:d}=a;if(this.stubMode)return null;_logging.KameleoonLogger.info`CALL: KameleoonClient.getVisitorWarehouseAudience(visitorCode: ${b}, customDataIndex: ${c}, warehouseKey: ${d})`,this.visitorCodeManager.validateVisitorCode(b).throw();const e=await this.getRemoteData(d||b);if(!e)throw new _kameleoonError.KameleoonError(_kameleoonError.KameleoonException.RemoteData,`No data found for ${d||b} key`);if(!e[_constants.WAREHOUSE_AUDIENCE_KEY]||0===Object.keys(e[_constants.WAREHOUSE_AUDIENCE_KEY]).length)return _logging.KameleoonLogger.info`RETURN: KameleoonClient.getVisitorWarehouseAudience(visitorCode: ${b}, customDataIndex: ${c}, warehouseKey: ${d}) -> (customData: null)`,null;const f=new _kameleoonData.CustomData(c,...Object.keys(e[_constants.WAREHOUSE_AUDIENCE_KEY]));return this.dataManager.storeData(b,f),_logging.KameleoonLogger.info`RETURN: KameleoonClient.getVisitorWarehouseAudience(visitorCode: ${b}, customDataIndex: ${c}, warehouseKey: ${d}) -> (customData: ${f})`,f}onEvent(a,b){if(this.stubMode)throw new _kameleoonError.KameleoonError(_kameleoonError.KameleoonException.Initialization);if(_logging.KameleoonLogger.info`CALL: KameleoonClient.onEvent(event: ${a}, callback)`,!this.initialized)throw new _kameleoonError.KameleoonError(_kameleoonError.KameleoonException.Initialization);this.eventManager.addEventHandler(a,b),_logging.KameleoonLogger.info`RETURN: KameleoonClient.onEvent(event: ${a}, callback)`}getEngineTrackingCode(a){if(this.stubMode)return"";_logging.KameleoonLogger.info`CALL: KameleoonClient.getEngineTrackingCode(visitorCode: ${a})`,this.visitorCodeManager.validateVisitorCode(a).throw();const b=_utilities.Utilities.getTrackingCode(this.trackingCache,a);return _logging.KameleoonLogger.info`RETURN: KameleoonClient.getEngineTrackingCode(visitorCode: ${a}) -> (trackingCode: ${b})`,b}isInitialized(){return _logging.KameleoonLogger.debug`CALL/RETURN: KameleoonClient.isInitialized() -> (initialized: ${this.initialized})`,this.initialized}setLogLevel(a){_logging.KameleoonLogger.setLogLevel(a)}setForcedVariation(a){let{visitorCode:b,experimentId:c,variationKey:d,forceTargeting:e=!0}=a;this.stubMode||(_logging.KameleoonLogger.info`CALL: KameleoonClient.setForcedVariation(visitorCode: '${b}', experimentId: ${c}, variationKey: '${d}', forceTargeting: ${e})`,this.visitorCodeManager.validateVisitorCode(b).throw(),this._setForcedVariation({visitorCode:b,experimentId:c,variationKey:d,forceTargeting:e}).throw(),_logging.KameleoonLogger.info`RETURN: KameleoonClient.setForcedVariation(visitorCode: '${b}', experimentId: ${c}, variationKey: '${d}', forceTargeting: ${e})`)}setUserConsent(a){let{visitorCode:b,consent:c,setData:d}=a;this.stubMode||(_logging.KameleoonLogger.info`CALL: KameleoonClient.setUserConsent(visitorCode: ${b}, consent: ${c}, setData: ${d})`,this.visitorCodeManager.validateVisitorCode(b).throw(),this.updateConsentData(b,c),c?d({visitorCode:b,key:_storage.KameleoonStorageKey.VisitorCode,maxAge:_visitorCodeManager.DEFAULT_MAX_AGE,path:_visitorCodeManager.PATH}):this.visitorCodeManager.consentRequired&&d({visitorCode:"",key:_storage.KameleoonStorageKey.VisitorCode,maxAge:_visitorCodeManager.ZERO_MAX_AGE,path:_visitorCodeManager.PATH}),_logging.KameleoonLogger.info`RETURN: KameleoonClient.setUserConsent(visitorCode: ${b}, consent: ${c}, setData: ${d})`)}updateConsentData(a,b){const c=this.consentDataStorage.read();if(!c.ok)return void(c.error.type===_kameleoonError.KameleoonException.StorageEmpty&&this.consentDataStorage.write({[a]:{consent:b}}));const d=c.data;d[a]={consent:b},this.consentDataStorage.write(d)}_isConsentProvided(a){_logging.KameleoonLogger.debug`CALL: KameleoonClient._isConsentProvided(visitorCode: ${a})`;const{isConsentRequired:b}=this.clientConfiguration,c=this.consentDataStorage.read();let d=!1;if(!b)d=!0;else if(c.ok){const b=c.data[a];d="boolean"==typeof b?b:b&&b.consent}return _logging.KameleoonLogger.debug`RETURN: KameleoonClient._isConsentProvided(visitorCode: ${a}) -> (isConsentProvided: ${d})`,d}_getFeatureVariables(a){let{visitorCode:b,featureKey:c,variationKey:d}=a;_logging.KameleoonLogger.debug`CALL: KameleoonClient._getFeatureVariables(visitorCode: ${b}, featureKey: ${c}, variationKey: ${d})`;const e=this.clientConfiguration.featureFlags,f=e.get(c);if(!f)throw new _kameleoonError.KameleoonError(_kameleoonError.KameleoonException.FeatureFlagConfigurationNotFound,c);const g=f.variations.find(a=>a.key===d);if(!g)throw new _kameleoonError.KameleoonError(_kameleoonError.KameleoonException.FeatureFlagVariationNotFound,d,b);return _logging.KameleoonLogger.debug`RETURN: KameleoonClient._getFeatureVariables(visitorCode: ${b}, featureKey: ${c}, variationKey: ${d}) -> (variables: ${g.variables})`,g.variables}_getActiveFeatureVariations(a){_logging.KameleoonLogger.debug`CALL: KameleoonClient._getActiveFeatureVariations(visitorCode: ${a})`;const b=this.clientConfiguration.featureFlags,c=[];for(const d of b.values()){if(!d.environmentEnabled)continue;const b=this._evaluate({visitorCode:a,featureFlag:d,track:!1,save:!1});b.variationKey!==_constants.OFF_VARIATION_KEY&&c.push({variationKey:b.variationKey,variationId:b.variationId,experimentId:b.experimentId,featureFlagId:d.id,featureKey:d.featureKey,rule:null,isTargetedRule:b.ruleType===_clientConfiguration.RuleType.TARGETED_DELIVERY})}return _logging.KameleoonLogger.debug`RETURN: KameleoonClient._getActiveFeatureVariations(visitorCode: ${a}) -> (activeVariations: ${c})`,c}_evaluate(a){let{visitorCode:b,featureFlag:c,track:d,save:e}=a;_logging.KameleoonLogger.debug`CALL: KameleoonClient._evaluate(visitorCode: ${b}, featureFlag: ${c}, track: ${d}, save: ${e})`;let f,g=null;const h=this.variationConfiguration.getForcedFeatureVariation(b,c.featureKey);if(h.ok&&(g=h.data),g)f=KameleoonClient.EvaluatedExperiment.fromForcedFeatureVariation(c.defaultVariationKey,g);else if(this._isVisitorNotInHoldout(b,d,e)&&this._isFFUnrestrictedByMEGroup(b,c)){const a=this.dataManager.getVisitorData(b),g=this.dataManager.getVisitorIdentifier(b),h=this.variationConfiguration.getVariation({visitorCode:b,visitorIdentifier:g,featureFlag:c,track:d,withAssignment:e,targetingData:a,clientConfiguration:this.clientConfiguration,dataManager:this.dataManager,packageInfo:this.externalPackageInfo}).throw();f=KameleoonClient.EvaluatedExperiment.fromVariationData(h)}else f=KameleoonClient.EvaluatedExperiment.fromDefaultVariationKey(c.defaultVariationKey);return e&&!f.isSimulated&&null!==f.experimentId&&null!==f.variationId&&this.variationConfiguration.updateStoredVariations(b,{[f.experimentId]:{variationId:f.variationId,isTargetedRule:f.ruleType===_clientConfiguration.RuleType.TARGETED_DELIVERY,status:d?_types.TrackingStatus.Unsent:_types.TrackingStatus.Sent}}),this.eventManager.fireEvent(_eventManager.EventType.Evaluation,{featureKey:c.featureKey,variation:{key:f.variationKey,experimentId:f.experimentId,id:f.variationId}}),_logging.KameleoonLogger.debug`RETURN: KameleoonClient._evaluate(visitorCode: ${b}, featureFlag: ${c}, track: ${d}, save: ${e}) -> (evalExp: ${f})`,f}_isFFUnrestrictedByMEGroup(a,b){const c=b.mutuallyExclusiveGroup;if(!c)return!0;_logging.KameleoonLogger.debug`CALL: KameleoonClient._isFFUnrestrictedByMEGroup(visitorCode: ${a}, featureFlag: ${b})`;let d=!0;const e=this.clientConfiguration.meGroups.get(c);if(e){const f=this.dataManager.getVisitorIdentifier(a),g=_hasher.Hasher.getHashDoubleForMEGroup(f,c);_logging.KameleoonLogger.debug`Calculated meGroup hash ${g} for code: '${f}', meGroup: '${c}'`,d=e.getFeatureFlagByHash(g)===b}return _logging.KameleoonLogger.debug`RETURN: KameleoonClient._isFFUnrestrictedByMEGroup(visitorCode: '${a}', featureFlag: ${b}) -> (selected: ${d})`,d}_getFeatureVariation(a){let{visitorCode:b,featureKey:c,track:d}=a;if(_logging.KameleoonLogger.debug`CALL: KameleoonClient._getFeatureVariation(visitorCode: ${b}, featureKey: ${c}, track: ${d})`,!this.initialized)return(0,_tsRes.Err)(new _kameleoonError.KameleoonError(_kameleoonError.KameleoonException.Initialization));const e=this.clientConfiguration.featureFlags,f=e.get(c);if(!f)return(0,_tsRes.Err)(new _kameleoonError.KameleoonError(_kameleoonError.KameleoonException.FeatureFlagConfigurationNotFound,c));if(!f.environmentEnabled)return(0,_tsRes.Err)(new _kameleoonError.KameleoonError(_kameleoonError.KameleoonException.FeatureFlagEnvironmentDisabled,f.featureKey,this.environment));const g=this._evaluate({visitorCode:b,featureFlag:f,track:d,save:!0}),{experimentId:h,variationId:i,variationKey:j,isSimulated:k}=g;let l=new Map,m=!1;try{const a=this._getFeatureVariables({visitorCode:b,featureKey:c,variationKey:j});a.forEach(a=>{m||a.type!==_types.VariableType.JS&&a.type!==_types.VariableType.CSS||(m=!0);const b=_utilities.Parser.parseFeatureVariable(a).throw();l.set(a.key,b)})}catch(_){}h&&"number"==typeof i&&!k&&_utilities.Utilities.updateCache({cacheManager:this.trackingCache,hasJsCssVariables:m,visitorCode:b,experimentId:h,variationId:i}),d&&!k&&this.tracker.scheduleVisitor(b,this._isConsentProvided(b));const n={key:j,id:i,experimentId:h,variables:l};return _logging.KameleoonLogger.debug`RETURN: KameleoonClient._getFeatureVariation(visitorCode: ${b}, featureKey: ${c}, track: ${d}) -> (variation: ${n})`,(0,_tsRes.Ok)(n)}_isVisitorNotInHoldout(a,b,c){const d=this.clientConfiguration.holdout;if(!d)return!0;_logging.KameleoonLogger.debug`CALL: KameleoonClient._isVisitorNotInHoldout(visitorCode: ${a}, track: ${b}, save: ${c})`;let e=!0;const f=this.dataManager.getVisitorIdentifier(a),g=_hasher.Hasher.getHashDouble({visitorIdentifier:f,respoolTime:null,id:d.experimentId+""});_logging.KameleoonLogger.debug`Calculated holdoutHash: ${g} for visitorCode: ${f}`;let h=_utilities.Utilities.getVariationByHash(d.variationByExposition,g);return null!==h&&(e=h.variationKey!==_constants.IN_HOLDOUT_VARIATION_KEY,c&&this.variationConfiguration.updateStoredVariations(a,{[d.experimentId]:{variationId:h.variationId,isTargetedRule:!1,status:b?_types.TrackingStatus.Unsent:_types.TrackingStatus.Sent}})),_logging.KameleoonLogger.debug`RETURN: KameleoonClient._isVisitorNotInHoldout(visitorCode: ${a}, track: ${b}, save: ${c}) -> (isNotInHoldout: ${e})`,e}_setForcedVariation(a){let{visitorCode:b,experimentId:c,variationKey:d,forceTargeting:e=!0}=a;if(_logging.KameleoonLogger.debug`CALL: KameleoonClient._setForcedVariation(visitorCode: '${b}', experimentId: ${c}, variationKey: '${d}', forceTargeting: ${e})`,null===d){const a=this.variationConfiguration.updateForcedExperimentVariation(b,c,null);return _logging.KameleoonLogger.debug`RETURN: KameleoonClient._setForcedVariation(visitorCode: '${b}', experimentId: ${c}, variationKey: '${d}', forceTargeting: ${e}) -> (writeResult: ${a})`,a}let f=null,g=null;if(f=this.clientConfiguration.experimentMap.get(c),!f)return _logging.KameleoonLogger.error`Experiment with id ${c} not found for visitor ${b}`,(0,_tsRes.Err)(new _kameleoonError.KameleoonError(_kameleoonError.KameleoonException.FeatureFlagExperimentNotFound,c,b));if(g=f.variations.get(d),void 0===g)return _logging.KameleoonLogger.error`Variation with key ${d} not found in experiment ${f} for visitor ${b}`,(0,_tsRes.Err)(new _kameleoonError.KameleoonError(_kameleoonError.KameleoonException.FeatureFlagVariationNotFound,d,b));f={type:f.type,experimentId:c},g={variationKey:d,variationId:g};const h=this.variationConfiguration.updateForcedExperimentVariation(b,c,{rule:f,varByExp:g,forceTargeting:e});return _logging.KameleoonLogger.debug`RETURN: KameleoonClient._setForcedVariation(visitorCode: '${b}', experimentId: ${c}, variationKey: '${d}', forceTargeting: ${e}) -> (writeResult: ${h})`,h}}exports.KameleoonClient=KameleoonClient,_defineProperty(KameleoonClient,"EvaluatedExperiment",class{static fromForcedFeatureVariation(a,b){var c,d,e;let f=a;return b.varByExp?f=b.varByExp.variationKey:b.rule&&b.rule.type===_clientConfiguration.RuleType.EXPERIMENTATION&&(f=_constants.OFF_VARIATION_KEY),{variationKey:f,variationId:(null===(c=b.varByExp)||void 0===c?void 0:c.variationId)||null,experimentId:(null===(d=b.rule)||void 0===d?void 0:d.experimentId)||null,ruleType:(null===(e=b.rule)||void 0===e?void 0:e.type)||null,isSimulated:b.simulated}}static fromVariationData(a){var b,c;return{variationKey:a.variationKey,variationId:a.variationId,experimentId:a.experimentId,ruleType:null!==(b=null===(c=a.rule)||void 0===c?void 0:c.type)&&void 0!==b?b:null,isSimulated:!1}}static fromDefaultVariationKey(a){return{variationKey:a,variationId:null,experimentId:null,ruleType:null,isSimulated:!1}}});
|
|
@@ -48,7 +48,7 @@ export interface IKameleoonClient {
|
|
|
48
48
|
getRemoteVisitorData: ({ visitorCode, shouldAddData, filters, }: RemoteVisitorDataParamsType) => Promise<KameleoonDataType[]>;
|
|
49
49
|
/**
|
|
50
50
|
* @method trackConversion - creates and adds `Conversion` data to the visitor with specified parameters and executes `flush`. Note: it's a helper method for the quick and convenient conversion tracking, however creating and adding `Conversion` manually allows more flexible `Conversion` with `negative` parameter
|
|
51
|
-
* @param {TrackConversionParamsType} conversionParameters - `visitorCode`, `goalId` and `
|
|
51
|
+
* @param {TrackConversionParamsType} conversionParameters - `visitorCode`, `goalId`, `revenue`, `negative` and `metadata` parameters for data tracking
|
|
52
52
|
* @returns {void}
|
|
53
53
|
* @throws `KameleoonError` with one of the following `type` s:
|
|
54
54
|
*
|
|
@@ -56,7 +56,7 @@ export interface IKameleoonClient {
|
|
|
56
56
|
* - `KameleoonException.VisitorCodeEmpty` The visitor code is empty
|
|
57
57
|
* - `KameleoonException.StorageWrite` Couldn't update storage data
|
|
58
58
|
*/
|
|
59
|
-
trackConversion: ({ visitorCode, goalId, revenue, }: TrackConversionParamsType) => void;
|
|
59
|
+
trackConversion: ({ visitorCode, goalId, revenue, negative, metadata, }: TrackConversionParamsType) => void;
|
|
60
60
|
/**
|
|
61
61
|
* @method flush - takes visitor associated kameleoon data and sends the data tracking request with collected data,
|
|
62
62
|
* sent data is removed from `KameleoonClient` instance but not from the storage for correct targeting checks. If no visitor is passed,
|
|
@@ -12,14 +12,16 @@ export declare class Conversion implements IKameleoonData {
|
|
|
12
12
|
private negative;
|
|
13
13
|
private id;
|
|
14
14
|
private nonce;
|
|
15
|
+
private metadata;
|
|
15
16
|
/**
|
|
16
17
|
* @param {ConversionParametersType} conversionParameters - an object with conversion parameters
|
|
17
18
|
* */
|
|
18
|
-
constructor({ goalId, revenue, negative, }: ConversionParametersType);
|
|
19
|
+
constructor({ goalId, revenue, negative, metadata, }: ConversionParametersType);
|
|
19
20
|
set _id(id: number);
|
|
20
21
|
set _nonce(nonce: string);
|
|
21
22
|
get url(): string;
|
|
22
23
|
get data(): ConversionDataType;
|
|
24
|
+
private _encodeMetadata;
|
|
23
25
|
/**
|
|
24
26
|
* @private
|
|
25
27
|
* @method _fromRaw - an internal method for creating a Conversion instance from raw data
|
|
@@ -27,6 +29,7 @@ export declare class Conversion implements IKameleoonData {
|
|
|
27
29
|
* @return {Conversion} a Conversion instance
|
|
28
30
|
* */
|
|
29
31
|
static _fromRaw(data: ConversionDataType): Conversion;
|
|
32
|
+
private static parseMetadata;
|
|
30
33
|
/**
|
|
31
34
|
* @private
|
|
32
35
|
* @method _listFromVisit - an internal method for returning a list of all Conversion instances
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.Conversion=void 0;var _requester=require("../requester"),_types=require("./types"),_types2=require("../types");function _defineProperty(a,b,c){return(b=_toPropertyKey(b))in a?Object.defineProperty(a,b,{value:c,enumerable:!0,configurable:!0,writable:!0}):a[b]=c,a}function _toPropertyKey(a){var b=_toPrimitive(a,"string");return"symbol"==typeof b?b:b+""}function _toPrimitive(a,b){if("object"!=typeof a||!a)return a;var c=a[Symbol.toPrimitive];if(void 0!==c){var d=c.call(a,b||"default");if("object"!=typeof d)return d;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===b?String:Number)(a)}class Conversion{constructor(a){let{goalId:b,revenue:
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.Conversion=void 0;var _requester=require("../requester"),_types=require("./types"),_types2=require("../types"),_customData=require("./customData");function _defineProperty(a,b,c){return(b=_toPropertyKey(b))in a?Object.defineProperty(a,b,{value:c,enumerable:!0,configurable:!0,writable:!0}):a[b]=c,a}function _toPropertyKey(a){var b=_toPrimitive(a,"string");return"symbol"==typeof b?b:b+""}function _toPrimitive(a,b){if("object"!=typeof a||!a)return a;var c=a[Symbol.toPrimitive];if(void 0!==c){var d=c.call(a,b||"default");if("object"!=typeof d)return d;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===b?String:Number)(a)}class Conversion{constructor(a){let{goalId:b,revenue:d=0,negative:e=!1,metadata:c}=a;_defineProperty(this,"status",void 0),_defineProperty(this,"goalId",void 0),_defineProperty(this,"revenue",void 0),_defineProperty(this,"negative",void 0),_defineProperty(this,"id",void 0),_defineProperty(this,"nonce",void 0),_defineProperty(this,"metadata",void 0),this.goalId=b,this.revenue=d,this.negative=e,this.status=_types2.TrackingStatus.Unsent,this.id=Math.floor(1e6*Math.random()),this.metadata=c}set _id(a){this.id=a}set _nonce(a){this.nonce=a}get url(){var a;return _requester.UrlEventType.Conversion+_requester.UrlParameter.GoalId+(this.goalId+"")+_requester.UrlParameter.Revenue+(this.revenue+"")+_requester.UrlParameter.Negative+(this.negative+"")+(null!==(a=this.metadata)&&void 0!==a&&a.length?_requester.UrlParameter.Metadata+this._encodeMetadata():"")}get data(){var a;return{goalId:this.goalId,nonce:this.nonce,revenue:this.revenue,negative:this.negative,type:_types.KameleoonData.Conversion,status:this.status,id:this.id,metadata:(null===(a=this.metadata)||void 0===a?void 0:a.map(a=>a.data))||void 0}}_encodeMetadata(){var a;if(!(null!==(a=this.metadata)&&void 0!==a&&a.length))return"";const b=new Set;return encodeURIComponent(JSON.stringify(this.metadata.reduce((a,c)=>b.has(c.data.index)?a:(b.add(c.data.index),a[c.data.index]=c.data.value,a),{})))}static _fromRaw(a){const{goalId:b,revenue:c,negative:d,status:e,id:f,nonce:g,metadata:h}=a,i=new Conversion({goalId:b,revenue:c,negative:d,metadata:Conversion.parseMetadata(h)});return i._id=f,i.status=e,g&&(i._nonce=g),i}static parseMetadata(a){return(null===a||void 0===a?void 0:a.map(a=>_customData.CustomData._fromRaw(a)))||void 0}static _listFromVisit(a){var b,c;const d=[];if(!(null!==(b=a.conversionEvents)&&void 0!==b&&b.length))return[];if(null!==(c=a.conversionEvents)&&void 0!==c&&c.length)for(const b of a.conversionEvents){const{goalId:a,revenue:c,negative:e}=b.data,f=new Conversion({goalId:a,revenue:c,negative:e});f.status=_types2.TrackingStatus.Sent,d.push(f)}return d}static _updateFromVisit(a,b){var c;if(null!==(c=a.conversionEvents)&&void 0!==c&&c.length)for(const c of a.conversionEvents){const{goalId:a}=c.data;if(!b.has(a)){const c=new Conversion({goalId:a});c.status=_types2.TrackingStatus.Sent,b.set(a,c)}}}}exports.Conversion=Conversion;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.CustomData=void 0;var _requester=require("../requester"),_types=require("./types"),_types2=require("../types");function _defineProperty(a,b,c){return(b=_toPropertyKey(b))in a?Object.defineProperty(a,b,{value:c,enumerable:!0,configurable:!0,writable:!0}):a[b]=c,a}function _toPropertyKey(a){var b=_toPrimitive(a,"string");return"symbol"==typeof b?b:b+""}function _toPrimitive(a,b){if("object"!=typeof a||!a)return a;var c=a[Symbol.toPrimitive];if(void 0!==c){var d=c.call(a,b||"default");if("object"!=typeof d)return d;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===b?String:Number)(a)}class CustomData{constructor(a){_defineProperty(this,"_status",void 0),_defineProperty(this,"index",void 0),_defineProperty(this,"value",void 0),_defineProperty(this,"isIdentifier",void 0),this.index=a;for(var b=arguments.length,c=Array(1<b?b-1:0),d=1;d<b;d++)c[d-1]=arguments[d];this.value=c,this._status=_types2.TrackingStatus.Unsent,this.isIdentifier=!1}get url(){if("number"!=typeof this.index)return"";const a=[...new Set(this.value)];let b={};
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.CustomData=void 0;var _requester=require("../requester"),_types=require("./types"),_types2=require("../types");function _defineProperty(a,b,c){return(b=_toPropertyKey(b))in a?Object.defineProperty(a,b,{value:c,enumerable:!0,configurable:!0,writable:!0}):a[b]=c,a}function _toPropertyKey(a){var b=_toPrimitive(a,"string");return"symbol"==typeof b?b:b+""}function _toPrimitive(a,b){if("object"!=typeof a||!a)return a;var c=a[Symbol.toPrimitive];if(void 0!==c){var d=c.call(a,b||"default");if("object"!=typeof d)return d;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===b?String:Number)(a)}class CustomData{constructor(a){_defineProperty(this,"_status",void 0),_defineProperty(this,"index",void 0),_defineProperty(this,"value",void 0),_defineProperty(this,"isIdentifier",void 0),this.index=a;for(var b=arguments.length,c=Array(1<b?b-1:0),d=1;d<b;d++)c[d-1]=arguments[d];this.value=c,this._status=_types2.TrackingStatus.Unsent,this.isIdentifier=!1}get url(){if("number"!=typeof this.index)return"";const a=[...new Set(this.value)];let b={};a.forEach(a=>{b[a]=1});let c="";return this.isIdentifier&&(c=_requester.UrlParameter.MappingIdentifier+"true"),_requester.UrlEventType.CustomData+_requester.UrlParameter.Index+this.index+_requester.UrlParameter.ValuesCountMap+encodeURIComponent(JSON.stringify(b))+_requester.UrlParameter.Overwrite+"true"+c}get data(){return{index:this.index,value:this.value,type:_types.KameleoonData.CustomData,isIdentifier:this.isIdentifier,status:this.status}}get status(){return this._isMappingIdentifier?_types2.TrackingStatus.Unsent:this._status}static _fromRaw(a){const{index:b,value:c,status:d,isIdentifier:e}=a,f=new CustomData(b,...c);return f.status=d,f._isMappingIdentifier=e,f}set _isMappingIdentifier(a){this.isIdentifier=a}set status(a){this._status=a}static _updateFromVisit(a,b){var c;if(null!==(c=a.customDataEvents)&&void 0!==c&&c.length)for(let c=a.customDataEvents.length-1;0<=c;c--){const{index:d,valuesCountMap:e}=a.customDataEvents[c].data;b.has(d)||b.set(d,new CustomData(d,...Object.keys(e)))}}}exports.CustomData=CustomData;
|
|
@@ -190,6 +190,7 @@ export type ConversionDataType = {
|
|
|
190
190
|
revenue: number;
|
|
191
191
|
negative: boolean;
|
|
192
192
|
nonce?: string;
|
|
193
|
+
metadata?: CustomDataType[];
|
|
193
194
|
} & SharedDataPropertiesType;
|
|
194
195
|
export type CustomDataType = {
|
|
195
196
|
index: number;
|
|
@@ -240,11 +241,13 @@ export type ApplicationVersionDataType = {
|
|
|
240
241
|
* @param {number} goalId - an id of a goal to track
|
|
241
242
|
* @param {number | undefined} revenue - an optional parameter for revenue, default value is `0`
|
|
242
243
|
* @param {boolean | undefined} negative - an optional parameter identifying whether the conversion should be removed, default value is `false`
|
|
244
|
+
* @param {CustomData[] | undefined} metadata - an optional parameter, default value is `undefined`
|
|
243
245
|
* */
|
|
244
246
|
export type ConversionParametersType = {
|
|
245
247
|
goalId: number;
|
|
246
248
|
revenue?: number;
|
|
247
249
|
negative?: boolean;
|
|
250
|
+
metadata?: CustomData[];
|
|
248
251
|
};
|
|
249
252
|
/**
|
|
250
253
|
* @param {string} urlAddress - url address of the page to track
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var _types=require("./types");Object.defineProperty(exports,"__esModule",{value:!0}),exports.UrlTracking=exports.UrlQuery=exports.UrlParameter=exports.UrlFirstParameter=exports.UrlEventType=exports.NUMBER_OF_RETRIES=exports.Header=exports.DEFAULT_DOMAINS=void 0;const NUMBER_OF_RETRIES=exports.NUMBER_OF_RETRIES=2;let Header=exports.Header=function(a){return a.UserAgent="User-Agent",a.ContentType="Content-Type",a.SdkVersion="X-Kameleoon-SDK-Version",a.SdkType="X-Kameleoon-SDK-Type",a.Authorization="Authorization",a.AcceptEncoding="Accept-Encoding",a}({});const UrlEventType=exports.UrlEventType={CustomData:"eventType=customData",StaticData:"eventType=staticData",Page:"eventType=page",Conversion:"eventType=conversion",Activity:"eventType=activity",Experiment:"eventType=experiment",Geolocation:"eventType=geolocation"},UrlParameter=exports.UrlParameter={Title:"&title=",ReferrersIndices:"&referrersIndices=",Negative:"&negative=",Revenue:"&revenue=",Overwrite:"&overwrite=",Index:"&index=",BrowserIndex:"&browserIndex=",BrowserVersion:"&browserVersion=",Href:"&href=",DeviceType:"&deviceType=",SiteCode:"&siteCode=",GoalId:"&goalId=",VisitorCode:"&visitorCode=",VariationId:"&variationId=",Ts:"&ts=",Key:"&key=",SdkName:"&sdkName=",SdkVersion:"&sdkVersion=",ValuesCountMap:"&valuesCountMap=",Nonce:"&nonce=",Id:"&id=",CustomData:"&customData=",CurrentVisit:"¤tVisit=",MaxNumberPreviousVisits:"&maxNumberPreviousVisits=",Os:"&os=",OsIndex:"&osIndex=",Country:"&country=",City:"&city=",Region:"®ion=",Latitude:"&latitude=",Longitude:"&longitude=",PostalCode:"&postalCode=",Conversion:"&conversion=",StaticData:"&staticData=",Geolocation:"&geolocation=",Page:"&page=",Experiment:"&experiment=",Browser:"&browser=",Environment:"&environment=",MappingIdentifier:"&mappingIdentifier=",MappingValue:"&mappingValue=",Kcs:"&kcs=",Personalization:"&personalization=",UserAgent:"&userAgent=",BodyUa:"&bodyUa=",Cbs:"&cbs="},UrlFirstParameter=exports.UrlFirstParameter={CustomData:"?customData=",StaticData:"?staticData=",Page:"?page=",Conversion:"?conversion=",Geolocation:"?geolocation=",Experiment:"?experiment=",ValuesCountMap:"?valuesCountMap=",Id:"?id=",Nonce:"?nonce=",Country:"?country=",Environment:"?environment=",City:"?city=",Region:"?region=",Latitude:"?latitude=",Longitude:"?longitude=",PostalCode:"?postalCode=",SdkName:"?sdkName=",SdkVersion:"?sdkVersion=",BrowserIndex:"?browserIndex=",BrowserVersion:"?browserVersion=",SiteCode:"?siteCode=",VisitorCode:"?visitorCode=",CurrentVisit:"?currentVisit=",MaxNumberPreviousVisits:"?maxNumberPreviousVisits=",Negative:"?negative=",Revenue:"?revenue=",Title:"?title=",Os:"?os=",OsIndex:"?osIndex=",Browser:"?browser=",ReferrersIndices:"?referrersIndices=",Overwrite:"?overwrite=",Index:"?index=",Href:"?href=",VariationId:"?variationId=",DeviceType:"?deviceType=",GoalId:"?goalId=",Ts:"?ts=",Key:"?key=",MappingIdentifier:"?mappingIdentifier=",MappingValue:"?mappingValue=",Kcs:"?kcs=",Personalization:"?personalization=",UserAgent:"?userAgent=",BodyUa:"?bodyUa=",Cbs:"?cbs="},UrlQuery=exports.UrlQuery={Sse:"sse?siteCode=",Map:"map?siteCode=",Events:"events?siteCode=",Visitor:"visitor?siteCode="},UrlTracking=exports.UrlTracking={Visit:"visit/",Map:"map/"},DEFAULT_DOMAINS=exports.DEFAULT_DOMAINS={[_types.UrlType.DataApi]:"data.kameleoon.io",[_types.UrlType.Events]:"events.kameleoon.eu",[_types.UrlType.ClientConfiguration]:"sdk-config.kameleoon.eu"};
|
|
1
|
+
"use strict";var _types=require("./types");Object.defineProperty(exports,"__esModule",{value:!0}),exports.UrlTracking=exports.UrlQuery=exports.UrlParameter=exports.UrlFirstParameter=exports.UrlEventType=exports.NUMBER_OF_RETRIES=exports.Header=exports.DEFAULT_DOMAINS=void 0;const NUMBER_OF_RETRIES=exports.NUMBER_OF_RETRIES=2;let Header=exports.Header=function(a){return a.UserAgent="User-Agent",a.ContentType="Content-Type",a.SdkVersion="X-Kameleoon-SDK-Version",a.SdkType="X-Kameleoon-SDK-Type",a.Authorization="Authorization",a.AcceptEncoding="Accept-Encoding",a}({});const UrlEventType=exports.UrlEventType={CustomData:"eventType=customData",StaticData:"eventType=staticData",Page:"eventType=page",Conversion:"eventType=conversion",Activity:"eventType=activity",Experiment:"eventType=experiment",Geolocation:"eventType=geolocation"},UrlParameter=exports.UrlParameter={Title:"&title=",ReferrersIndices:"&referrersIndices=",Negative:"&negative=",Revenue:"&revenue=",Overwrite:"&overwrite=",Index:"&index=",BrowserIndex:"&browserIndex=",BrowserVersion:"&browserVersion=",Href:"&href=",DeviceType:"&deviceType=",SiteCode:"&siteCode=",GoalId:"&goalId=",VisitorCode:"&visitorCode=",VariationId:"&variationId=",Ts:"&ts=",Key:"&key=",SdkName:"&sdkName=",SdkVersion:"&sdkVersion=",ValuesCountMap:"&valuesCountMap=",Nonce:"&nonce=",Id:"&id=",CustomData:"&customData=",CurrentVisit:"¤tVisit=",MaxNumberPreviousVisits:"&maxNumberPreviousVisits=",Os:"&os=",OsIndex:"&osIndex=",Country:"&country=",City:"&city=",Region:"®ion=",Latitude:"&latitude=",Longitude:"&longitude=",PostalCode:"&postalCode=",Conversion:"&conversion=",StaticData:"&staticData=",Geolocation:"&geolocation=",Page:"&page=",Experiment:"&experiment=",Browser:"&browser=",Environment:"&environment=",MappingIdentifier:"&mappingIdentifier=",MappingValue:"&mappingValue=",Kcs:"&kcs=",Personalization:"&personalization=",UserAgent:"&userAgent=",BodyUa:"&bodyUa=",Cbs:"&cbs=",Metadata:"&metadata="},UrlFirstParameter=exports.UrlFirstParameter={CustomData:"?customData=",StaticData:"?staticData=",Page:"?page=",Conversion:"?conversion=",Geolocation:"?geolocation=",Experiment:"?experiment=",ValuesCountMap:"?valuesCountMap=",Id:"?id=",Nonce:"?nonce=",Country:"?country=",Environment:"?environment=",City:"?city=",Region:"?region=",Latitude:"?latitude=",Longitude:"?longitude=",PostalCode:"?postalCode=",SdkName:"?sdkName=",SdkVersion:"?sdkVersion=",BrowserIndex:"?browserIndex=",BrowserVersion:"?browserVersion=",SiteCode:"?siteCode=",VisitorCode:"?visitorCode=",CurrentVisit:"?currentVisit=",MaxNumberPreviousVisits:"?maxNumberPreviousVisits=",Negative:"?negative=",Revenue:"?revenue=",Title:"?title=",Os:"?os=",OsIndex:"?osIndex=",Browser:"?browser=",ReferrersIndices:"?referrersIndices=",Overwrite:"?overwrite=",Index:"?index=",Href:"?href=",VariationId:"?variationId=",DeviceType:"?deviceType=",GoalId:"?goalId=",Ts:"?ts=",Key:"?key=",MappingIdentifier:"?mappingIdentifier=",MappingValue:"?mappingValue=",Kcs:"?kcs=",Personalization:"?personalization=",UserAgent:"?userAgent=",BodyUa:"?bodyUa=",Cbs:"?cbs=",Metadata:"?metadata="},UrlQuery=exports.UrlQuery={Sse:"sse?siteCode=",Map:"map?siteCode=",Events:"events?siteCode=",Visitor:"visitor?siteCode="},UrlTracking=exports.UrlTracking={Visit:"visit/",Map:"map/"},DEFAULT_DOMAINS=exports.DEFAULT_DOMAINS={[_types.UrlType.DataApi]:"data.kameleoon.io",[_types.UrlType.Events]:"events.kameleoon.eu",[_types.UrlType.ClientConfiguration]:"sdk-config.kameleoon.eu"};
|
|
@@ -72,6 +72,7 @@ type ConversionEventType = {
|
|
|
72
72
|
goalId: number;
|
|
73
73
|
revenue: number;
|
|
74
74
|
negative: boolean;
|
|
75
|
+
metadata?: CustomDataEventType[];
|
|
75
76
|
};
|
|
76
77
|
} & EventDataType;
|
|
77
78
|
type BrowserIndexType = (typeof BrowserIndexMap)[BrowserType];
|
|
@@ -150,7 +151,7 @@ export declare enum DataApiQuery {
|
|
|
150
151
|
DataMap = 2
|
|
151
152
|
}
|
|
152
153
|
declare const EVENT_TYPE_KEYS: readonly ["customData", "staticData", "page", "conversion", "geolocation", "activity", "experiment"];
|
|
153
|
-
declare const PARAMETER_KEYS: readonly ["valuesCountMap", "mappingValue", "id", "nonce", "country", "environment", "city", "region", "latitude", "geolocation", "longitude", "mappingIdentifier", "postalCode", "sdkName", "sdkVersion", "kcs", "cbs", "personalization", "browserIndex", "browserVersion", "siteCode", "visitorCode", "currentVisit", "maxNumberPreviousVisits", "customData", "negative", "revenue", "title", "os", "conversion", "staticData", "osIndex", "browser", "referrersIndices", "overwrite", "index", "href", "experiment", "page", "variationId", "deviceType", "goalId", "ts", "key", "userAgent", "bodyUa"];
|
|
154
|
+
declare const PARAMETER_KEYS: readonly ["valuesCountMap", "mappingValue", "id", "nonce", "country", "environment", "city", "region", "latitude", "geolocation", "longitude", "mappingIdentifier", "postalCode", "sdkName", "sdkVersion", "kcs", "cbs", "personalization", "browserIndex", "browserVersion", "siteCode", "visitorCode", "currentVisit", "maxNumberPreviousVisits", "customData", "negative", "metadata", "revenue", "title", "os", "conversion", "staticData", "osIndex", "browser", "referrersIndices", "overwrite", "index", "href", "experiment", "page", "variationId", "deviceType", "goalId", "ts", "key", "userAgent", "bodyUa"];
|
|
154
155
|
declare const TRACKING_KEYS: readonly ["visit", "map"];
|
|
155
156
|
declare const QUERY_KEYS: readonly ["sse", "visitor", "map", "events"];
|
|
156
157
|
export type TrackingType = Record<Capitalize<(typeof TRACKING_KEYS)[number]>, string>;
|
package/dist/requester/types.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.UrlType=exports.RequestType=exports.HttpMethod=exports.DataApiQuery=void 0;let UrlType=exports.UrlType=function(a){return a.DataApi="dataApi",a.Events="events",a.ClientConfiguration="clientConfiguration",a}({}),HttpMethod=exports.HttpMethod=function(a){return a.Get="GET",a.Post="POST",a}({}),DataApiQuery=exports.DataApiQuery=function(a){return a[a.VisitEvent=0]="VisitEvent",a[a.VisitData=1]="VisitData",a[a.DataMap=2]="DataMap",a}({});const EVENT_TYPE_KEYS=["customData","staticData","page","conversion","geolocation","activity","experiment"],PARAMETER_KEYS=["valuesCountMap","mappingValue","id","nonce","country","environment","city","region","latitude","geolocation","longitude","mappingIdentifier","postalCode","sdkName","sdkVersion","kcs","cbs","personalization","browserIndex","browserVersion","siteCode","visitorCode","currentVisit","maxNumberPreviousVisits","customData","negative","revenue","title","os","conversion","staticData","osIndex","browser","referrersIndices","overwrite","index","href","experiment","page","variationId","deviceType","goalId","ts","key","userAgent","bodyUa"],TRACKING_KEYS=["visit","map"],QUERY_KEYS=["sse","visitor","map","events"];let RequestType=exports.RequestType=function(a){return a.Configuration="configuration",a.Tracking="tracking",a.RemoteData="remoteData",a}({});
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.UrlType=exports.RequestType=exports.HttpMethod=exports.DataApiQuery=void 0;let UrlType=exports.UrlType=function(a){return a.DataApi="dataApi",a.Events="events",a.ClientConfiguration="clientConfiguration",a}({}),HttpMethod=exports.HttpMethod=function(a){return a.Get="GET",a.Post="POST",a}({}),DataApiQuery=exports.DataApiQuery=function(a){return a[a.VisitEvent=0]="VisitEvent",a[a.VisitData=1]="VisitData",a[a.DataMap=2]="DataMap",a}({});const EVENT_TYPE_KEYS=["customData","staticData","page","conversion","geolocation","activity","experiment"],PARAMETER_KEYS=["valuesCountMap","mappingValue","id","nonce","country","environment","city","region","latitude","geolocation","longitude","mappingIdentifier","postalCode","sdkName","sdkVersion","kcs","cbs","personalization","browserIndex","browserVersion","siteCode","visitorCode","currentVisit","maxNumberPreviousVisits","customData","negative","metadata","revenue","title","os","conversion","staticData","osIndex","browser","referrersIndices","overwrite","index","href","experiment","page","variationId","deviceType","goalId","ts","key","userAgent","bodyUa"],TRACKING_KEYS=["visit","map"],QUERY_KEYS=["sse","visitor","map","events"];let RequestType=exports.RequestType=function(a){return a.Configuration="configuration",a.Tracking="tracking",a.RemoteData="remoteData",a}({});
|
package/dist/types.d.ts
CHANGED
|
@@ -7,6 +7,7 @@ import { IVisitorCodeManager } from './visitorCodeManager';
|
|
|
7
7
|
import { IExternalLogger } from './logging';
|
|
8
8
|
import { FeatureFlagType as ConfigFeatureFlagType } from './clientConfiguration/types';
|
|
9
9
|
import { Environment, ExternalPackageInfoType } from './sdkInfoTypes';
|
|
10
|
+
import { CustomData } from './kameleoonData';
|
|
10
11
|
/**
|
|
11
12
|
* @param {number} updateInterval - update interval in _minutes_ for sdk configuration, minimum value is 1 minute
|
|
12
13
|
* @defaultvalue 60
|
|
@@ -172,11 +173,15 @@ export declare enum Milliseconds {
|
|
|
172
173
|
* @param {string} visitorCode - unique visitor identifier, shouldn't exceed 255 characters
|
|
173
174
|
* @param {number} goalId - an id of a goal to track
|
|
174
175
|
* @param {number | undefined} revenue - an optional parameter for revenue, default value is `0`
|
|
176
|
+
* @param {boolean | undefined} negative Defines if the revenue is positive or negative, default value is `false`.
|
|
177
|
+
* @param {CustomData[] | undefined} metadata Metadata of the conversion, default value is `undefined`.
|
|
175
178
|
* */
|
|
176
179
|
export type TrackConversionParamsType = {
|
|
177
180
|
visitorCode: string;
|
|
178
181
|
goalId: number;
|
|
179
182
|
revenue?: number;
|
|
183
|
+
negative?: boolean;
|
|
184
|
+
metadata?: CustomData[];
|
|
180
185
|
};
|
|
181
186
|
/**
|
|
182
187
|
* @param {string} visitorCode - unique visitor identifier, shouldn't exceed 255 characters
|