@adobe/alloy 2.19.0-beta.1 → 2.19.0-beta.10

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.
Files changed (49) hide show
  1. package/libEs5/components/DataCollector/index.js +12 -21
  2. package/libEs5/components/DataCollector/validateApplyResponse.js +2 -2
  3. package/libEs5/components/DataCollector/validateUserEventOptions.js +6 -4
  4. package/libEs5/components/Personalization/constants/scopeType.js +6 -2
  5. package/libEs5/components/Personalization/createApplyPropositions.js +6 -2
  6. package/libEs5/components/Personalization/createClickStorage.js +21 -13
  7. package/libEs5/components/Personalization/createComponent.js +21 -10
  8. package/libEs5/components/Personalization/createFetchDataHandler.js +13 -12
  9. package/libEs5/components/Personalization/createOnClickHandler.js +4 -5
  10. package/libEs5/components/Personalization/createPersonalizationDetails.js +6 -6
  11. package/libEs5/components/Personalization/createViewCacheManager.js +11 -11
  12. package/libEs5/components/Personalization/createViewChangeHandler.js +1 -6
  13. package/libEs5/components/Personalization/dom-actions/clicks/collectClicks.js +43 -23
  14. package/libEs5/components/Personalization/{utils/isPageWideScope.js → dom-actions/createRedirect.js} +10 -5
  15. package/libEs5/components/Personalization/handlers/createProcessDomAction.js +19 -4
  16. package/libEs5/components/Personalization/handlers/createProcessHtmlContent.js +8 -2
  17. package/libEs5/components/Personalization/handlers/createProcessPropositions.js +2 -2
  18. package/libEs5/components/Personalization/handlers/createProcessRedirect.js +7 -3
  19. package/libEs5/components/Personalization/handlers/injectCreateProposition.js +13 -15
  20. package/libEs5/components/Personalization/index.js +8 -13
  21. package/libEs5/constants/libraryVersion.js +1 -1
  22. package/libEs5/core/createEvent.js +1 -1
  23. package/libEs5/core/createEventManager.js +19 -26
  24. package/libEs6/components/DataCollector/index.js +7 -15
  25. package/libEs6/components/DataCollector/validateApplyResponse.js +2 -2
  26. package/libEs6/components/DataCollector/validateUserEventOptions.js +6 -4
  27. package/libEs6/components/Personalization/constants/scopeType.js +3 -1
  28. package/libEs6/components/Personalization/createApplyPropositions.js +7 -3
  29. package/libEs6/components/Personalization/createClickStorage.js +18 -10
  30. package/libEs6/components/Personalization/createComponent.js +20 -11
  31. package/libEs6/components/Personalization/createFetchDataHandler.js +13 -12
  32. package/libEs6/components/Personalization/createOnClickHandler.js +5 -6
  33. package/libEs6/components/Personalization/createPersonalizationDetails.js +6 -6
  34. package/libEs6/components/Personalization/createViewCacheManager.js +8 -10
  35. package/libEs6/components/Personalization/createViewChangeHandler.js +0 -5
  36. package/libEs6/components/Personalization/dom-actions/clicks/collectClicks.js +28 -12
  37. package/libEs6/components/Personalization/{utils/isPageWideScope.js → dom-actions/createRedirect.js} +7 -4
  38. package/libEs6/components/Personalization/handlers/createProcessDomAction.js +17 -4
  39. package/libEs6/components/Personalization/handlers/createProcessHtmlContent.js +8 -2
  40. package/libEs6/components/Personalization/handlers/createProcessPropositions.js +2 -2
  41. package/libEs6/components/Personalization/handlers/createProcessRedirect.js +7 -3
  42. package/libEs6/components/Personalization/handlers/injectCreateProposition.js +12 -15
  43. package/libEs6/components/Personalization/index.js +8 -11
  44. package/libEs6/constants/libraryVersion.js +1 -1
  45. package/libEs6/core/createEvent.js +1 -1
  46. package/libEs6/core/createEventManager.js +9 -19
  47. package/package.json +3 -3
  48. package/libEs5/components/Personalization/createPendingNotificationsHandler.js +0 -26
  49. package/libEs6/components/Personalization/createPendingNotificationsHandler.js +0 -22
@@ -1,6 +1,9 @@
1
1
  "use strict";
2
2
 
3
3
  exports.default = void 0;
4
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
5
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
6
+ function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
4
7
  /*
5
8
  Copyright 2023 Adobe. All rights reserved.
6
9
  This file is licensed to you under the Apache License, Version 2.0 (the "License");
@@ -22,16 +25,25 @@ var _default = function _default(_ref) {
22
25
  selector = _ref2.selector;
23
26
  if (!type) {
24
27
  logger.warn("Invalid DOM action data: missing type.", item.getData());
25
- return {};
28
+ return {
29
+ setRenderAttempted: false,
30
+ includeInNotification: false
31
+ };
26
32
  }
27
33
  if (type === "click") {
28
34
  if (!selector) {
29
35
  logger.warn("Invalid DOM action data: missing selector.", item.getData());
30
- return {};
36
+ return {
37
+ setRenderAttempted: false,
38
+ includeInNotification: false
39
+ };
31
40
  }
32
41
  storeClickMetrics({
33
42
  selector: selector,
34
- meta: item.getMeta()
43
+ meta: _objectSpread(_objectSpread({}, item.getProposition().getNotification()), {}, {
44
+ trackingLabel: item.getTrackingLabel(),
45
+ scopeType: item.getProposition().getScopeType()
46
+ })
35
47
  });
36
48
  return {
37
49
  setRenderAttempted: true,
@@ -40,7 +52,10 @@ var _default = function _default(_ref) {
40
52
  }
41
53
  if (!modules[type]) {
42
54
  logger.warn("Invalid DOM action data: unknown type.", item.getData());
43
- return {};
55
+ return {
56
+ setRenderAttempted: false,
57
+ includeInNotification: false
58
+ };
44
59
  }
45
60
  return {
46
61
  render: function render() {
@@ -20,11 +20,17 @@ var _default = function _default(_ref) {
20
20
  type = _ref2.type,
21
21
  selector = _ref2.selector;
22
22
  if (!selector || !type) {
23
- return {};
23
+ return {
24
+ setRenderAttempted: false,
25
+ includeInNotification: false
26
+ };
24
27
  }
25
28
  if (!modules[type]) {
26
29
  logger.warn("Invalid HTML content data", item.getData());
27
- return {};
30
+ return {
31
+ setRenderAttempted: false,
32
+ includeInNotification: false
33
+ };
28
34
  }
29
35
  return {
30
36
  render: function render() {
@@ -32,8 +32,8 @@ var _default = function _default(_ref) {
32
32
  if (logger.enabled) {
33
33
  var message = error.message,
34
34
  stack = error.stack;
35
- var errorMessage = "Failed to execute action " + item.toString() + ". " + message + " " + stack;
36
- logger.error(errorMessage);
35
+ var warning = "Failed to execute action " + item.toString() + ". " + message + " " + stack;
36
+ logger.warn(warning);
37
37
  }
38
38
  return false;
39
39
  });
@@ -25,10 +25,14 @@ var _default = function _default(_ref) {
25
25
  }
26
26
  var render = function render() {
27
27
  return collect({
28
- decisionsMeta: [item.getMeta()]
28
+ decisionsMeta: [item.getProposition().getNotification()],
29
+ documentMayUnload: true
29
30
  }).then(function () {
30
- executeRedirect(content);
31
- // We've already sent the display notification, so don't return anything
31
+ return executeRedirect(content);
32
+ // Execute redirect will never resolve. If there are bottom of page events that are waiting
33
+ // for display notifications from this request, they will never run because this promise will
34
+ // not resolve. This is intentional because we don't want to run bottom of page events if
35
+ // there is a redirect.
32
36
  });
33
37
  };
34
38
 
@@ -2,6 +2,7 @@
2
2
 
3
3
  exports.default = void 0;
4
4
  var _pageWideScope = require("../../../constants/pageWideScope");
5
+ var _scopeType = require("../constants/scopeType");
5
6
  function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
6
7
  function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
7
8
  function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } /*
@@ -18,16 +19,13 @@ function _defineProperty(obj, key, value) { if (key in obj) { Object.definePrope
18
19
  var _default = function _default(_ref) {
19
20
  var preprocess = _ref.preprocess,
20
21
  isPageWideSurface = _ref.isPageWideSurface;
21
- var createItem = function createItem(item, meta) {
22
+ var createItem = function createItem(item, proposition) {
22
23
  var schema = item.schema,
23
24
  data = item.data,
24
25
  _item$characteristics = item.characteristics;
25
26
  _item$characteristics = _item$characteristics === void 0 ? {} : _item$characteristics;
26
27
  var trackingLabel = _item$characteristics.trackingLabel;
27
28
  var processedData = preprocess(data);
28
- if (trackingLabel) {
29
- meta.trackingLabel = trackingLabel;
30
- }
31
29
  return {
32
30
  getSchema: function getSchema() {
33
31
  return schema;
@@ -35,8 +33,11 @@ var _default = function _default(_ref) {
35
33
  getData: function getData() {
36
34
  return processedData;
37
35
  },
38
- getMeta: function getMeta() {
39
- return meta;
36
+ getProposition: function getProposition() {
37
+ return proposition;
38
+ },
39
+ getTrackingLabel: function getTrackingLabel() {
40
+ return trackingLabel;
40
41
  },
41
42
  getOriginalItem: function getOriginalItem() {
42
43
  return item;
@@ -69,20 +70,17 @@ var _default = function _default(_ref) {
69
70
  },
70
71
  getScopeType: function getScopeType() {
71
72
  if (scope === _pageWideScope.default || isPageWideSurface(scope)) {
72
- return "page";
73
+ return _scopeType.PAGE_SCOPE_TYPE;
73
74
  }
74
- if (scopeType === "view") {
75
- return "view";
75
+ if (scopeType === _scopeType.VIEW_SCOPE_TYPE) {
76
+ return _scopeType.VIEW_SCOPE_TYPE;
76
77
  }
77
- return "proposition";
78
+ return _scopeType.PROPOSITION_SCOPE_TYPE;
78
79
  },
79
80
  getItems: function getItems() {
81
+ var _this = this;
80
82
  return items.map(function (item) {
81
- return createItem(item, {
82
- id: id,
83
- scope: scope,
84
- scopeDetails: scopeDetails
85
- });
83
+ return createItem(item, _this);
86
84
  });
87
85
  },
88
86
  getNotification: function getNotification() {
@@ -22,7 +22,6 @@ var _remapHeadOffers = require("./dom-actions/remapHeadOffers");
22
22
  var _createPreprocess = require("./dom-actions/createPreprocess");
23
23
  var _injectCreateProposition = require("./handlers/injectCreateProposition");
24
24
  var _createAsyncArray = require("./utils/createAsyncArray");
25
- var _createPendingNotificationsHandler = require("./createPendingNotificationsHandler");
26
25
  var schema = require("./constants/schema");
27
26
  var _processDefaultContent = require("./handlers/processDefaultContent");
28
27
  var _surfaceUtils = require("./utils/surfaceUtils");
@@ -30,6 +29,7 @@ var _createProcessDomAction = require("./handlers/createProcessDomAction");
30
29
  var _createProcessHtmlContent = require("./handlers/createProcessHtmlContent");
31
30
  var _createProcessRedirect = require("./handlers/createProcessRedirect");
32
31
  var _createProcessPropositions = require("./handlers/createProcessPropositions");
32
+ var _createRedirect = require("./dom-actions/createRedirect");
33
33
  function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } /*
34
34
  Copyright 2019 Adobe. All rights reserved.
35
35
  This file is licensed to you under the Apache License, Version 2.0 (the "License");
@@ -68,6 +68,7 @@ var createPersonalization = function createPersonalization(_ref) {
68
68
  var viewCache = (0, _createViewCacheManager.default)({
69
69
  createProposition: createProposition
70
70
  });
71
+ var executeRedirect = (0, _createRedirect.default)(window);
71
72
  var schemaProcessors = (_schemaProcessors = {}, _defineProperty(_schemaProcessors, schema.DEFAULT_CONTENT_ITEM, _processDefaultContent.default), _defineProperty(_schemaProcessors, schema.DOM_ACTION, (0, _createProcessDomAction.default)({
72
73
  modules: modules,
73
74
  logger: logger,
@@ -77,20 +78,14 @@ var createPersonalization = function createPersonalization(_ref) {
77
78
  logger: logger
78
79
  })), _defineProperty(_schemaProcessors, schema.REDIRECT_ITEM, (0, _createProcessRedirect.default)({
79
80
  logger: logger,
80
- executeRedirect: function executeRedirect(url) {
81
- return window.location.replace(url);
82
- },
81
+ executeRedirect: executeRedirect,
83
82
  collect: collect
84
83
  })), _schemaProcessors);
85
84
  var processPropositions = (0, _createProcessPropositions.default)({
86
85
  schemaProcessors: schemaProcessors,
87
86
  logger: logger
88
87
  });
89
- var pendingDisplayNotifications = (0, _createAsyncArray.default)();
90
- var pendingNotificationsHandler = (0, _createPendingNotificationsHandler.default)({
91
- pendingDisplayNotifications: pendingDisplayNotifications,
92
- mergeDecisionsMeta: _event.mergeDecisionsMeta
93
- });
88
+ var renderedPropositions = (0, _createAsyncArray.default)();
94
89
  var fetchDataHandler = (0, _createFetchDataHandler.default)({
95
90
  prehidingStyle: prehidingStyle,
96
91
  showContainers: _flicker.showContainers,
@@ -99,7 +94,7 @@ var createPersonalization = function createPersonalization(_ref) {
99
94
  collect: collect,
100
95
  processPropositions: processPropositions,
101
96
  createProposition: createProposition,
102
- pendingDisplayNotifications: pendingDisplayNotifications
97
+ renderedPropositions: renderedPropositions
103
98
  });
104
99
  var onClickHandler = (0, _createOnClickHandler.default)({
105
100
  mergeDecisionsMeta: _event.mergeDecisionsMeta,
@@ -108,14 +103,13 @@ var createPersonalization = function createPersonalization(_ref) {
108
103
  getClickMetasBySelector: getClickMetasBySelector
109
104
  });
110
105
  var viewChangeHandler = (0, _createViewChangeHandler.default)({
111
- mergeDecisionsMeta: _event.mergeDecisionsMeta,
112
106
  processPropositions: processPropositions,
113
107
  viewCache: viewCache
114
108
  });
115
109
  var applyPropositions = (0, _createApplyPropositions.default)({
116
110
  processPropositions: processPropositions,
117
111
  createProposition: createProposition,
118
- pendingDisplayNotifications: pendingDisplayNotifications,
112
+ renderedPropositions: renderedPropositions,
119
113
  viewCache: viewCache
120
114
  });
121
115
  var setTargetMigration = (0, _createSetTargetMigration.default)({
@@ -133,7 +127,8 @@ var createPersonalization = function createPersonalization(_ref) {
133
127
  showContainers: _flicker.showContainers,
134
128
  applyPropositions: applyPropositions,
135
129
  setTargetMigration: setTargetMigration,
136
- pendingNotificationsHandler: pendingNotificationsHandler
130
+ mergeDecisionsMeta: _event.mergeDecisionsMeta,
131
+ renderedPropositions: renderedPropositions
137
132
  });
138
133
  };
139
134
  createPersonalization.namespace = "Personalization";
@@ -14,5 +14,5 @@ governing permissions and limitations under the License.
14
14
  */
15
15
  // The __VERSION__ keyword will be replace at alloy build time with the package.json version.
16
16
  // see babel-plugin-version
17
- var _default = "2.19.0-beta.1";
17
+ var _default = "2.19.0-beta.10";
18
18
  exports.default = _default;
@@ -129,7 +129,7 @@ var _default = function _default() {
129
129
  return shouldSendEvent;
130
130
  },
131
131
  getViewName: function getViewName() {
132
- if (!userXdm || !userXdm.web || !userXdm.web.webPageDetails || !userXdm.web.webPageDetails.viewName) {
132
+ if (!userXdm || !userXdm.web || !userXdm.web.webPageDetails) {
133
133
  return undefined;
134
134
  }
135
135
  return userXdm.web.webPageDetails.viewName;
@@ -4,6 +4,7 @@ exports.default = void 0;
4
4
  var _pageWideScope = require("../constants/pageWideScope");
5
5
  var _utils = require("../utils");
6
6
  var _request = require("../utils/request");
7
+ var _excluded = ["edgeConfigOverrides"];
7
8
  /*
8
9
  Copyright 2019 Adobe. All rights reserved.
9
10
  This file is licensed to you under the Apache License, Version 2.0 (the "License");
@@ -15,7 +16,11 @@ the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTA
15
16
  OF ANY KIND, either express or implied. See the License for the specific language
16
17
  governing permissions and limitations under the License.
17
18
  */
18
-
19
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
20
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
21
+ function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
22
+ function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
23
+ function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
19
24
  var EVENT_CANCELLATION_MESSAGE = "Event was canceled because the onBeforeEventSend callback returned false.";
20
25
  var _default = function _default(_ref) {
21
26
  var config = _ref.config,
@@ -32,19 +37,13 @@ var _default = function _default(_ref) {
32
37
  return {
33
38
  createEvent: createEvent,
34
39
  /**
35
- * Sends an event. This includes running the event and payload through
36
- * the appropriate lifecycle hooks, sending the request to the server,
37
- * and handling the response.
38
- * @param {Object} event This will be JSON stringified and used inside
39
- * the request payload.
40
- * @param {Object} [options]
41
- * @param {boolean} [options.renderDecisions=false]
42
- * @param {Array} [options.decisionScopes] Note: this option will soon
43
- * be deprecated, please use *personalization.decisionScopes* instead
44
- * @param {Object} [options.personalization]
45
- * @param {Object} [options.serverState]
46
- * This will be passed to components
47
- * so they can take appropriate action.
40
+ * Sends an event. This includes running the event and payload through the
41
+ * appropriate lifecycle hooks, sending the request to the server, and
42
+ * handling the response.
43
+ * @param {Object} event This will be JSON stringified and used inside the
44
+ * request payload.
45
+ * @param {Object} [options] Options to pass on to the onBeforeEvent
46
+ * lifecycle method
48
47
  * @param {Object} [options.edgeConfigOverrides] Settings that take
49
48
  * precedence over the global datastream configuration, including which
50
49
  * datastream to use.
@@ -52,11 +51,8 @@ var _default = function _default(_ref) {
52
51
  */
53
52
  sendEvent: function sendEvent(event) {
54
53
  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
55
- var _options$renderDecisi = options.renderDecisions,
56
- renderDecisions = _options$renderDecisi === void 0 ? false : _options$renderDecisi,
57
- decisionScopes = options.decisionScopes,
58
- localConfigOverrides = options.edgeConfigOverrides,
59
- personalization = options.personalization;
54
+ var localConfigOverrides = options.edgeConfigOverrides,
55
+ otherOptions = _objectWithoutProperties(options, _excluded);
60
56
  var requestParams = (0, _request.createRequestParams)({
61
57
  payload: createDataCollectionRequestPayload(),
62
58
  localConfigOverrides: localConfigOverrides,
@@ -65,14 +61,11 @@ var _default = function _default(_ref) {
65
61
  var request = createDataCollectionRequest(requestParams);
66
62
  var onResponseCallbackAggregator = (0, _utils.createCallbackAggregator)();
67
63
  var onRequestFailureCallbackAggregator = (0, _utils.createCallbackAggregator)();
68
- return lifecycle.onBeforeEvent({
64
+ return lifecycle.onBeforeEvent(_objectSpread(_objectSpread({}, otherOptions), {}, {
69
65
  event: event,
70
- renderDecisions: renderDecisions,
71
- decisionScopes: decisionScopes,
72
- personalization: personalization,
73
66
  onResponse: onResponseCallbackAggregator.add,
74
67
  onRequestFailure: onRequestFailureCallbackAggregator.add
75
- }).then(function () {
68
+ })).then(function () {
76
69
  requestParams.payload.addEvent(event);
77
70
  return consent.awaitConsent();
78
71
  }).then(function () {
@@ -110,8 +103,8 @@ var _default = function _default(_ref) {
110
103
  },
111
104
  applyResponse: function applyResponse(event) {
112
105
  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
113
- var _options$renderDecisi2 = options.renderDecisions,
114
- renderDecisions = _options$renderDecisi2 === void 0 ? false : _options$renderDecisi2,
106
+ var _options$renderDecisi = options.renderDecisions,
107
+ renderDecisions = _options$renderDecisi === void 0 ? false : _options$renderDecisi,
115
108
  _options$responseHead = options.responseHeaders,
116
109
  responseHeaders = _options$responseHead === void 0 ? {} : _options$responseHead,
117
110
  _options$responseBody = options.responseBody,
@@ -30,15 +30,12 @@ const createDataCollector = ({
30
30
  const {
31
31
  xdm,
32
32
  data,
33
- documentUnloading = false,
33
+ documentUnloading,
34
34
  type,
35
35
  mergeId,
36
- renderDecisions = false,
37
- decisionScopes = [],
38
- // Note: this option will soon be deprecated, please use personalization.decisionScopes instead
39
- personalization = {},
40
36
  datasetId,
41
- edgeConfigOverrides
37
+ edgeConfigOverrides,
38
+ ...eventManagerOptions
42
39
  } = options;
43
40
  const event = eventManager.createEvent();
44
41
  if (documentUnloading) {
@@ -56,18 +53,13 @@ const createDataCollector = ({
56
53
  eventMergeId: mergeId
57
54
  });
58
55
  }
59
- const sendEventOptions = {
60
- renderDecisions,
61
- decisionScopes,
62
- personalization
63
- };
64
56
  if (edgeConfigOverrides) {
65
- sendEventOptions.edgeConfigOverrides = edgeConfigOverrides;
57
+ eventManagerOptions.edgeConfigOverrides = edgeConfigOverrides;
66
58
  }
67
59
  if (datasetId) {
68
60
  logger.warn("The 'datasetId' option has been deprecated. Please use 'edgeConfigOverrides.com_adobe_experience_platform.datasets.event.datasetId' instead.");
69
- sendEventOptions.edgeConfigOverrides = edgeConfigOverrides || {};
70
- deepAssign(sendEventOptions.edgeConfigOverrides, {
61
+ eventManagerOptions.edgeConfigOverrides = edgeConfigOverrides || {};
62
+ deepAssign(eventManagerOptions.edgeConfigOverrides, {
71
63
  com_adobe_experience_platform: {
72
64
  datasets: {
73
65
  event: {
@@ -77,7 +69,7 @@ const createDataCollector = ({
77
69
  }
78
70
  });
79
71
  }
80
- return eventManager.sendEvent(event, sendEventOptions);
72
+ return eventManager.sendEvent(event, eventManagerOptions);
81
73
  }
82
74
  },
83
75
  applyResponse: {
@@ -23,9 +23,9 @@ export default (({
23
23
  })).required()
24
24
  }).required(),
25
25
  personalization: objectOf({
26
- sendDisplayNotifications: boolean().default(true)
26
+ sendDisplayEvent: boolean().default(true)
27
27
  }).default({
28
- sendDisplayNotifications: true
28
+ sendDisplayEvent: true
29
29
  })
30
30
  }).noUnknownFields();
31
31
  return validator(options);
@@ -33,14 +33,16 @@ export default (({
33
33
  personalization: objectOf({
34
34
  decisionScopes: arrayOf(string()).uniqueItems(),
35
35
  surfaces: arrayOf(string()).uniqueItems(),
36
- sendDisplayNotifications: boolean().default(true),
37
- includePendingDisplayNotifications: boolean().default(false)
36
+ sendDisplayEvent: boolean().default(true),
37
+ includeRenderedPropositions: boolean().default(false),
38
+ requestPersonalization: boolean()
38
39
  }).default({
39
- sendDisplayNotifications: true
40
+ sendDisplayEvent: true
40
41
  }),
41
42
  datasetId: string(),
42
43
  mergeId: string(),
43
- edgeConfigOverrides: validateConfigOverride
44
+ edgeConfigOverrides: validateConfigOverride,
45
+ initializePersonalization: boolean()
44
46
  }).required().noUnknownFields();
45
47
  return eventOptionsValidator(options);
46
48
  });
@@ -10,4 +10,6 @@ OF ANY KIND, either express or implied. See the License for the specific languag
10
10
  governing permissions and limitations under the License.
11
11
  */
12
12
 
13
- export const VIEW_SCOPE_TYPE = "view";
13
+ export const VIEW_SCOPE_TYPE = "view";
14
+ export const PAGE_SCOPE_TYPE = "page";
15
+ export const PROPOSITION_SCOPE_TYPE = "proposition";
@@ -10,14 +10,14 @@ OF ANY KIND, either express or implied. See the License for the specific languag
10
10
  governing permissions and limitations under the License.
11
11
  */
12
12
 
13
- import { isNonEmptyArray, isObject } from "../../utils";
13
+ import { isNonEmptyArray, isObject, defer } from "../../utils";
14
14
  import { DOM_ACTION, HTML_CONTENT_ITEM } from "./constants/schema";
15
15
  import PAGE_WIDE_SCOPE from "../../constants/pageWideScope";
16
16
  const SUPPORTED_SCHEMAS = [DOM_ACTION, HTML_CONTENT_ITEM];
17
17
  export default (({
18
18
  processPropositions,
19
19
  createProposition,
20
- pendingDisplayNotifications,
20
+ renderedPropositions,
21
21
  viewCache
22
22
  }) => {
23
23
  const filterItemsPredicate = item => SUPPORTED_SCHEMAS.indexOf(item.schema) > -1;
@@ -76,6 +76,10 @@ export default (({
76
76
  metadata = {},
77
77
  viewName
78
78
  }) => {
79
+ // We need to immediately call concat so that subsequent sendEvent
80
+ // calls will wait for applyPropositions to complete before executing.
81
+ const renderedPropositionsDeferred = defer();
82
+ renderedPropositions.concat(renderedPropositionsDeferred.promise);
79
83
  const propositionsToExecute = preparePropositions({
80
84
  propositions,
81
85
  metadata
@@ -90,7 +94,7 @@ export default (({
90
94
  render,
91
95
  returnedPropositions
92
96
  } = processPropositions([...propositionsToExecute, ...additionalPropositions]);
93
- pendingDisplayNotifications.concat(render());
97
+ render().then(renderedPropositionsDeferred.resolve);
94
98
  return {
95
99
  propositions: returnedPropositions
96
100
  };
@@ -14,22 +14,30 @@ const metasToArray = metas => {
14
14
  return Object.keys(metas).map(key => {
15
15
  return {
16
16
  id: key,
17
- scope: metas[key].scope,
18
- scopeDetails: metas[key].scopeDetails,
19
- trackingLabel: metas[key].trackingLabel
17
+ ...metas[key]
20
18
  };
21
19
  });
22
20
  };
23
21
  export default (() => {
24
22
  const clickStorage = {};
25
- const storeClickMetrics = value => {
26
- if (!clickStorage[value.selector]) {
27
- clickStorage[value.selector] = {};
23
+ const storeClickMetrics = ({
24
+ selector,
25
+ meta: {
26
+ id,
27
+ scope,
28
+ scopeDetails,
29
+ trackingLabel,
30
+ scopeType
28
31
  }
29
- clickStorage[value.selector][value.meta.id] = {
30
- scope: value.meta.scope,
31
- scopeDetails: value.meta.scopeDetails,
32
- trackingLabel: value.meta.trackingLabel
32
+ }) => {
33
+ if (!clickStorage[selector]) {
34
+ clickStorage[selector] = {};
35
+ }
36
+ clickStorage[selector][id] = {
37
+ scope,
38
+ scopeDetails,
39
+ trackingLabel,
40
+ scopeType
33
41
  };
34
42
  };
35
43
  const getClickSelectors = () => {
@@ -10,10 +10,11 @@ OF ANY KIND, either express or implied. See the License for the specific languag
10
10
  governing permissions and limitations under the License.
11
11
  */
12
12
 
13
- import { noop } from "../../utils";
13
+ import { noop, flatMap, isNonEmptyArray } from "../../utils";
14
14
  import createPersonalizationDetails from "./createPersonalizationDetails";
15
15
  import { AUTHORING_ENABLED } from "./constants/loggerMessage";
16
16
  import validateApplyPropositionsOptions from "./validateApplyPropositionsOptions";
17
+ import { PropositionEventType } from "./constants/propositionEventType";
17
18
  export default (({
18
19
  getPageLocation,
19
20
  logger,
@@ -26,7 +27,8 @@ export default (({
26
27
  showContainers,
27
28
  applyPropositions,
28
29
  setTargetMigration,
29
- pendingNotificationsHandler
30
+ mergeDecisionsMeta,
31
+ renderedPropositions
30
32
  }) => {
31
33
  return {
32
34
  lifecycle: {
@@ -67,11 +69,9 @@ export default (({
67
69
  isCacheInitialized: viewCache.isInitialized(),
68
70
  logger
69
71
  });
70
- const handlerPromises = [];
71
- if (personalizationDetails.shouldAddPendingDisplayNotifications()) {
72
- handlerPromises.push(pendingNotificationsHandler({
73
- event
74
- }));
72
+ const decisionsMetaPromises = [];
73
+ if (personalizationDetails.shouldIncludeRenderedPropositions()) {
74
+ decisionsMetaPromises.push(renderedPropositions.clear());
75
75
  }
76
76
  if (personalizationDetails.shouldFetchData()) {
77
77
  const cacheUpdate = viewCache.createCacheUpdate(personalizationDetails.getViewName());
@@ -84,16 +84,25 @@ export default (({
84
84
  });
85
85
  } else if (personalizationDetails.shouldUseCachedData()) {
86
86
  // eslint-disable-next-line consistent-return
87
- handlerPromises.push(viewChangeHandler({
87
+ decisionsMetaPromises.push(viewChangeHandler({
88
88
  personalizationDetails,
89
89
  event,
90
90
  onResponse,
91
91
  onRequestFailure
92
92
  }));
93
93
  }
94
- // We can wait for personalization to be applied and for
95
- // the fetch data request to complete in parallel.
96
- return Promise.all(handlerPromises);
94
+
95
+ // This promise.all waits for both the pending display notifications to be resolved
96
+ // (i.e. the top of page call to finish rendering) and the view change handler to
97
+ // finish rendering anything for this view.
98
+ return Promise.all(decisionsMetaPromises).then(decisionsMetas => {
99
+ // We only want to call mergeDecisionsMeta once, but we can get the propositions
100
+ // from two places: the pending display notifications and the view change handler.
101
+ const decisionsMeta = flatMap(decisionsMetas, dms => dms);
102
+ if (isNonEmptyArray(decisionsMeta)) {
103
+ mergeDecisionsMeta(event, decisionsMeta, PropositionEventType.DISPLAY);
104
+ }
105
+ });
97
106
  },
98
107
  onClick({
99
108
  event,
@@ -19,7 +19,7 @@ export default (({
19
19
  collect,
20
20
  processPropositions,
21
21
  createProposition,
22
- pendingDisplayNotifications
22
+ renderedPropositions
23
23
  }) => {
24
24
  return ({
25
25
  cacheUpdate,
@@ -29,10 +29,12 @@ export default (({
29
29
  }) => {
30
30
  if (personalizationDetails.isRenderDecisions()) {
31
31
  hideContainers(prehidingStyle);
32
+ } else {
33
+ showContainers();
32
34
  }
33
35
  mergeQuery(event, personalizationDetails.createQueryDetails());
34
36
  let handleNotifications;
35
- if (personalizationDetails.isSendDisplayNotifications()) {
37
+ if (personalizationDetails.isSendDisplayEvent()) {
36
38
  handleNotifications = decisionsMeta => {
37
39
  if (decisionsMeta.length > 0) {
38
40
  collect({
@@ -42,9 +44,9 @@ export default (({
42
44
  }
43
45
  };
44
46
  } else {
45
- const displayNotificationsDeferred = defer();
46
- pendingDisplayNotifications.concat(displayNotificationsDeferred.promise);
47
- handleNotifications = displayNotificationsDeferred.resolve;
47
+ const renderedPropositionsDeferred = defer();
48
+ renderedPropositions.concat(renderedPropositionsDeferred.promise);
49
+ handleNotifications = renderedPropositionsDeferred.resolve;
48
50
  }
49
51
  onResponse(({
50
52
  response
@@ -66,13 +68,12 @@ export default (({
66
68
  returnedPropositions,
67
69
  returnedDecisions
68
70
  } = processPropositions([...pagePropositions, ...currentViewPropositions], nonRenderedPropositions));
69
- render().then(decisionsMeta => {
70
- showContainers();
71
- handleNotifications(decisionsMeta);
72
- }).catch(e => {
73
- showContainers();
74
- throw e;
75
- });
71
+ render().then(handleNotifications);
72
+
73
+ // Render could take a long time especially if one of the renders
74
+ // is waiting for html to appear on the page. We show the containers
75
+ // immediately, and whatever renders quickly will not have flicker.
76
+ showContainers();
76
77
  } else {
77
78
  ({
78
79
  returnedPropositions,