@ninetailed/experience.js 4.2.3-beta.0 → 4.3.0-beta.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/index.cjs CHANGED
@@ -12,6 +12,8 @@ var Analytics__default = /*#__PURE__*/_interopDefaultLegacy(Analytics);
12
12
 
13
13
  const HAS_SEEN_EXPERIENCE = 'has_seen_experience';
14
14
  const HAS_SEEN_COMPONENT = 'has_seen_component';
15
+ const HAS_SEEN_ELEMENT = 'has_seen_element';
16
+ const PAGE_HIDDEN = 'page_hidden';
15
17
 
16
18
  var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
17
19
 
@@ -609,9 +611,9 @@ var inspectSource$3 = store$1.inspectSource;
609
611
  var global$d = global$k;
610
612
  var isCallable$d = isCallable$k;
611
613
 
612
- var WeakMap$1 = global$d.WeakMap;
614
+ var WeakMap$2 = global$d.WeakMap;
613
615
 
614
- var weakMapBasicDetection = isCallable$d(WeakMap$1) && /native code/.test(String(WeakMap$1));
616
+ var weakMapBasicDetection = isCallable$d(WeakMap$2) && /native code/.test(String(WeakMap$2));
615
617
 
616
618
  var shared$1 = shared$3.exports;
617
619
  var uid = uid$2;
@@ -635,7 +637,7 @@ var hiddenKeys$3 = hiddenKeys$4;
635
637
 
636
638
  var OBJECT_ALREADY_INITIALIZED = 'Object already initialized';
637
639
  var TypeError$2 = global$c.TypeError;
638
- var WeakMap = global$c.WeakMap;
640
+ var WeakMap$1 = global$c.WeakMap;
639
641
  var set$1, get, has;
640
642
 
641
643
  var enforce = function (it) {
@@ -652,7 +654,7 @@ var getterFor = function (TYPE) {
652
654
  };
653
655
 
654
656
  if (NATIVE_WEAK_MAP || shared.state) {
655
- var store = shared.state || (shared.state = new WeakMap());
657
+ var store = shared.state || (shared.state = new WeakMap$1());
656
658
  /* eslint-disable no-self-assign -- prototype methods protection */
657
659
  store.get = store.get;
658
660
  store.has = store.has;
@@ -2524,6 +2526,18 @@ OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
2524
2526
  PERFORMANCE OF THIS SOFTWARE.
2525
2527
  ***************************************************************************** */
2526
2528
 
2529
+ function __rest(s, e) {
2530
+ var t = {};
2531
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
2532
+ t[p] = s[p];
2533
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
2534
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
2535
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
2536
+ t[p[i]] = s[p[i]];
2537
+ }
2538
+ return t;
2539
+ }
2540
+
2527
2541
  function __awaiter(thisArg, _arguments, P, generator) {
2528
2542
  function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
2529
2543
  return new (P || (P = Promise))(function (resolve, reject) {
@@ -2842,6 +2856,115 @@ if (NOT_GENERIC || INCORRECT_NAME) {
2842
2856
  }, { unsafe: true });
2843
2857
  }
2844
2858
 
2859
+ var classof = classofRaw$2;
2860
+
2861
+ // `IsArray` abstract operation
2862
+ // https://tc39.es/ecma262/#sec-isarray
2863
+ // eslint-disable-next-line es/no-array-isarray -- safe
2864
+ var isArray$2 = Array.isArray || function isArray(argument) {
2865
+ return classof(argument) == 'Array';
2866
+ };
2867
+
2868
+ var $TypeError$1 = TypeError;
2869
+ var MAX_SAFE_INTEGER = 0x1FFFFFFFFFFFFF; // 2 ** 53 - 1 == 9007199254740991
2870
+
2871
+ var doesNotExceedSafeInteger$1 = function (it) {
2872
+ if (it > MAX_SAFE_INTEGER) throw $TypeError$1('Maximum allowed index exceeded');
2873
+ return it;
2874
+ };
2875
+
2876
+ var isArray$1 = isArray$2;
2877
+ var lengthOfArrayLike$2 = lengthOfArrayLike$5;
2878
+ var doesNotExceedSafeInteger = doesNotExceedSafeInteger$1;
2879
+ var bind = functionBindContext;
2880
+
2881
+ // `FlattenIntoArray` abstract operation
2882
+ // https://tc39.github.io/proposal-flatMap/#sec-FlattenIntoArray
2883
+ var flattenIntoArray$1 = function (target, original, source, sourceLen, start, depth, mapper, thisArg) {
2884
+ var targetIndex = start;
2885
+ var sourceIndex = 0;
2886
+ var mapFn = mapper ? bind(mapper, thisArg) : false;
2887
+ var element, elementLen;
2888
+
2889
+ while (sourceIndex < sourceLen) {
2890
+ if (sourceIndex in source) {
2891
+ element = mapFn ? mapFn(source[sourceIndex], sourceIndex, original) : source[sourceIndex];
2892
+
2893
+ if (depth > 0 && isArray$1(element)) {
2894
+ elementLen = lengthOfArrayLike$2(element);
2895
+ targetIndex = flattenIntoArray$1(target, original, element, elementLen, targetIndex, depth - 1) - 1;
2896
+ } else {
2897
+ doesNotExceedSafeInteger(targetIndex + 1);
2898
+ target[targetIndex] = element;
2899
+ }
2900
+
2901
+ targetIndex++;
2902
+ }
2903
+ sourceIndex++;
2904
+ }
2905
+ return targetIndex;
2906
+ };
2907
+
2908
+ var flattenIntoArray_1 = flattenIntoArray$1;
2909
+
2910
+ var isArray = isArray$2;
2911
+ var isConstructor = isConstructor$2;
2912
+ var isObject$1 = isObject$a;
2913
+ var wellKnownSymbol$3 = wellKnownSymbol$h;
2914
+
2915
+ var SPECIES = wellKnownSymbol$3('species');
2916
+ var $Array = Array;
2917
+
2918
+ // a part of `ArraySpeciesCreate` abstract operation
2919
+ // https://tc39.es/ecma262/#sec-arrayspeciescreate
2920
+ var arraySpeciesConstructor$1 = function (originalArray) {
2921
+ var C;
2922
+ if (isArray(originalArray)) {
2923
+ C = originalArray.constructor;
2924
+ // cross-realm fallback
2925
+ if (isConstructor(C) && (C === $Array || isArray(C.prototype))) C = undefined;
2926
+ else if (isObject$1(C)) {
2927
+ C = C[SPECIES];
2928
+ if (C === null) C = undefined;
2929
+ }
2930
+ } return C === undefined ? $Array : C;
2931
+ };
2932
+
2933
+ var arraySpeciesConstructor = arraySpeciesConstructor$1;
2934
+
2935
+ // `ArraySpeciesCreate` abstract operation
2936
+ // https://tc39.es/ecma262/#sec-arrayspeciescreate
2937
+ var arraySpeciesCreate$1 = function (originalArray, length) {
2938
+ return new (arraySpeciesConstructor(originalArray))(length === 0 ? 0 : length);
2939
+ };
2940
+
2941
+ var $$3 = _export;
2942
+ var flattenIntoArray = flattenIntoArray_1;
2943
+ var toObject$2 = toObject$5;
2944
+ var lengthOfArrayLike$1 = lengthOfArrayLike$5;
2945
+ var toIntegerOrInfinity = toIntegerOrInfinity$3;
2946
+ var arraySpeciesCreate = arraySpeciesCreate$1;
2947
+
2948
+ // `Array.prototype.flat` method
2949
+ // https://tc39.es/ecma262/#sec-array.prototype.flat
2950
+ $$3({ target: 'Array', proto: true }, {
2951
+ flat: function flat(/* depthArg = 1 */) {
2952
+ var depthArg = arguments.length ? arguments[0] : undefined;
2953
+ var O = toObject$2(this);
2954
+ var sourceLen = lengthOfArrayLike$1(O);
2955
+ var A = arraySpeciesCreate(O, 0);
2956
+ A.length = flattenIntoArray(A, O, O, sourceLen, 0, depthArg === undefined ? 1 : toIntegerOrInfinity(depthArg));
2957
+ return A;
2958
+ }
2959
+ });
2960
+
2961
+ // this method was added to unscopables after implementation
2962
+ // in popular engines, so it's moved to a separate module
2963
+ var addToUnscopables$1 = addToUnscopables$3;
2964
+
2965
+ // https://tc39.es/ecma262/#sec-array.prototype-@@unscopables
2966
+ addToUnscopables$1('flat');
2967
+
2845
2968
  var fails$3 = fails$h;
2846
2969
 
2847
2970
  var correctPrototypeGetter = !fails$3(function () {
@@ -2853,7 +2976,7 @@ var correctPrototypeGetter = !fails$3(function () {
2853
2976
 
2854
2977
  var hasOwn = hasOwnProperty_1;
2855
2978
  var isCallable$2 = isCallable$k;
2856
- var toObject$2 = toObject$5;
2979
+ var toObject$1 = toObject$5;
2857
2980
  var sharedKey = sharedKey$3;
2858
2981
  var CORRECT_PROTOTYPE_GETTER = correctPrototypeGetter;
2859
2982
 
@@ -2865,7 +2988,7 @@ var ObjectPrototype = $Object.prototype;
2865
2988
  // https://tc39.es/ecma262/#sec-object.getprototypeof
2866
2989
  // eslint-disable-next-line es/no-object-getprototypeof -- safe
2867
2990
  var objectGetPrototypeOf = CORRECT_PROTOTYPE_GETTER ? $Object.getPrototypeOf : function (O) {
2868
- var object = toObject$2(O);
2991
+ var object = toObject$1(O);
2869
2992
  if (hasOwn(object, IE_PROTO)) return object[IE_PROTO];
2870
2993
  var constructor = object.constructor;
2871
2994
  if (isCallable$2(constructor) && object instanceof constructor) {
@@ -2875,12 +2998,12 @@ var objectGetPrototypeOf = CORRECT_PROTOTYPE_GETTER ? $Object.getPrototypeOf : f
2875
2998
 
2876
2999
  var fails$2 = fails$h;
2877
3000
  var isCallable$1 = isCallable$k;
2878
- var isObject$1 = isObject$a;
3001
+ var isObject = isObject$a;
2879
3002
  var getPrototypeOf$1 = objectGetPrototypeOf;
2880
3003
  var defineBuiltIn$1 = defineBuiltIn$6;
2881
- var wellKnownSymbol$3 = wellKnownSymbol$h;
3004
+ var wellKnownSymbol$2 = wellKnownSymbol$h;
2882
3005
 
2883
- var ITERATOR$3 = wellKnownSymbol$3('iterator');
3006
+ var ITERATOR$3 = wellKnownSymbol$2('iterator');
2884
3007
  var BUGGY_SAFARI_ITERATORS$1 = false;
2885
3008
 
2886
3009
  // `%IteratorPrototype%` object
@@ -2898,7 +3021,7 @@ if ([].keys) {
2898
3021
  }
2899
3022
  }
2900
3023
 
2901
- var NEW_ITERATOR_PROTOTYPE = !isObject$1(IteratorPrototype$2) || fails$2(function () {
3024
+ var NEW_ITERATOR_PROTOTYPE = !isObject(IteratorPrototype$2) || fails$2(function () {
2902
3025
  var test = {};
2903
3026
  // FF44- legacy iterators case
2904
3027
  return IteratorPrototype$2[ITERATOR$3].call(test) !== test;
@@ -2935,7 +3058,7 @@ var iteratorCreateConstructor = function (IteratorConstructor, NAME, next, ENUME
2935
3058
  return IteratorConstructor;
2936
3059
  };
2937
3060
 
2938
- var $$3 = _export;
3061
+ var $$2 = _export;
2939
3062
  var call = functionCall;
2940
3063
  var FunctionName = functionName;
2941
3064
  var isCallable = isCallable$k;
@@ -2945,7 +3068,7 @@ var setPrototypeOf = objectSetPrototypeOf;
2945
3068
  var setToStringTag = setToStringTag$3;
2946
3069
  var createNonEnumerableProperty$1 = createNonEnumerableProperty$4;
2947
3070
  var defineBuiltIn = defineBuiltIn$6;
2948
- var wellKnownSymbol$2 = wellKnownSymbol$h;
3071
+ var wellKnownSymbol$1 = wellKnownSymbol$h;
2949
3072
  var Iterators$1 = iterators;
2950
3073
  var IteratorsCore = iteratorsCore;
2951
3074
 
@@ -2953,7 +3076,7 @@ var PROPER_FUNCTION_NAME = FunctionName.PROPER;
2953
3076
  var CONFIGURABLE_FUNCTION_NAME = FunctionName.CONFIGURABLE;
2954
3077
  var IteratorPrototype = IteratorsCore.IteratorPrototype;
2955
3078
  var BUGGY_SAFARI_ITERATORS = IteratorsCore.BUGGY_SAFARI_ITERATORS;
2956
- var ITERATOR$2 = wellKnownSymbol$2('iterator');
3079
+ var ITERATOR$2 = wellKnownSymbol$1('iterator');
2957
3080
  var KEYS = 'keys';
2958
3081
  var VALUES = 'values';
2959
3082
  var ENTRIES = 'entries';
@@ -3020,7 +3143,7 @@ var iteratorDefine = function (Iterable, NAME, IteratorConstructor, next, DEFAUL
3020
3143
  if (BUGGY_SAFARI_ITERATORS || INCORRECT_VALUES_NAME || !(KEY in IterablePrototype)) {
3021
3144
  defineBuiltIn(IterablePrototype, KEY, methods[KEY]);
3022
3145
  }
3023
- } else $$3({ target: NAME, proto: true, forced: BUGGY_SAFARI_ITERATORS || INCORRECT_VALUES_NAME }, methods);
3146
+ } else $$2({ target: NAME, proto: true, forced: BUGGY_SAFARI_ITERATORS || INCORRECT_VALUES_NAME }, methods);
3024
3147
  }
3025
3148
 
3026
3149
  // define iterator
@@ -3039,7 +3162,7 @@ var createIterResultObject$1 = function (value, done) {
3039
3162
  };
3040
3163
 
3041
3164
  var toIndexedObject = toIndexedObject$5;
3042
- var addToUnscopables$1 = addToUnscopables$3;
3165
+ var addToUnscopables = addToUnscopables$3;
3043
3166
  var Iterators = iterators;
3044
3167
  var InternalStateModule = internalState;
3045
3168
  var defineProperty = objectDefineProperty.f;
@@ -3090,9 +3213,9 @@ var es_array_iterator = defineIterator(Array, 'Array', function (iterated, kind)
3090
3213
  var values = Iterators.Arguments = Iterators.Array;
3091
3214
 
3092
3215
  // https://tc39.es/ecma262/#sec-array.prototype-@@unscopables
3093
- addToUnscopables$1('keys');
3094
- addToUnscopables$1('values');
3095
- addToUnscopables$1('entries');
3216
+ addToUnscopables('keys');
3217
+ addToUnscopables('values');
3218
+ addToUnscopables('entries');
3096
3219
 
3097
3220
  // V8 ~ Chrome 45- bug
3098
3221
  if (DESCRIPTORS && values.name !== 'values') try {
@@ -3148,10 +3271,10 @@ var DOMIterables = domIterables;
3148
3271
  var DOMTokenListPrototype = domTokenListPrototype;
3149
3272
  var ArrayIteratorMethods = es_array_iterator;
3150
3273
  var createNonEnumerableProperty = createNonEnumerableProperty$4;
3151
- var wellKnownSymbol$1 = wellKnownSymbol$h;
3274
+ var wellKnownSymbol = wellKnownSymbol$h;
3152
3275
 
3153
- var ITERATOR$1 = wellKnownSymbol$1('iterator');
3154
- var TO_STRING_TAG = wellKnownSymbol$1('toStringTag');
3276
+ var ITERATOR$1 = wellKnownSymbol('iterator');
3277
+ var TO_STRING_TAG = wellKnownSymbol('toStringTag');
3155
3278
  var ArrayValues = ArrayIteratorMethods.values;
3156
3279
 
3157
3280
  var handlePrototype = function (CollectionPrototype, COLLECTION_NAME) {
@@ -3182,115 +3305,54 @@ for (var COLLECTION_NAME in DOMIterables) {
3182
3305
 
3183
3306
  handlePrototype(DOMTokenListPrototype, 'DOMTokenList');
3184
3307
 
3185
- var classof = classofRaw$2;
3186
-
3187
- // `IsArray` abstract operation
3188
- // https://tc39.es/ecma262/#sec-isarray
3189
- // eslint-disable-next-line es/no-array-isarray -- safe
3190
- var isArray$2 = Array.isArray || function isArray(argument) {
3191
- return classof(argument) == 'Array';
3192
- };
3193
-
3194
- var $TypeError$1 = TypeError;
3195
- var MAX_SAFE_INTEGER = 0x1FFFFFFFFFFFFF; // 2 ** 53 - 1 == 9007199254740991
3196
-
3197
- var doesNotExceedSafeInteger$1 = function (it) {
3198
- if (it > MAX_SAFE_INTEGER) throw $TypeError$1('Maximum allowed index exceeded');
3199
- return it;
3200
- };
3201
-
3202
- var isArray$1 = isArray$2;
3203
- var lengthOfArrayLike$2 = lengthOfArrayLike$5;
3204
- var doesNotExceedSafeInteger = doesNotExceedSafeInteger$1;
3205
- var bind = functionBindContext;
3206
-
3207
- // `FlattenIntoArray` abstract operation
3208
- // https://tc39.github.io/proposal-flatMap/#sec-FlattenIntoArray
3209
- var flattenIntoArray$1 = function (target, original, source, sourceLen, start, depth, mapper, thisArg) {
3210
- var targetIndex = start;
3211
- var sourceIndex = 0;
3212
- var mapFn = mapper ? bind(mapper, thisArg) : false;
3213
- var element, elementLen;
3214
-
3215
- while (sourceIndex < sourceLen) {
3216
- if (sourceIndex in source) {
3217
- element = mapFn ? mapFn(source[sourceIndex], sourceIndex, original) : source[sourceIndex];
3218
-
3219
- if (depth > 0 && isArray$1(element)) {
3220
- elementLen = lengthOfArrayLike$2(element);
3221
- targetIndex = flattenIntoArray$1(target, original, element, elementLen, targetIndex, depth - 1) - 1;
3308
+ class ElementSeenObserver {
3309
+ constructor(_options) {
3310
+ this._options = _options;
3311
+ this._elementDelays = new WeakMap();
3312
+ this._intersectionTimers = new WeakMap();
3313
+ if (typeof IntersectionObserver !== 'undefined') {
3314
+ this._intersectionObserver = new IntersectionObserver(this.onIntersection.bind(this));
3315
+ }
3316
+ }
3317
+ onIntersection(entries) {
3318
+ entries.forEach(entry => {
3319
+ const {
3320
+ isIntersecting,
3321
+ target
3322
+ } = entry;
3323
+ if (isIntersecting) {
3324
+ const delay = this._elementDelays.get(target);
3325
+ const timeOut = window.setTimeout(() => {
3326
+ this._options.onElementSeen(target);
3327
+ }, delay);
3328
+ this._intersectionTimers.set(target, timeOut);
3222
3329
  } else {
3223
- doesNotExceedSafeInteger(targetIndex + 1);
3224
- target[targetIndex] = element;
3330
+ const timeOut = this._intersectionTimers.get(target);
3331
+ if (typeof timeOut !== 'undefined') {
3332
+ window.clearTimeout(timeOut);
3333
+ }
3225
3334
  }
3226
-
3227
- targetIndex++;
3228
- }
3229
- sourceIndex++;
3335
+ });
3230
3336
  }
3231
- return targetIndex;
3232
- };
3233
-
3234
- var flattenIntoArray_1 = flattenIntoArray$1;
3235
-
3236
- var isArray = isArray$2;
3237
- var isConstructor = isConstructor$2;
3238
- var isObject = isObject$a;
3239
- var wellKnownSymbol = wellKnownSymbol$h;
3240
-
3241
- var SPECIES = wellKnownSymbol('species');
3242
- var $Array = Array;
3337
+ observe(element, options) {
3338
+ var _a, _b;
3339
+ this._elementDelays.set(element, (_a = options === null || options === void 0 ? void 0 : options.delay) !== null && _a !== void 0 ? _a : 2000);
3340
+ (_b = this._intersectionObserver) === null || _b === void 0 ? void 0 : _b.observe(element);
3341
+ }
3342
+ unobserve(element) {
3343
+ var _a;
3344
+ (_a = this._intersectionObserver) === null || _a === void 0 ? void 0 : _a.unobserve(element);
3345
+ }
3346
+ }
3243
3347
 
3244
- // a part of `ArraySpeciesCreate` abstract operation
3245
- // https://tc39.es/ecma262/#sec-arrayspeciescreate
3246
- var arraySpeciesConstructor$1 = function (originalArray) {
3247
- var C;
3248
- if (isArray(originalArray)) {
3249
- C = originalArray.constructor;
3250
- // cross-realm fallback
3251
- if (isConstructor(C) && (C === $Array || isArray(C.prototype))) C = undefined;
3252
- else if (isObject(C)) {
3253
- C = C[SPECIES];
3254
- if (C === null) C = undefined;
3255
- }
3256
- } return C === undefined ? $Array : C;
3348
+ const acceptsCredentials = plugin => {
3349
+ return typeof plugin === 'object' && plugin !== null && 'setCredentials' in plugin && typeof plugin.setCredentials === 'function';
3257
3350
  };
3258
3351
 
3259
- var arraySpeciesConstructor = arraySpeciesConstructor$1;
3260
-
3261
- // `ArraySpeciesCreate` abstract operation
3262
- // https://tc39.es/ecma262/#sec-arrayspeciescreate
3263
- var arraySpeciesCreate$1 = function (originalArray, length) {
3264
- return new (arraySpeciesConstructor(originalArray))(length === 0 ? 0 : length);
3352
+ const isInterestedInHiddenPage = arg => {
3353
+ return typeof arg === 'object' && arg !== null && PAGE_HIDDEN in arg && typeof arg[PAGE_HIDDEN] === 'function';
3265
3354
  };
3266
3355
 
3267
- var $$2 = _export;
3268
- var flattenIntoArray = flattenIntoArray_1;
3269
- var toObject$1 = toObject$5;
3270
- var lengthOfArrayLike$1 = lengthOfArrayLike$5;
3271
- var toIntegerOrInfinity = toIntegerOrInfinity$3;
3272
- var arraySpeciesCreate = arraySpeciesCreate$1;
3273
-
3274
- // `Array.prototype.flat` method
3275
- // https://tc39.es/ecma262/#sec-array.prototype.flat
3276
- $$2({ target: 'Array', proto: true }, {
3277
- flat: function flat(/* depthArg = 1 */) {
3278
- var depthArg = arguments.length ? arguments[0] : undefined;
3279
- var O = toObject$1(this);
3280
- var sourceLen = lengthOfArrayLike$1(O);
3281
- var A = arraySpeciesCreate(O, 0);
3282
- A.length = flattenIntoArray(A, O, O, sourceLen, 0, depthArg === undefined ? 1 : toIntegerOrInfinity(depthArg));
3283
- return A;
3284
- }
3285
- });
3286
-
3287
- // this method was added to unscopables after implementation
3288
- // in popular engines, so it's moved to a separate module
3289
- var addToUnscopables = addToUnscopables$3;
3290
-
3291
- // https://tc39.es/ecma262/#sec-array.prototype-@@unscopables
3292
- addToUnscopables('flat');
3293
-
3294
3356
  class Ninetailed {
3295
3357
  constructor(ninetailedApiClientInstanceOrOptions, {
3296
3358
  plugins,
@@ -3346,6 +3408,28 @@ class Ninetailed {
3346
3408
  type: HAS_SEEN_EXPERIENCE
3347
3409
  }));
3348
3410
  };
3411
+ this.observeElement = (payload, options) => {
3412
+ const {
3413
+ element
3414
+ } = payload,
3415
+ remaingPayload = __rest(payload, ["element"]);
3416
+ this.observedElements.set(element, remaingPayload);
3417
+ this.elementSeenObserver.observe(element, options);
3418
+ };
3419
+ this.unobserveElement = element => {
3420
+ this.observedElements.delete(element);
3421
+ this.elementSeenObserver.unobserve(element);
3422
+ };
3423
+ this.onElementSeen = element => {
3424
+ const payload = this.observedElements.get(element);
3425
+ if (typeof payload !== 'undefined') {
3426
+ this.instance.dispatch(Object.assign(Object.assign({
3427
+ element
3428
+ }, payload), {
3429
+ type: HAS_SEEN_ELEMENT
3430
+ }));
3431
+ }
3432
+ };
3349
3433
  this.identify = (uid, traits, options) => __awaiter(this, void 0, void 0, function* () {
3350
3434
  try {
3351
3435
  const result = experience_jsShared.Traits.default({}).safeParse(traits);
@@ -3413,6 +3497,18 @@ class Ninetailed {
3413
3497
  this.onIsInitialized(resolve);
3414
3498
  });
3415
3499
  };
3500
+ this.onVisibilityChange = () => {
3501
+ if (typeof document === 'undefined') {
3502
+ return;
3503
+ }
3504
+ document.addEventListener('visibilitychange', () => {
3505
+ if (document.visibilityState === 'hidden') {
3506
+ this.instance.dispatch({
3507
+ type: PAGE_HIDDEN
3508
+ });
3509
+ }
3510
+ });
3511
+ };
3416
3512
  if (ninetailedApiClientInstanceOrOptions instanceof experience_jsShared.NinetailedApiClient) {
3417
3513
  this.apiClient = ninetailedApiClientInstanceOrOptions;
3418
3514
  } else {
@@ -3430,15 +3526,15 @@ class Ninetailed {
3430
3526
  preview
3431
3527
  });
3432
3528
  }
3433
- this.plugins = [...(plugins || []).map(plugin => {
3434
- if ('setCredentials' in plugin && typeof plugin['setCredentials'] === 'function') {
3435
- plugin['setCredentials']({
3529
+ this.plugins = (plugins !== null && plugins !== void 0 ? plugins : []).flat();
3530
+ this.plugins.forEach(plugin => {
3531
+ if (acceptsCredentials(plugin) && this.clientId && this.environment) {
3532
+ plugin.setCredentials({
3436
3533
  clientId: this.clientId,
3437
3534
  environment: this.environment
3438
3535
  });
3439
3536
  }
3440
- return plugin;
3441
- }).flat()];
3537
+ });
3442
3538
  if (profile) {
3443
3539
  this._profileState = {
3444
3540
  status: 'success',
@@ -3486,6 +3582,14 @@ class Ninetailed {
3486
3582
  });
3487
3583
  }
3488
3584
  });
3585
+ this.observedElements = new WeakMap();
3586
+ this.elementSeenObserver = new ElementSeenObserver({
3587
+ onElementSeen: this.onElementSeen.bind(this)
3588
+ });
3589
+ const hasPluginsInterestedInHiddenPage = this.plugins.some(isInterestedInHiddenPage);
3590
+ if (hasPluginsInterestedInHiddenPage) {
3591
+ this.onVisibilityChange();
3592
+ }
3489
3593
  this.registerWindowHandlers();
3490
3594
  }
3491
3595
  get profileState() {
@@ -3929,11 +4033,13 @@ exports.CONSENT = CONSENT;
3929
4033
  exports.DEBUG_FLAG = DEBUG_FLAG;
3930
4034
  exports.EMPTY_MERGE_ID = EMPTY_MERGE_ID;
3931
4035
  exports.HAS_SEEN_COMPONENT = HAS_SEEN_COMPONENT;
4036
+ exports.HAS_SEEN_ELEMENT = HAS_SEEN_ELEMENT;
3932
4037
  exports.HAS_SEEN_EXPERIENCE = HAS_SEEN_EXPERIENCE;
3933
4038
  exports.LEGACY_ANONYMOUS_ID = LEGACY_ANONYMOUS_ID;
3934
4039
  exports.Ninetailed = Ninetailed;
3935
4040
  exports.NinetailedPlugin = NinetailedPlugin;
3936
4041
  exports.OnChangeEmitter = OnChangeEmitter;
4042
+ exports.PAGE_HIDDEN = PAGE_HIDDEN;
3937
4043
  exports.PLUGIN_NAME = PLUGIN_NAME;
3938
4044
  exports.PROFILE_CHANGE = PROFILE_CHANGE;
3939
4045
  exports.PROFILE_FALLBACK_CACHE = PROFILE_FALLBACK_CACHE;
@@ -3941,6 +4047,7 @@ exports.PROFILE_RESET = PROFILE_RESET;
3941
4047
  exports.SET_ENABLED_FEATURES = SET_ENABLED_FEATURES;
3942
4048
  exports.TrackComponentProperties = TrackComponentProperties;
3943
4049
  exports.TrackExperienceProperties = TrackExperienceProperties;
4050
+ exports.buildClientNinetailedRequestContext = buildClientNinetailedRequestContext;
3944
4051
  exports.decodeExperienceVariantsMap = decodeExperienceVariantsMap;
3945
4052
  exports.makeExperienceSelectMiddleware = makeExperienceSelectMiddleware;
3946
4053
  exports.ninetailedPlugin = ninetailedPlugin;
package/index.d.ts CHANGED
@@ -7,5 +7,9 @@ export * from './lib/experience';
7
7
  export * from './lib/plugins/selectPluginsHavingExperienceSelectionMiddleware';
8
8
  export * from './lib/plugins/selectPluginsHavingOnChangeEmitter';
9
9
  export * from './lib/types/interfaces/HasExperienceSelectionMiddleware';
10
+ export * from './lib/types/interfaces/InterestedInSeenElements';
11
+ export * from './lib/types/interfaces/InterestedInProfileChange';
12
+ export * from './lib/types/interfaces/InterestedInHiddenPage';
13
+ export * from './lib/types/interfaces/AcceptsCredentials';
10
14
  export * from './lib/utils/OnChangeEmitter';
11
15
  export type { Profile } from '@ninetailed/experience.js-shared';