@envive-ai/react-hooks 0.3.21 → 0.3.23
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/application/models/featureGates.cjs +2 -1
- package/dist/application/models/featureGates.d.cts +2 -1
- package/dist/application/models/featureGates.d.ts +2 -1
- package/dist/application/models/featureGates.js +2 -1
- package/dist/atoms/app/index.d.cts +7 -7
- package/dist/atoms/app/variant.d.cts +6 -6
- package/dist/atoms/app/variant.d.ts +6 -6
- package/dist/atoms/chat/chatState.cjs +3 -1
- package/dist/atoms/chat/chatState.d.cts +22 -19
- package/dist/atoms/chat/chatState.d.ts +22 -19
- package/dist/atoms/chat/chatState.js +3 -2
- package/dist/atoms/chat/form.d.cts +3 -3
- package/dist/atoms/chat/form.d.ts +2 -2
- package/dist/atoms/chat/index.cjs +1 -0
- package/dist/atoms/chat/index.d.cts +4 -4
- package/dist/atoms/chat/index.d.ts +4 -4
- package/dist/atoms/chat/index.js +2 -2
- package/dist/atoms/chat/lastMessage.d.cts +2 -2
- package/dist/atoms/chat/lastMessage.d.ts +2 -2
- package/dist/atoms/chat/messageQueue.d.cts +7 -7
- package/dist/atoms/chat/messageQueue.d.ts +6 -6
- package/dist/atoms/chat/performanceMetrics.d.cts +6 -6
- package/dist/atoms/chat/performanceMetrics.d.ts +6 -6
- package/dist/atoms/chat/renderedWidgetRefs.d.cts +3 -3
- package/dist/atoms/chat/renderedWidgetRefs.d.ts +2 -2
- package/dist/atoms/chat/replies.d.cts +3 -3
- package/dist/atoms/chat/replies.d.ts +2 -2
- package/dist/atoms/chat/suggestions.d.cts +3 -3
- package/dist/atoms/chat/suggestions.d.ts +2 -2
- package/dist/atoms/envive/enviveConfig.d.cts +13 -13
- package/dist/atoms/envive/enviveConfig.d.ts +1 -1
- package/dist/atoms/globalSearch/globalSearch.d.cts +5 -5
- package/dist/atoms/globalSearch/globalSearch.d.ts +5 -5
- package/dist/atoms/org/customerService.d.cts +6 -6
- package/dist/atoms/org/customerService.d.ts +6 -6
- package/dist/atoms/org/graphqlConfig.d.cts +4 -4
- package/dist/atoms/org/graphqlConfig.d.ts +4 -4
- package/dist/atoms/org/newOrgConfigAtom.d.cts +2 -2
- package/dist/atoms/org/newOrgConfigAtom.d.ts +2 -2
- package/dist/atoms/org/orgAnalyticsConfig.d.cts +5 -5
- package/dist/atoms/org/orgAnalyticsConfig.d.ts +5 -5
- package/dist/atoms/search/chatSearch.d.cts +17 -17
- package/dist/atoms/search/chatSearch.d.ts +17 -17
- package/dist/atoms/search/searchAPI.d.cts +13 -13
- package/dist/atoms/search/types.d.cts +1 -1
- package/dist/atoms/search/types.d.ts +1 -1
- package/dist/atoms/search/utils.d.ts +1 -1
- package/dist/atoms/widget/chatPreviewLoading.d.cts +2 -2
- package/dist/atoms/widget/chatPreviewLoading.d.ts +2 -2
- package/dist/contexts/amplitudeContext/amplitudeContext.cjs +9 -3
- package/dist/contexts/amplitudeContext/amplitudeContext.d.cts +2 -1
- package/dist/contexts/amplitudeContext/amplitudeContext.d.ts +2 -1
- package/dist/contexts/amplitudeContext/amplitudeContext.js +9 -3
- package/dist/contexts/enviveContext/enviveContext.cjs +3 -3
- package/dist/contexts/enviveContext/enviveContext.js +3 -3
- package/dist/contexts/enviveContext/types.d.ts +1 -1
- package/dist/contexts/hardcopyContext/hardcopyContext.cjs +5 -3
- package/dist/contexts/hardcopyContext/hardcopyContext.js +5 -3
- package/dist/contexts/salesAgentContext/chatAPI.cjs +12 -5
- package/dist/contexts/salesAgentContext/chatAPI.js +13 -6
- package/dist/contexts/systemSettingsContext/systemSettingsContext.d.cts +2 -2
- package/dist/contexts/types.d.cts +1 -1
- package/dist/contexts/typesV3.cjs +1 -1
- package/dist/contexts/typesV3.d.cts +2 -1
- package/dist/contexts/typesV3.d.ts +2 -1
- package/dist/contexts/typesV3.js +1 -1
- package/dist/hooks/GrabAndScroll/useGrabAndScroll.d.cts +2 -2
- package/dist/hooks/Search/useSearch.cjs +12 -4
- package/dist/hooks/Search/useSearch.js +12 -4
- package/dist/hooks/Search/useSearchInput.cjs +1 -1
- package/dist/hooks/Search/useSearchInput.js +1 -1
- package/dist/hooks/SystemSettingsContext/useSystemSettingsContext.d.cts +2 -2
- package/dist/hooks/TrackComponentVisibleEvent/useTrackComponentVisibleEvent.cjs +26 -27
- package/dist/hooks/TrackComponentVisibleEvent/useTrackComponentVisibleEvent.d.cts +8 -8
- package/dist/hooks/TrackComponentVisibleEvent/useTrackComponentVisibleEvent.d.ts +8 -8
- package/dist/hooks/TrackComponentVisibleEvent/useTrackComponentVisibleEvent.js +27 -28
- package/dist/hooks/WidgetInteraction/types.cjs +29 -1
- package/dist/hooks/WidgetInteraction/types.d.cts +17 -3
- package/dist/hooks/WidgetInteraction/types.d.ts +17 -3
- package/dist/hooks/WidgetInteraction/types.js +28 -2
- package/dist/hooks/WidgetInteraction/useWidgetInteraction.cjs +6 -2
- package/dist/hooks/WidgetInteraction/useWidgetInteraction.js +6 -2
- package/dist/hooks/utils.d.cts +1 -1
- package/dist/hooks/utils.d.ts +1 -1
- package/dist/services/amplitudeService/amplitudeService.cjs +9 -1
- package/dist/services/amplitudeService/amplitudeService.d.cts +2 -1
- package/dist/services/amplitudeService/amplitudeService.d.ts +2 -1
- package/dist/services/amplitudeService/amplitudeService.js +9 -1
- package/dist/services/ga4ProjectionService/ga4EventSchema.cjs +31 -27
- package/dist/services/ga4ProjectionService/ga4EventSchema.js +31 -27
- package/dist/services/ga4ProjectionService/ga4ProjectionService.cjs +31 -5
- package/dist/services/ga4ProjectionService/ga4ProjectionService.js +31 -5
- package/package.json +1 -1
- package/src/application/models/featureGates.ts +1 -0
- package/src/atoms/chat/chatState.ts +1 -0
- package/src/contexts/amplitudeContext/__tests__/amplitudeContext.test.tsx +31 -27
- package/src/contexts/amplitudeContext/amplitudeContext.tsx +5 -2
- package/src/contexts/hardcopyContext/hardcopyContext.tsx +10 -2
- package/src/contexts/pageContext/__tests__/pageContext.test.tsx +10 -0
- package/src/contexts/salesAgentContext/chatAPI.ts +6 -2
- package/src/contexts/typesV3.ts +1 -0
- package/src/hooks/Search/__tests__/useSearch.test.tsx +0 -4
- package/src/hooks/Search/useSearch.tsx +14 -8
- package/src/hooks/TrackComponentVisibleEvent/useTrackComponentVisibleEvent.ts +36 -35
- package/src/hooks/WidgetInteraction/types.ts +35 -2
- package/src/hooks/WidgetInteraction/useWidgetInteraction.ts +3 -1
- package/src/services/amplitudeService/__tests__/amplitudeService.test.ts +69 -6
- package/src/services/amplitudeService/amplitudeService.ts +13 -0
- package/src/services/ga4ProjectionService/__tests__/ga4ProjectionService.test.ts +110 -49
- package/src/services/ga4ProjectionService/ga4EventSchema.ts +35 -27
- package/src/services/ga4ProjectionService/ga4ProjectionService.ts +60 -6
|
@@ -24,31 +24,34 @@ import { EnviveMetricsEventName } from "../amplitudeService/eventNames.js";
|
|
|
24
24
|
* IF IN DOUBT, DON'T HESITATE TO REACH OUT TO THE ANALYTICS TEAM!!!
|
|
25
25
|
*/
|
|
26
26
|
const WIDGET_INTERACTION_DATA_PROJECTIONS = {
|
|
27
|
-
widget_collapsed: {
|
|
28
|
-
product_card_clicked: {
|
|
29
|
-
suggestion_scrolled: {
|
|
27
|
+
widget_collapsed: { interaction_collapse_source: "widget_collapsed.collapse_source" },
|
|
28
|
+
product_card_clicked: { interaction_product_id: "product_card_clicked.product_id" },
|
|
29
|
+
suggestion_scrolled: { interaction_suggestion_id: "suggestion_scrolled.suggestion_id" }
|
|
30
30
|
};
|
|
31
31
|
const GA4_EVENT_SCHEMA = {
|
|
32
32
|
[EnviveMetricsEventName.WidgetRendered]: {
|
|
33
33
|
gaEventName: "envive_widget_rendered",
|
|
34
|
-
allowedFields: [
|
|
35
|
-
|
|
36
|
-
"context.
|
|
37
|
-
"
|
|
38
|
-
"
|
|
39
|
-
"
|
|
40
|
-
|
|
34
|
+
allowedFields: [],
|
|
35
|
+
fieldProjections: {
|
|
36
|
+
page_type: "context.page_type",
|
|
37
|
+
page_id: "context.page_id",
|
|
38
|
+
surface: "context.surface",
|
|
39
|
+
widget: "trigger.widget",
|
|
40
|
+
widget_role: "trigger.widget_role"
|
|
41
|
+
}
|
|
41
42
|
},
|
|
42
43
|
[EnviveMetricsEventName.WidgetInteraction]: {
|
|
43
44
|
gaEventName: "envive_widget_interaction",
|
|
44
|
-
allowedFields: [
|
|
45
|
-
|
|
46
|
-
"context.
|
|
47
|
-
"
|
|
48
|
-
"
|
|
49
|
-
"trigger.
|
|
50
|
-
"
|
|
51
|
-
|
|
45
|
+
allowedFields: [],
|
|
46
|
+
fieldProjections: {
|
|
47
|
+
page_type: "context.page_type",
|
|
48
|
+
page_id: "context.page_id",
|
|
49
|
+
surface: "context.surface",
|
|
50
|
+
widget: "trigger.widget",
|
|
51
|
+
interaction_type: "trigger.widget_interaction",
|
|
52
|
+
interaction_class: "trigger.interaction_class",
|
|
53
|
+
widget_role: "trigger.widget_role"
|
|
54
|
+
},
|
|
52
55
|
widgetInteractionDataProjections: WIDGET_INTERACTION_DATA_PROJECTIONS
|
|
53
56
|
},
|
|
54
57
|
[EnviveMetricsEventName.ChatRequest]: {
|
|
@@ -90,14 +93,15 @@ const GA4_EVENT_SCHEMA = {
|
|
|
90
93
|
},
|
|
91
94
|
[EnviveMetricsEventName.PageViewed]: {
|
|
92
95
|
gaEventName: "envive_page_context_evaluated",
|
|
93
|
-
allowedFields: [
|
|
94
|
-
|
|
95
|
-
"context.
|
|
96
|
-
"context.
|
|
97
|
-
"context.
|
|
98
|
-
"context.
|
|
99
|
-
"
|
|
100
|
-
|
|
96
|
+
allowedFields: [],
|
|
97
|
+
fieldProjections: {
|
|
98
|
+
page_type: "context.page_type",
|
|
99
|
+
page_id: "context.page_id",
|
|
100
|
+
context_supported: "context.supported",
|
|
101
|
+
context_ready: "context.ready",
|
|
102
|
+
context_page_variant_id: "context.page_variant_id",
|
|
103
|
+
environment_envive_enabled: "environment.envive_enabled"
|
|
104
|
+
}
|
|
101
105
|
},
|
|
102
106
|
[EnviveMetricsEventName.WidgetTextRequest]: { gaEventName: null },
|
|
103
107
|
[EnviveMetricsEventName.WidgetTextResponse]: { gaEventName: null },
|
|
@@ -106,4 +110,4 @@ const GA4_EVENT_SCHEMA = {
|
|
|
106
110
|
|
|
107
111
|
//#endregion
|
|
108
112
|
export { GA4_EVENT_SCHEMA };
|
|
109
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,
|
|
113
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2E0RXZlbnRTY2hlbWEuanMiLCJuYW1lcyI6WyJXSURHRVRfSU5URVJBQ1RJT05fREFUQV9QUk9KRUNUSU9OUzogV2lkZ2V0SW50ZXJhY3Rpb25EYXRhUHJvamVjdGlvbiIsIkdBNF9FVkVOVF9TQ0hFTUE6IFJlY29yZDxFbnZpdmVNZXRyaWNzRXZlbnROYW1lLCBHQTRFdmVudFNjaGVtYUVudHJ5PiJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zZXJ2aWNlcy9nYTRQcm9qZWN0aW9uU2VydmljZS9nYTRFdmVudFNjaGVtYS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEdBNCBFdmVudCBTY2hlbWEg4oCUIHNpbmdsZSBzb3VyY2Ugb2YgdHJ1dGggZm9yIEVudml2ZSDihpIgR0E0IHByb2plY3Rpb24uXG4gKlxuICogRXZlcnkgRW52aXZlTWV0cmljc0V2ZW50TmFtZSBNVVNUIGhhdmUgYW4gZW50cnkgaGVyZS4gVGhlIFJlY29yZCB0eXBlIGVuZm9yY2VzXG4gKiB0aGlzIGF0IGNvbXBpbGUgdGltZSDigJQgYWRkaW5nIGEgbmV3IGVudW0gbWVtYmVyIHdpdGhvdXQgYSBzY2hlbWEgZW50cnkgd2lsbFxuICogY2F1c2UgYSBUeXBlU2NyaXB0IGVycm9yLlxuICpcbiAqICMjIEhvdyB0byB1cGRhdGUgdGhpcyBmaWxlXG4gKlxuICogV2hlbiBhZGRpbmcgb3IgbW9kaWZ5aW5nIGV2ZW50IHByb3BlcnRpZXMsIGRlY2lkZSB3aGV0aGVyIHRoZXkgYmVsb25nIGluIGBhbGxvd2VkRmllbGRzYCB1c2luZyB0aGVzZSBjcml0ZXJpYTpcbiAqIC0gKipMb3cgY2FyZGluYWxpdHkqKiDigJQgYXZvaWQgdW5ib3VuZGVkIHZhbHVlcyAoZnJlZSB0ZXh0LCBJRHMsIFVSTHMsIHRpbWVzdGFtcHMpLlxuICogLSAqKk5vbi1zZW5zaXRpdmUqKiDigJQgbm8gUElJLCB1c2VyIGlucHV0IHRleHQsIG9yIGludGVybmFsIGltcGxlbWVudGF0aW9uIGRldGFpbHMuXG4gKiAtICoqRmxhdCBzY2FsYXIqKiDigJQgR0E0IGN1c3RvbSBkaW1lbnNpb25zIGFyZSBmbGF0IHN0cmluZ3MvbnVtYmVycy9ib29sZWFucy5cbiAqICAgTmVzdGVkIG9iamVjdHMgc2hvdWxkIE5PVCBiZSBhZGRlZDsgZXh0cmFjdCBzcGVjaWZpYyBzdWItZmllbGRzIGluc3RlYWQuXG4gKiAtICoqU25ha2VfY2FzZSBrZXkqKiDigJQgbXVzdCBhbHJlYWR5IGJlIGRvdC1ub3RhdGlvbiBzbmFrZV9jYXNlIChlLmcuIGBjaGF0LnVzZXJfdHlwZWRgKS5cbiAqIC0gKipBbmFseXRpY2FsbHkgdXNlZnVsKiog4oCUIHRoZSBmaWVsZCBzaG91bGQgZW5hYmxlIG1lYW5pbmdmdWwgZmlsdGVyaW5nL3NlZ21lbnRhdGlvblxuICogICBmb3IgbWVyY2hhbnRzIGluIHRoZWlyIEdBNCBkYXNoYm9hcmRzLlxuICpcbiAqIElmIGV4Y2x1ZGVkIGZyb20gYGFsbG93ZWRGaWVsZHNgLCB0aGUgcHJvamVjdGlvbiBsYXllciB3aWxsIGF1dG9tYXRpY2FsbHkgZHJvcCBpdC5cbiAqXG4gKiBJRiBJTiBET1VCVCwgRE9OJ1QgSEVTSVRBVEUgVE8gUkVBQ0ggT1VUIFRPIFRIRSBBTkFMWVRJQ1MgVEVBTSEhIVxuICovXG5pbXBvcnQgeyBFbnZpdmVNZXRyaWNzRXZlbnROYW1lIH0gZnJvbSAnLi4vYW1wbGl0dWRlU2VydmljZS9ldmVudE5hbWVzJztcblxuLyoqXG4gKiBEZWZpbmVzIHdoaWNoIGZpZWxkcyB0byBleHRyYWN0IGZyb20gYHRyaWdnZXIud2lkZ2V0X2ludGVyYWN0aW9uX2RhdGFgXG4gKiBmb3IgYSBnaXZlbiBgdHJpZ2dlci53aWRnZXRfaW50ZXJhY3Rpb25gIHZhbHVlLlxuICpcbiAqIEtleTogdGhlIHZhbHVlIG9mIGB0cmlnZ2VyLndpZGdldF9pbnRlcmFjdGlvbmAgKGUuZy4gXCJ3aWRnZXRfY29sbGFwc2VkXCIpXG4gKiBWYWx1ZTogbWFwcGluZyBvZiB7IGdhNEZsYXRLZXk6IHNvdXJjZUZpZWxkSW5XaWRnZXRJbnRlcmFjdGlvbkRhdGEgfVxuICovXG5leHBvcnQgdHlwZSBXaWRnZXRJbnRlcmFjdGlvbkRhdGFQcm9qZWN0aW9uID0gUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgc3RyaW5nPj47XG5cbmV4cG9ydCBpbnRlcmZhY2UgR0E0UHJvamVjdGVkRXZlbnRDb25maWcge1xuICBnYUV2ZW50TmFtZTogc3RyaW5nO1xuICBhbGxvd2VkRmllbGRzOiByZWFkb25seSBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIFdoZW4gcHJlc2VudCwgdXNlZCBpbnN0ZWFkIG9mIGBhbGxvd2VkRmllbGRzYCB0byBib3RoIGZpbHRlciBhbmQgcmVuYW1lIGZpZWxkcy5cbiAgICogS2V5OiB0aGUgZGVzaXJlZCBHQTQgcGFyYW1ldGVyIG5hbWUuIFZhbHVlOiB0aGUgc291cmNlIGRvdC1ub3RhdGlvbiBrZXkgaW4gZXZlbnRQcm9wcy5cbiAgICovXG4gIGZpZWxkUHJvamVjdGlvbnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICB3aWRnZXRJbnRlcmFjdGlvbkRhdGFQcm9qZWN0aW9ucz86IFdpZGdldEludGVyYWN0aW9uRGF0YVByb2plY3Rpb247XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR0E0RXhjbHVkZWRFdmVudENvbmZpZyB7XG4gIGdhRXZlbnROYW1lOiBudWxsO1xufVxuXG5leHBvcnQgdHlwZSBHQTRFdmVudFNjaGVtYUVudHJ5ID0gR0E0UHJvamVjdGVkRXZlbnRDb25maWcgfCBHQTRFeGNsdWRlZEV2ZW50Q29uZmlnO1xuXG5jb25zdCBXSURHRVRfSU5URVJBQ1RJT05fREFUQV9QUk9KRUNUSU9OUzogV2lkZ2V0SW50ZXJhY3Rpb25EYXRhUHJvamVjdGlvbiA9IHtcbiAgd2lkZ2V0X2NvbGxhcHNlZDogeyBpbnRlcmFjdGlvbl9jb2xsYXBzZV9zb3VyY2U6ICd3aWRnZXRfY29sbGFwc2VkLmNvbGxhcHNlX3NvdXJjZScgfSxcbiAgcHJvZHVjdF9jYXJkX2NsaWNrZWQ6IHsgaW50ZXJhY3Rpb25fcHJvZHVjdF9pZDogJ3Byb2R1Y3RfY2FyZF9jbGlja2VkLnByb2R1Y3RfaWQnIH0sXG4gIHN1Z2dlc3Rpb25fc2Nyb2xsZWQ6IHsgaW50ZXJhY3Rpb25fc3VnZ2VzdGlvbl9pZDogJ3N1Z2dlc3Rpb25fc2Nyb2xsZWQuc3VnZ2VzdGlvbl9pZCcgfSxcbn07XG5cbmV4cG9ydCBjb25zdCBHQTRfRVZFTlRfU0NIRU1BOiBSZWNvcmQ8RW52aXZlTWV0cmljc0V2ZW50TmFtZSwgR0E0RXZlbnRTY2hlbWFFbnRyeT4gPSB7XG4gIFtFbnZpdmVNZXRyaWNzRXZlbnROYW1lLldpZGdldFJlbmRlcmVkXToge1xuICAgIGdhRXZlbnROYW1lOiAnZW52aXZlX3dpZGdldF9yZW5kZXJlZCcsXG4gICAgYWxsb3dlZEZpZWxkczogW10sXG4gICAgZmllbGRQcm9qZWN0aW9uczoge1xuICAgICAgcGFnZV90eXBlOiAnY29udGV4dC5wYWdlX3R5cGUnLFxuICAgICAgcGFnZV9pZDogJ2NvbnRleHQucGFnZV9pZCcsXG4gICAgICBzdXJmYWNlOiAnY29udGV4dC5zdXJmYWNlJyxcbiAgICAgIHdpZGdldDogJ3RyaWdnZXIud2lkZ2V0JyxcbiAgICAgIHdpZGdldF9yb2xlOiAndHJpZ2dlci53aWRnZXRfcm9sZScsXG4gICAgfSxcbiAgfSxcblxuICBbRW52aXZlTWV0cmljc0V2ZW50TmFtZS5XaWRnZXRJbnRlcmFjdGlvbl06IHtcbiAgICBnYUV2ZW50TmFtZTogJ2Vudml2ZV93aWRnZXRfaW50ZXJhY3Rpb24nLFxuICAgIGFsbG93ZWRGaWVsZHM6IFtdLFxuICAgIGZpZWxkUHJvamVjdGlvbnM6IHtcbiAgICAgIHBhZ2VfdHlwZTogJ2NvbnRleHQucGFnZV90eXBlJyxcbiAgICAgIHBhZ2VfaWQ6ICdjb250ZXh0LnBhZ2VfaWQnLFxuICAgICAgc3VyZmFjZTogJ2NvbnRleHQuc3VyZmFjZScsXG4gICAgICB3aWRnZXQ6ICd0cmlnZ2VyLndpZGdldCcsXG4gICAgICBpbnRlcmFjdGlvbl90eXBlOiAndHJpZ2dlci53aWRnZXRfaW50ZXJhY3Rpb24nLFxuICAgICAgaW50ZXJhY3Rpb25fY2xhc3M6ICd0cmlnZ2VyLmludGVyYWN0aW9uX2NsYXNzJyxcbiAgICAgIHdpZGdldF9yb2xlOiAndHJpZ2dlci53aWRnZXRfcm9sZScsXG4gICAgfSxcbiAgICB3aWRnZXRJbnRlcmFjdGlvbkRhdGFQcm9qZWN0aW9uczogV0lER0VUX0lOVEVSQUNUSU9OX0RBVEFfUFJPSkVDVElPTlMsXG4gIH0sXG5cbiAgW0Vudml2ZU1ldHJpY3NFdmVudE5hbWUuQ2hhdFJlcXVlc3RdOiB7XG4gICAgZ2FFdmVudE5hbWU6ICdlbnZpdmVfY2hhdF9yZXF1ZXN0JyxcbiAgICBhbGxvd2VkRmllbGRzOiBbXG4gICAgICAncGFnZV90eXBlJyxcbiAgICAgICdwYWdlX2lkJyxcbiAgICAgICd0cmlnZ2VyLndpZGdldCcsXG4gICAgICAnY2hhdC5yZXF1ZXN0X3R5cGUnLFxuICAgICAgLy8gJ2NoYXQucmVxdWVzdF90ZXh0JywgLy8gVGhpcyBpcyBoaWdoIGNhcmRpbmFsaXR5IGFuZCBwb3RlbnRpYWxseSBQSUkgYnV0IHdlIG1pZ2h0IHdhbnQgdG8gaW5jbHVkZSBpdCBsYXRlclxuICAgICAgJ2NoYXQudXNlcl90eXBlZCcsXG4gICAgICAnY2hhdC5zdWdnZXN0aW9uX2lkJywgLy8gbm90IGN1cnJlbnRseSBpbXBsZW1lbnRlZFxuICAgICAgJ2NoYXQuc3VnZ2VzdGlvbl9jYXRlZ29yeScsIC8vIG5vdCBjdXJyZW50bHkgaW1wbGVtZW50ZWRcbiAgICAgICdjaGF0LnN1Z2dlc3Rpb25fY3JlYXRlZF9hdCcsIC8vIG5vdCBjdXJyZW50bHkgaW1wbGVtZW50ZWRcbiAgICAgICdjaGF0LnN1Z2dlc3Rpb25faXNfYW5zd2VyJywgLy8gbm90IGN1cnJlbnRseSBpbXBsZW1lbnRlZFxuICAgICAgJ2NoYXQuZm9ybV90eXBlJywgLy8gbm90IGN1cnJlbnRseSBpbXBsZW1lbnRlZFxuICAgIF0sXG4gIH0sXG5cbiAgW0Vudml2ZU1ldHJpY3NFdmVudE5hbWUuQ2hhdFJlc3BvbnNlXToge1xuICAgIGdhRXZlbnROYW1lOiAnZW52aXZlX2NoYXRfcmVzcG9uc2UnLFxuICAgIGFsbG93ZWRGaWVsZHM6IFtcbiAgICAgICdwYWdlX3R5cGUnLFxuICAgICAgJ3BhZ2VfaWQnLFxuICAgICAgJ3RyaWdnZXIud2lkZ2V0JywgLy8gbm90IGN1cnJlbnRseSBpbXBsZW1lbnRlZCAobWF5YmUgaXQgc2hvdWxkJ250IGJlPz8/KVxuICAgICAgJ2NoYXQudXNlcl90eXBlZCcsXG4gICAgICAnY2hhdC5yZXNwb25zZV90aW1lX21zJyxcbiAgICAgICdjaGF0LnByb2R1Y3RfY2FyZHNfcmV0dXJuZWQnLFxuICAgICAgJ2NoYXQucHJvZHVjdF9pZHNfcmV0dXJuZWQnLFxuICAgICAgJ2NoYXQucmV2aWV3X2NhcmRzX3JldHVybmVkJyxcbiAgICBdLFxuICB9LFxuXG4gIFtFbnZpdmVNZXRyaWNzRXZlbnROYW1lLkVudml2ZUluaXRpYWxpemVkXToge1xuICAgIGdhRXZlbnROYW1lOiAnZW52aXZlX2luaXRpYWxpemVkJyxcbiAgICBhbGxvd2VkRmllbGRzOiBbXG4gICAgICAnZW52aXJvbm1lbnQuc2FsZXNfYWdlbnRfZW5hYmxlZCcsXG4gICAgICAnZW52aXJvbm1lbnQuZW52aXZlX2VuYWJsZWQnLFxuICAgICAgLy8gJ2Vudmlyb25tZW50LnNlYXJjaF9lbmFibGVkJywgLy8gRm9yIG5vdywgc2VhcmNoIGlzIG5vdCBpbXBsZW1lbnRlZC4gV2Ugd2lsbCBhZGQgaXQgbGF0ZXIuXG4gICAgICAncGVyZm9ybWFuY2Uuc3RhcnRfdGltZV9tcycsXG4gICAgICAncGVyZm9ybWFuY2UuaW5pdGlhbGl6ZV90aW1lX21zJyxcbiAgICBdLFxuICB9LFxuXG4gIC8vIFRoaXMgZXZlbnQgaXMgbm90IGN1cnJlbnRseSBpbXBsZW1lbnRlZFxuICBbRW52aXZlTWV0cmljc0V2ZW50TmFtZS5QYWdlVmlld2VkXToge1xuICAgIGdhRXZlbnROYW1lOiAnZW52aXZlX3BhZ2VfY29udGV4dF9ldmFsdWF0ZWQnLFxuICAgIGFsbG93ZWRGaWVsZHM6IFtdLFxuICAgIGZpZWxkUHJvamVjdGlvbnM6IHtcbiAgICAgIHBhZ2VfdHlwZTogJ2NvbnRleHQucGFnZV90eXBlJyxcbiAgICAgIHBhZ2VfaWQ6ICdjb250ZXh0LnBhZ2VfaWQnLFxuICAgICAgY29udGV4dF9zdXBwb3J0ZWQ6ICdjb250ZXh0LnN1cHBvcnRlZCcsXG4gICAgICBjb250ZXh0X3JlYWR5OiAnY29udGV4dC5yZWFkeScsXG4gICAgICBjb250ZXh0X3BhZ2VfdmFyaWFudF9pZDogJ2NvbnRleHQucGFnZV92YXJpYW50X2lkJyxcbiAgICAgIGVudmlyb25tZW50X2Vudml2ZV9lbmFibGVkOiAnZW52aXJvbm1lbnQuZW52aXZlX2VuYWJsZWQnLFxuICAgIH0sXG4gIH0sXG5cbiAgW0Vudml2ZU1ldHJpY3NFdmVudE5hbWUuV2lkZ2V0VGV4dFJlcXVlc3RdOiB7XG4gICAgZ2FFdmVudE5hbWU6IG51bGwsXG4gIH0sXG5cbiAgW0Vudml2ZU1ldHJpY3NFdmVudE5hbWUuV2lkZ2V0VGV4dFJlc3BvbnNlXToge1xuICAgIGdhRXZlbnROYW1lOiBudWxsLFxuICB9LFxuXG4gIFtFbnZpdmVNZXRyaWNzRXZlbnROYW1lLldpZGdldFRleHRDbGlja2VkXToge1xuICAgIGdhRXZlbnROYW1lOiBudWxsLFxuICB9LFxufTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWtEQSxNQUFNQSxzQ0FBdUU7Q0FDM0Usa0JBQWtCLEVBQUUsNkJBQTZCLG9DQUFvQztDQUNyRixzQkFBc0IsRUFBRSx3QkFBd0IsbUNBQW1DO0NBQ25GLHFCQUFxQixFQUFFLDJCQUEyQixxQ0FBcUM7Q0FDeEY7QUFFRCxNQUFhQyxtQkFBd0U7RUFDbEYsdUJBQXVCLGlCQUFpQjtFQUN2QyxhQUFhO0VBQ2IsZUFBZSxFQUFFO0VBQ2pCLGtCQUFrQjtHQUNoQixXQUFXO0dBQ1gsU0FBUztHQUNULFNBQVM7R0FDVCxRQUFRO0dBQ1IsYUFBYTtHQUNkO0VBQ0Y7RUFFQSx1QkFBdUIsb0JBQW9CO0VBQzFDLGFBQWE7RUFDYixlQUFlLEVBQUU7RUFDakIsa0JBQWtCO0dBQ2hCLFdBQVc7R0FDWCxTQUFTO0dBQ1QsU0FBUztHQUNULFFBQVE7R0FDUixrQkFBa0I7R0FDbEIsbUJBQW1CO0dBQ25CLGFBQWE7R0FDZDtFQUNELGtDQUFrQztFQUNuQztFQUVBLHVCQUF1QixjQUFjO0VBQ3BDLGFBQWE7RUFDYixlQUFlO0dBQ2I7R0FDQTtHQUNBO0dBQ0E7R0FFQTtHQUNBO0dBQ0E7R0FDQTtHQUNBO0dBQ0E7R0FDRDtFQUNGO0VBRUEsdUJBQXVCLGVBQWU7RUFDckMsYUFBYTtFQUNiLGVBQWU7R0FDYjtHQUNBO0dBQ0E7R0FDQTtHQUNBO0dBQ0E7R0FDQTtHQUNBO0dBQ0Q7RUFDRjtFQUVBLHVCQUF1QixvQkFBb0I7RUFDMUMsYUFBYTtFQUNiLGVBQWU7R0FDYjtHQUNBO0dBRUE7R0FDQTtHQUNEO0VBQ0Y7RUFHQSx1QkFBdUIsYUFBYTtFQUNuQyxhQUFhO0VBQ2IsZUFBZSxFQUFFO0VBQ2pCLGtCQUFrQjtHQUNoQixXQUFXO0dBQ1gsU0FBUztHQUNULG1CQUFtQjtHQUNuQixlQUFlO0dBQ2YseUJBQXlCO0dBQ3pCLDRCQUE0QjtHQUM3QjtFQUNGO0VBRUEsdUJBQXVCLG9CQUFvQixFQUMxQyxhQUFhLE1BQ2Q7RUFFQSx1QkFBdUIscUJBQXFCLEVBQzNDLGFBQWEsTUFDZDtFQUVBLHVCQUF1QixvQkFBb0IsRUFDMUMsYUFBYSxNQUNkO0NBQ0YifQ==
|
|
@@ -8,18 +8,39 @@ const filterToSchema = (eventProps, allowedFields) => {
|
|
|
8
8
|
for (const field of allowedFields) if (field in eventProps) result[field] = eventProps[field];
|
|
9
9
|
return result;
|
|
10
10
|
};
|
|
11
|
+
const flattenOneLevel = (obj) => {
|
|
12
|
+
const result = {};
|
|
13
|
+
for (const [key, value] of Object.entries(obj)) if (!key.includes(".") && value !== null && typeof value === "object" && !Array.isArray(value)) for (const [subKey, subValue] of Object.entries(value)) result[`${key}.${subKey}`] = subValue;
|
|
14
|
+
else result[key] = value;
|
|
15
|
+
return result;
|
|
16
|
+
};
|
|
17
|
+
const filterWithProjections = (eventProps, projections) => {
|
|
18
|
+
const result = {};
|
|
19
|
+
for (const [ga4Key, sourceKey] of Object.entries(projections)) if (sourceKey in eventProps) result[ga4Key] = eventProps[sourceKey];
|
|
20
|
+
return result;
|
|
21
|
+
};
|
|
11
22
|
const flattenDotKeys = (obj) => {
|
|
12
23
|
const result = {};
|
|
13
24
|
for (const [key, value] of Object.entries(obj)) result[key.replace(/\./g, "_")] = value;
|
|
14
25
|
return result;
|
|
15
26
|
};
|
|
16
27
|
const sanitizePageId = (filtered) => {
|
|
17
|
-
const pageType = filtered["context.page_type"];
|
|
28
|
+
const pageType = filtered["page_type"] ?? filtered["context.page_type"];
|
|
18
29
|
if (pageType === "pdp" || pageType === "plp") return filtered;
|
|
19
30
|
const rest = { ...filtered };
|
|
31
|
+
delete rest["page_id"];
|
|
20
32
|
delete rest["context.page_id"];
|
|
21
33
|
return rest;
|
|
22
34
|
};
|
|
35
|
+
const getNestedValue = (obj, path) => {
|
|
36
|
+
const parts = path.split(".");
|
|
37
|
+
let current = obj;
|
|
38
|
+
for (const part of parts) {
|
|
39
|
+
if (current === null || typeof current !== "object") return void 0;
|
|
40
|
+
current = current[part];
|
|
41
|
+
}
|
|
42
|
+
return current;
|
|
43
|
+
};
|
|
23
44
|
const projectWidgetInteractionData = (eventProps, config) => {
|
|
24
45
|
if (!config.widgetInteractionDataProjections) return {};
|
|
25
46
|
const interaction = eventProps["trigger.widget_interaction"];
|
|
@@ -30,7 +51,10 @@ const projectWidgetInteractionData = (eventProps, config) => {
|
|
|
30
51
|
if (interactionData === null || interactionData === void 0 || typeof interactionData !== "object") return {};
|
|
31
52
|
const data = interactionData;
|
|
32
53
|
const result = {};
|
|
33
|
-
for (const [gaKey,
|
|
54
|
+
for (const [gaKey, sourcePath] of Object.entries(projectionMap)) {
|
|
55
|
+
const value = getNestedValue(data, sourcePath);
|
|
56
|
+
if (value !== void 0) result[gaKey] = value;
|
|
57
|
+
}
|
|
34
58
|
return result;
|
|
35
59
|
};
|
|
36
60
|
const truncateString = (value) => {
|
|
@@ -50,8 +74,10 @@ const projectToGA4 = (eventName, eventProps) => {
|
|
|
50
74
|
const schemaEntry = require_ga4EventSchema.GA4_EVENT_SCHEMA[eventName];
|
|
51
75
|
if (schemaEntry.gaEventName === null) return;
|
|
52
76
|
const config = schemaEntry;
|
|
53
|
-
const props = eventProps ?? {};
|
|
54
|
-
let filtered
|
|
77
|
+
const props = flattenOneLevel(eventProps ?? {});
|
|
78
|
+
let filtered;
|
|
79
|
+
if (config.fieldProjections) filtered = filterWithProjections(props, config.fieldProjections);
|
|
80
|
+
else filtered = filterToSchema(props, config.allowedFields);
|
|
55
81
|
filtered = sanitizePageId(filtered);
|
|
56
82
|
const interactionFields = projectWidgetInteractionData(props, config);
|
|
57
83
|
const truncatedParams = truncateValues({
|
|
@@ -69,4 +95,4 @@ const projectToGA4 = (eventName, eventProps) => {
|
|
|
69
95
|
|
|
70
96
|
//#endregion
|
|
71
97
|
exports.projectToGA4 = projectToGA4;
|
|
72
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2E0UHJvamVjdGlvblNlcnZpY2UuY2pzIiwibmFtZXMiOlsiTG9nZ2VyIiwicmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiIsIkdBNF9FVkVOVF9TQ0hFTUEiXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VydmljZXMvZ2E0UHJvamVjdGlvblNlcnZpY2UvZ2E0UHJvamVjdGlvblNlcnZpY2UudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IExvZ2dlciBmcm9tICdzcmMvYXBwbGljYXRpb24vbG9nZ2luZy9sb2dnZXInO1xuaW1wb3J0IHsgRW52aXZlTWV0cmljc0V2ZW50TmFtZSB9IGZyb20gJy4uL2FtcGxpdHVkZVNlcnZpY2UvZXZlbnROYW1lcyc7XG5pbXBvcnQgeyBHQTRQcm9qZWN0ZWRFdmVudENvbmZpZywgR0E0X0VWRU5UX1NDSEVNQSB9IGZyb20gJy4vZ2E0RXZlbnRTY2hlbWEnO1xuXG5jb25zdCBsb2dnZXIgPSBuZXcgTG9nZ2VyKCdnYTRQcm9qZWN0aW9uU2VydmljZScpO1xuXG5jb25zdCBmaWx0ZXJUb1NjaGVtYSA9IChcbiAgZXZlbnRQcm9wczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIGFsbG93ZWRGaWVsZHM6IHJlYWRvbmx5IHN0cmluZ1tdLFxuKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPT4ge1xuICBjb25zdCByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gIGZvciAoY29uc3QgZmllbGQgb2YgYWxsb3dlZEZpZWxkcykge1xuICAgIGlmIChmaWVsZCBpbiBldmVudFByb3BzKSB7XG4gICAgICByZXN1bHRbZmllbGRdID0gZXZlbnRQcm9wc1tmaWVsZF07XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG4vLyBcImNvbnRleHQucGFnZV90eXBlXCIg4oaSIFwiY29udGV4dF9wYWdlX3R5cGVcIlxuY29uc3QgZmxhdHRlbkRvdEtleXMgPSAob2JqOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0+IHtcbiAgY29uc3QgcmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhvYmopKSB7XG4gICAgcmVzdWx0W2tleS5yZXBsYWNlKC9cXC4vZywgJ18nKV0gPSB2YWx1ZTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuLy8gT21pdCBjb250ZXh0LnBhZ2VfaWQgZm9yIG5vbi1wZHAvcGxwIHBhZ2UgdHlwZXMuIFRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIGZvciBjb250ZXh0LnBhZ2VfaWQgaXM6XG4vLyBQRFA6IHByb2R1Y3RfaWRcbi8vIFBMUDogcGxwX2lkXG4vLyBTZWFyY2g6IHNlYXJjaCBxdWVyeVxuLy8gT3RoZXI6IHBhZ2UgdXJsXG4vLyBXZSB3YW50IHRvIG9taXQgYWxsIGJ1dCBwZHAgYW5kIHBscCBwYWdlIHR5cGVzIHRvIHByb3ZpZGUgYSBjbGVhciwgY29uc2lzdGVudCBpbnRlcmZhY2UgZm9yIG1lcmNoYW50cy5cbmNvbnN0IHNhbml0aXplUGFnZUlkID0gKGZpbHRlcmVkOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0+IHtcbiAgY29uc3QgcGFnZVR5cGUgPSBmaWx0ZXJlZFsnY29udGV4dC5wYWdlX3R5cGUnXTtcbiAgaWYgKHBhZ2VUeXBlID09PSAncGRwJyB8fCBwYWdlVHlwZSA9PT0gJ3BscCcpIHtcbiAgICByZXR1cm4gZmlsdGVyZWQ7XG4gIH1cbiAgY29uc3QgcmVzdCA9IHsgLi4uZmlsdGVyZWQgfTtcbiAgZGVsZXRlIHJlc3RbJ2NvbnRleHQucGFnZV9pZCddO1xuICByZXR1cm4gcmVzdDtcbn07XG5cbi8vIEV4dHJhY3Qgd2hpdGVsaXN0ZWQgc3ViLWZpZWxkcyBmcm9tIHRyaWdnZXIud2lkZ2V0X2ludGVyYWN0aW9uX2RhdGFcbmNvbnN0IHByb2plY3RXaWRnZXRJbnRlcmFjdGlvbkRhdGEgPSAoXG4gIGV2ZW50UHJvcHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICBjb25maWc6IEdBNFByb2plY3RlZEV2ZW50Q29uZmlnLFxuKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPT4ge1xuICBpZiAoIWNvbmZpZy53aWRnZXRJbnRlcmFjdGlvbkRhdGFQcm9qZWN0aW9ucykge1xuICAgIHJldHVybiB7fTtcbiAgfVxuXG4gIGNvbnN0IGludGVyYWN0aW9uID0gZXZlbnRQcm9wc1sndHJpZ2dlci53aWRnZXRfaW50ZXJhY3Rpb24nXTtcbiAgaWYgKHR5cGVvZiBpbnRlcmFjdGlvbiAhPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4ge307XG4gIH1cblxuICBjb25zdCBwcm9qZWN0aW9uTWFwID0gY29uZmlnLndpZGdldEludGVyYWN0aW9uRGF0YVByb2plY3Rpb25zW2ludGVyYWN0aW9uXTtcbiAgaWYgKCFwcm9qZWN0aW9uTWFwKSB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG5cbiAgY29uc3QgaW50ZXJhY3Rpb25EYXRhID0gZXZlbnRQcm9wc1sndHJpZ2dlci53aWRnZXRfaW50ZXJhY3Rpb25fZGF0YSddO1xuICBpZiAoXG4gICAgaW50ZXJhY3Rpb25EYXRhID09PSBudWxsIHx8XG4gICAgaW50ZXJhY3Rpb25EYXRhID09PSB1bmRlZmluZWQgfHxcbiAgICB0eXBlb2YgaW50ZXJhY3Rpb25EYXRhICE9PSAnb2JqZWN0J1xuICApIHtcbiAgICByZXR1cm4ge307XG4gIH1cblxuICBjb25zdCBkYXRhID0gaW50ZXJhY3Rpb25EYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBjb25zdCByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gIGZvciAoY29uc3QgW2dhS2V5LCBzb3VyY2VGaWVsZF0gb2YgT2JqZWN0LmVudHJpZXMocHJvamVjdGlvbk1hcCkpIHtcbiAgICBpZiAoc291cmNlRmllbGQgaW4gZGF0YSkge1xuICAgICAgcmVzdWx0W2dhS2V5XSA9IGRhdGFbc291cmNlRmllbGRdO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuY29uc3QgdHJ1bmNhdGVTdHJpbmcgPSAodmFsdWU6IHVua25vd24pOiB1bmtub3duID0+IHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgdmFsdWUubGVuZ3RoID4gMTAwKSB7XG4gICAgcmV0dXJuIGAke3ZhbHVlLnN1YnN0cmluZygwLCA5Nyl9Li4uYDtcbiAgfVxuICByZXR1cm4gdmFsdWU7XG59O1xuXG5jb25zdCB0cnVuY2F0ZVZhbHVlcyA9IChvYmo6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPT4ge1xuICBjb25zdCByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKG9iaikpIHtcbiAgICByZXN1bHRba2V5XSA9IHRydW5jYXRlU3RyaW5nKHZhbHVlKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuY29uc3QgcHVzaFRvRGF0YUxheWVyID0gKGdhRXZlbnQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogdm9pZCA9PiB7XG4gIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cuZGF0YUxheWVyKSB7XG4gICAgd2luZG93LmRhdGFMYXllci5wdXNoKGdhRXZlbnQpO1xuICB9XG59O1xuXG5leHBvcnQgY29uc3QgcHJvamVjdFRvR0E0ID0gKFxuICBldmVudE5hbWU6IEVudml2ZU1ldHJpY3NFdmVudE5hbWUsXG4gIGV2ZW50UHJvcHM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbik6IHZvaWQgPT4ge1xuICB0cnkge1xuICAgIGNvbnN0IHNjaGVtYUVudHJ5ID0gR0E0X0VWRU5UX1NDSEVNQVtldmVudE5hbWVdO1xuXG4gICAgaWYgKHNjaGVtYUVudHJ5LmdhRXZlbnROYW1lID09PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY29uZmlnID0gc2NoZW1hRW50cnk7XG4gICAgY29uc3QgcHJvcHMgPSBldmVudFByb3BzID8/IHt9O1xuXG4gICAgbGV0IGZpbHRlcmVkID0gZmlsdGVyVG9TY2hlbWEocHJvcHMsIGNvbmZpZy5hbGxvd2VkRmllbGRzKTtcbiAgICBmaWx0ZXJlZCA9IHNhbml0aXplUGFnZUlkKGZpbHRlcmVkKTtcblxuICAgIGNvbnN0IGludGVyYWN0aW9uRmllbGRzID0gcHJvamVjdFdpZGdldEludGVyYWN0aW9uRGF0YShwcm9wcywgY29uZmlnKTtcblxuICAgIGNvbnN0IGZsYXRQYXJhbXMgPSB7XG4gICAgICAuLi5mbGF0dGVuRG90S2V5cyhmaWx0ZXJlZCksXG4gICAgICAuLi5pbnRlcmFjdGlvbkZpZWxkcyxcbiAgICB9O1xuXG4gICAgY29uc3QgdHJ1bmNhdGVkUGFyYW1zID0gdHJ1bmNhdGVWYWx1ZXMoZmxhdFBhcmFtcyk7XG5cbiAgICBwdXNoVG9EYXRhTGF5ZXIoe1xuICAgICAgZXZlbnQ6IGNvbmZpZy5nYUV2ZW50TmFtZSxcbiAgICAgIC4uLnRydW5jYXRlZFBhcmFtcyxcbiAgICB9KTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nZ2VyLmxvZ0Vycm9yKCdFcnJvciBwcm9qZWN0aW5nIGV2ZW50IHRvIEdBNCcsIGVyciwge1xuICAgICAgZXZlbnROYW1lLFxuICAgIH0pO1xuICB9XG59O1xuIl0sIm1hcHBpbmdzIjoiOzs7O0FBSUEsTUFBTSxTQUFTLElBQUlBLHVCQUFPLHVCQUF1QjtBQUVqRCxNQUFNLGtCQUNKLFlBQ0Esa0JBQzRCO0NBQzVCLE1BQU1DLFNBQWtDLEVBQUU7QUFDMUMsTUFBSyxNQUFNLFNBQVMsY0FDbEIsS0FBSSxTQUFTLFdBQ1gsUUFBTyxTQUFTLFdBQVc7QUFHL0IsUUFBTzs7QUFJVCxNQUFNLGtCQUFrQixRQUEwRDtDQUNoRixNQUFNQSxTQUFrQyxFQUFFO0FBQzFDLE1BQUssTUFBTSxDQUFDLEtBQUssVUFBVSxPQUFPLFFBQVEsSUFBSSxDQUM1QyxRQUFPLElBQUksUUFBUSxPQUFPLElBQUksSUFBSTtBQUVwQyxRQUFPOztBQVNULE1BQU0sa0JBQWtCLGFBQStEO0NBQ3JGLE1BQU0sV0FBVyxTQUFTO0FBQzFCLEtBQUksYUFBYSxTQUFTLGFBQWEsTUFDckMsUUFBTztDQUVULE1BQU0sT0FBTyxFQUFFLEdBQUcsVUFBVTtBQUM1QixRQUFPLEtBQUs7QUFDWixRQUFPOztBQUlULE1BQU0sZ0NBQ0osWUFDQSxXQUM0QjtBQUM1QixLQUFJLENBQUMsT0FBTyxpQ0FDVixRQUFPLEVBQUU7Q0FHWCxNQUFNLGNBQWMsV0FBVztBQUMvQixLQUFJLE9BQU8sZ0JBQWdCLFNBQ3pCLFFBQU8sRUFBRTtDQUdYLE1BQU0sZ0JBQWdCLE9BQU8saUNBQWlDO0FBQzlELEtBQUksQ0FBQyxjQUNILFFBQU8sRUFBRTtDQUdYLE1BQU0sa0JBQWtCLFdBQVc7QUFDbkMsS0FDRSxvQkFBb0IsUUFDcEIsb0JBQW9CLFVBQ3BCLE9BQU8sb0JBQW9CLFNBRTNCLFFBQU8sRUFBRTtDQUdYLE1BQU0sT0FBTztDQUNiLE1BQU1BLFNBQWtDLEVBQUU7QUFDMUMsTUFBSyxNQUFNLENBQUMsT0FBTyxnQkFBZ0IsT0FBTyxRQUFRLGNBQWMsQ0FDOUQsS0FBSSxlQUFlLEtBQ2pCLFFBQU8sU0FBUyxLQUFLO0FBR3pCLFFBQU87O0FBR1QsTUFBTSxrQkFBa0IsVUFBNEI7QUFDbEQsS0FBSSxPQUFPLFVBQVUsWUFBWSxNQUFNLFNBQVMsSUFDOUMsUUFBTyxHQUFHLE1BQU0sVUFBVSxHQUFHLEdBQUcsQ0FBQztBQUVuQyxRQUFPOztBQUdULE1BQU0sa0JBQWtCLFFBQTBEO0NBQ2hGLE1BQU1BLFNBQWtDLEVBQUU7QUFDMUMsTUFBSyxNQUFNLENBQUMsS0FBSyxVQUFVLE9BQU8sUUFBUSxJQUFJLENBQzVDLFFBQU8sT0FBTyxlQUFlLE1BQU07QUFFckMsUUFBTzs7QUFHVCxNQUFNLG1CQUFtQixZQUEyQztBQUNsRSxLQUFJLE9BQU8sV0FBVyxlQUFlLE9BQU8sVUFDMUMsUUFBTyxVQUFVLEtBQUssUUFBUTs7QUFJbEMsTUFBYSxnQkFDWCxXQUNBLGVBQ1M7QUFDVCxLQUFJO0VBQ0YsTUFBTSxjQUFjQyx3Q0FBaUI7QUFFckMsTUFBSSxZQUFZLGdCQUFnQixLQUM5QjtFQUdGLE1BQU0sU0FBUztFQUNmLE1BQU0sUUFBUSxjQUFjLEVBQUU7RUFFOUIsSUFBSSxXQUFXLGVBQWUsT0FBTyxPQUFPLGNBQWM7QUFDMUQsYUFBVyxlQUFlLFNBQVM7RUFFbkMsTUFBTSxvQkFBb0IsNkJBQTZCLE9BQU8sT0FBTztFQU9yRSxNQUFNLGtCQUFrQixlQUxMO0dBQ2pCLEdBQUcsZUFBZSxTQUFTO0dBQzNCLEdBQUc7R0FDSixDQUVpRDtBQUVsRCxrQkFBZ0I7R0FDZCxPQUFPLE9BQU87R0FDZCxHQUFHO0dBQ0osQ0FBQztVQUNLLEtBQUs7QUFDWixTQUFPLFNBQVMsaUNBQWlDLEtBQUssRUFDcEQsV0FDRCxDQUFDIn0=
|
|
98
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2E0UHJvamVjdGlvblNlcnZpY2UuY2pzIiwibmFtZXMiOlsiTG9nZ2VyIiwicmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiIsImN1cnJlbnQ6IHVua25vd24iLCJHQTRfRVZFTlRfU0NIRU1BIiwiZmlsdGVyZWQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+Il0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3NlcnZpY2VzL2dhNFByb2plY3Rpb25TZXJ2aWNlL2dhNFByb2plY3Rpb25TZXJ2aWNlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBMb2dnZXIgZnJvbSAnc3JjL2FwcGxpY2F0aW9uL2xvZ2dpbmcvbG9nZ2VyJztcbmltcG9ydCB7IEVudml2ZU1ldHJpY3NFdmVudE5hbWUgfSBmcm9tICcuLi9hbXBsaXR1ZGVTZXJ2aWNlL2V2ZW50TmFtZXMnO1xuaW1wb3J0IHsgR0E0UHJvamVjdGVkRXZlbnRDb25maWcsIEdBNF9FVkVOVF9TQ0hFTUEgfSBmcm9tICcuL2dhNEV2ZW50U2NoZW1hJztcblxuY29uc3QgbG9nZ2VyID0gbmV3IExvZ2dlcignZ2E0UHJvamVjdGlvblNlcnZpY2UnKTtcblxuY29uc3QgZmlsdGVyVG9TY2hlbWEgPSAoXG4gIGV2ZW50UHJvcHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICBhbGxvd2VkRmllbGRzOiByZWFkb25seSBzdHJpbmdbXSxcbik6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0+IHtcbiAgY29uc3QgcmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuICBmb3IgKGNvbnN0IGZpZWxkIG9mIGFsbG93ZWRGaWVsZHMpIHtcbiAgICBpZiAoZmllbGQgaW4gZXZlbnRQcm9wcykge1xuICAgICAgcmVzdWx0W2ZpZWxkXSA9IGV2ZW50UHJvcHNbZmllbGRdO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuLy8gRmxhdHRlbiBvbmx5IHRydWUgdG9wLWxldmVsIG5lc3RlZCBvYmplY3RzIChrZXlzIHdpdGggbm8gZG90cykgb25lIGxldmVsIGRlZXAuXG4vLyBLZXlzIHRoYXQgYWxyZWFkeSBjb250YWluIGRvdHMgYXJlIGxlZnQgaW50YWN0IHNvIHRoYXQgZS5nLlxuLy8gYHRyaWdnZXIud2lkZ2V0X2ludGVyYWN0aW9uX2RhdGE6IHsgLi4uIH1gIGlzIHByZXNlcnZlZCBmb3IgZG93bnN0cmVhbSBleHRyYWN0aW9uLlxuY29uc3QgZmxhdHRlbk9uZUxldmVsID0gKG9iajogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9PiB7XG4gIGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMob2JqKSkge1xuICAgIGlmIChcbiAgICAgICFrZXkuaW5jbHVkZXMoJy4nKSAmJlxuICAgICAgdmFsdWUgIT09IG51bGwgJiZcbiAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiZcbiAgICAgICFBcnJheS5pc0FycmF5KHZhbHVlKVxuICAgICkge1xuICAgICAgZm9yIChjb25zdCBbc3ViS2V5LCBzdWJWYWx1ZV0gb2YgT2JqZWN0LmVudHJpZXModmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pKSB7XG4gICAgICAgIHJlc3VsdFtgJHtrZXl9LiR7c3ViS2V5fWBdID0gc3ViVmFsdWU7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdFtrZXldID0gdmFsdWU7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG4vLyBBcHBseSBhIEdBNCBwcm9qZWN0aW9uIG1hcCB7IGdhNEtleTogc291cmNlS2V5IH0gdG8gZXh0cmFjdCBhbmQgcmVuYW1lIGZpZWxkcy5cbmNvbnN0IGZpbHRlcldpdGhQcm9qZWN0aW9ucyA9IChcbiAgZXZlbnRQcm9wczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIHByb2plY3Rpb25zOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPT4ge1xuICBjb25zdCByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gIGZvciAoY29uc3QgW2dhNEtleSwgc291cmNlS2V5XSBvZiBPYmplY3QuZW50cmllcyhwcm9qZWN0aW9ucykpIHtcbiAgICBpZiAoc291cmNlS2V5IGluIGV2ZW50UHJvcHMpIHtcbiAgICAgIHJlc3VsdFtnYTRLZXldID0gZXZlbnRQcm9wc1tzb3VyY2VLZXldO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuLy8gXCJjb250ZXh0LnBhZ2VfdHlwZVwiIOKGkiBcImNvbnRleHRfcGFnZV90eXBlXCJcbmNvbnN0IGZsYXR0ZW5Eb3RLZXlzID0gKG9iajogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9PiB7XG4gIGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMob2JqKSkge1xuICAgIHJlc3VsdFtrZXkucmVwbGFjZSgvXFwuL2csICdfJyldID0gdmFsdWU7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8vIE9taXQgY29udGV4dC5wYWdlX2lkIGZvciBub24tcGRwL3BscCBwYWdlIHR5cGVzLiBUaGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBmb3IgY29udGV4dC5wYWdlX2lkIGlzOlxuLy8gUERQOiBwcm9kdWN0X2lkXG4vLyBQTFA6IHBscF9pZFxuLy8gU2VhcmNoOiBzZWFyY2ggcXVlcnlcbi8vIE90aGVyOiBwYWdlIHVybFxuLy8gV2Ugd2FudCB0byBvbWl0IGFsbCBidXQgcGRwIGFuZCBwbHAgcGFnZSB0eXBlcyB0byBwcm92aWRlIGEgY2xlYXIsIGNvbnNpc3RlbnQgaW50ZXJmYWNlIGZvciBtZXJjaGFudHMuXG4vLyBIYW5kbGVzIGJvdGggZG90LW5vdGF0aW9uIGtleXMgKGFsbG93ZWRGaWVsZHMgcGF0aCkgYW5kIHJlbmFtZWQgR0E0IGtleXMgKGZpZWxkUHJvamVjdGlvbnMgcGF0aCkuXG5jb25zdCBzYW5pdGl6ZVBhZ2VJZCA9IChmaWx0ZXJlZDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9PiB7XG4gIGNvbnN0IHBhZ2VUeXBlID0gZmlsdGVyZWRbJ3BhZ2VfdHlwZSddID8/IGZpbHRlcmVkWydjb250ZXh0LnBhZ2VfdHlwZSddO1xuICBpZiAocGFnZVR5cGUgPT09ICdwZHAnIHx8IHBhZ2VUeXBlID09PSAncGxwJykge1xuICAgIHJldHVybiBmaWx0ZXJlZDtcbiAgfVxuICBjb25zdCByZXN0ID0geyAuLi5maWx0ZXJlZCB9O1xuICBkZWxldGUgcmVzdFsncGFnZV9pZCddO1xuICBkZWxldGUgcmVzdFsnY29udGV4dC5wYWdlX2lkJ107XG4gIHJldHVybiByZXN0O1xufTtcblxuY29uc3QgZ2V0TmVzdGVkVmFsdWUgPSAob2JqOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgcGF0aDogc3RyaW5nKTogdW5rbm93biA9PiB7XG4gIGNvbnN0IHBhcnRzID0gcGF0aC5zcGxpdCgnLicpO1xuICBsZXQgY3VycmVudDogdW5rbm93biA9IG9iajtcbiAgZm9yIChjb25zdCBwYXJ0IG9mIHBhcnRzKSB7XG4gICAgaWYgKGN1cnJlbnQgPT09IG51bGwgfHwgdHlwZW9mIGN1cnJlbnQgIT09ICdvYmplY3QnKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGN1cnJlbnQgPSAoY3VycmVudCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilbcGFydF07XG4gIH1cbiAgcmV0dXJuIGN1cnJlbnQ7XG59O1xuXG4vLyBFeHRyYWN0IHdoaXRlbGlzdGVkIHN1Yi1maWVsZHMgZnJvbSB0cmlnZ2VyLndpZGdldF9pbnRlcmFjdGlvbl9kYXRhXG5jb25zdCBwcm9qZWN0V2lkZ2V0SW50ZXJhY3Rpb25EYXRhID0gKFxuICBldmVudFByb3BzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgY29uZmlnOiBHQTRQcm9qZWN0ZWRFdmVudENvbmZpZyxcbik6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0+IHtcbiAgaWYgKCFjb25maWcud2lkZ2V0SW50ZXJhY3Rpb25EYXRhUHJvamVjdGlvbnMpIHtcbiAgICByZXR1cm4ge307XG4gIH1cblxuICBjb25zdCBpbnRlcmFjdGlvbiA9IGV2ZW50UHJvcHNbJ3RyaWdnZXIud2lkZ2V0X2ludGVyYWN0aW9uJ107XG4gIGlmICh0eXBlb2YgaW50ZXJhY3Rpb24gIT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG5cbiAgY29uc3QgcHJvamVjdGlvbk1hcCA9IGNvbmZpZy53aWRnZXRJbnRlcmFjdGlvbkRhdGFQcm9qZWN0aW9uc1tpbnRlcmFjdGlvbl07XG4gIGlmICghcHJvamVjdGlvbk1hcCkge1xuICAgIHJldHVybiB7fTtcbiAgfVxuXG4gIGNvbnN0IGludGVyYWN0aW9uRGF0YSA9IGV2ZW50UHJvcHNbJ3RyaWdnZXIud2lkZ2V0X2ludGVyYWN0aW9uX2RhdGEnXTtcbiAgaWYgKFxuICAgIGludGVyYWN0aW9uRGF0YSA9PT0gbnVsbCB8fFxuICAgIGludGVyYWN0aW9uRGF0YSA9PT0gdW5kZWZpbmVkIHx8XG4gICAgdHlwZW9mIGludGVyYWN0aW9uRGF0YSAhPT0gJ29iamVjdCdcbiAgKSB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG5cbiAgY29uc3QgZGF0YSA9IGludGVyYWN0aW9uRGF0YSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgY29uc3QgcmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuICBmb3IgKGNvbnN0IFtnYUtleSwgc291cmNlUGF0aF0gb2YgT2JqZWN0LmVudHJpZXMocHJvamVjdGlvbk1hcCkpIHtcbiAgICBjb25zdCB2YWx1ZSA9IGdldE5lc3RlZFZhbHVlKGRhdGEsIHNvdXJjZVBhdGgpO1xuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXN1bHRbZ2FLZXldID0gdmFsdWU7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG5jb25zdCB0cnVuY2F0ZVN0cmluZyA9ICh2YWx1ZTogdW5rbm93bik6IHVua25vd24gPT4ge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiB2YWx1ZS5sZW5ndGggPiAxMDApIHtcbiAgICByZXR1cm4gYCR7dmFsdWUuc3Vic3RyaW5nKDAsIDk3KX0uLi5gO1xuICB9XG4gIHJldHVybiB2YWx1ZTtcbn07XG5cbmNvbnN0IHRydW5jYXRlVmFsdWVzID0gKG9iajogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9PiB7XG4gIGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMob2JqKSkge1xuICAgIHJlc3VsdFtrZXldID0gdHJ1bmNhdGVTdHJpbmcodmFsdWUpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG5jb25zdCBwdXNoVG9EYXRhTGF5ZXIgPSAoZ2FFdmVudDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiB2b2lkID0+IHtcbiAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5kYXRhTGF5ZXIpIHtcbiAgICB3aW5kb3cuZGF0YUxheWVyLnB1c2goZ2FFdmVudCk7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBwcm9qZWN0VG9HQTQgPSAoXG4gIGV2ZW50TmFtZTogRW52aXZlTWV0cmljc0V2ZW50TmFtZSxcbiAgZXZlbnRQcm9wcz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuKTogdm9pZCA9PiB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc2NoZW1hRW50cnkgPSBHQTRfRVZFTlRfU0NIRU1BW2V2ZW50TmFtZV07XG5cbiAgICBpZiAoc2NoZW1hRW50cnkuZ2FFdmVudE5hbWUgPT09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBjb25maWcgPSBzY2hlbWFFbnRyeTtcbiAgICBjb25zdCBwcm9wcyA9IGZsYXR0ZW5PbmVMZXZlbChldmVudFByb3BzID8/IHt9KTtcblxuICAgIGxldCBmaWx0ZXJlZDogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgaWYgKGNvbmZpZy5maWVsZFByb2plY3Rpb25zKSB7XG4gICAgICBmaWx0ZXJlZCA9IGZpbHRlcldpdGhQcm9qZWN0aW9ucyhwcm9wcywgY29uZmlnLmZpZWxkUHJvamVjdGlvbnMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBmaWx0ZXJlZCA9IGZpbHRlclRvU2NoZW1hKHByb3BzLCBjb25maWcuYWxsb3dlZEZpZWxkcyk7XG4gICAgfVxuICAgIGZpbHRlcmVkID0gc2FuaXRpemVQYWdlSWQoZmlsdGVyZWQpO1xuXG4gICAgY29uc3QgaW50ZXJhY3Rpb25GaWVsZHMgPSBwcm9qZWN0V2lkZ2V0SW50ZXJhY3Rpb25EYXRhKHByb3BzLCBjb25maWcpO1xuXG4gICAgY29uc3QgZmxhdFBhcmFtcyA9IHtcbiAgICAgIC4uLmZsYXR0ZW5Eb3RLZXlzKGZpbHRlcmVkKSxcbiAgICAgIC4uLmludGVyYWN0aW9uRmllbGRzLFxuICAgIH07XG5cbiAgICBjb25zdCB0cnVuY2F0ZWRQYXJhbXMgPSB0cnVuY2F0ZVZhbHVlcyhmbGF0UGFyYW1zKTtcblxuICAgIHB1c2hUb0RhdGFMYXllcih7XG4gICAgICBldmVudDogY29uZmlnLmdhRXZlbnROYW1lLFxuICAgICAgLi4udHJ1bmNhdGVkUGFyYW1zLFxuICAgIH0pO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2dnZXIubG9nRXJyb3IoJ0Vycm9yIHByb2plY3RpbmcgZXZlbnQgdG8gR0E0JywgZXJyLCB7XG4gICAgICBldmVudE5hbWUsXG4gICAgfSk7XG4gIH1cbn07XG4iXSwibWFwcGluZ3MiOiI7Ozs7QUFJQSxNQUFNLFNBQVMsSUFBSUEsdUJBQU8sdUJBQXVCO0FBRWpELE1BQU0sa0JBQ0osWUFDQSxrQkFDNEI7Q0FDNUIsTUFBTUMsU0FBa0MsRUFBRTtBQUMxQyxNQUFLLE1BQU0sU0FBUyxjQUNsQixLQUFJLFNBQVMsV0FDWCxRQUFPLFNBQVMsV0FBVztBQUcvQixRQUFPOztBQU1ULE1BQU0sbUJBQW1CLFFBQTBEO0NBQ2pGLE1BQU1BLFNBQWtDLEVBQUU7QUFDMUMsTUFBSyxNQUFNLENBQUMsS0FBSyxVQUFVLE9BQU8sUUFBUSxJQUFJLENBQzVDLEtBQ0UsQ0FBQyxJQUFJLFNBQVMsSUFBSSxJQUNsQixVQUFVLFFBQ1YsT0FBTyxVQUFVLFlBQ2pCLENBQUMsTUFBTSxRQUFRLE1BQU0sQ0FFckIsTUFBSyxNQUFNLENBQUMsUUFBUSxhQUFhLE9BQU8sUUFBUSxNQUFpQyxDQUMvRSxRQUFPLEdBQUcsSUFBSSxHQUFHLFlBQVk7S0FHL0IsUUFBTyxPQUFPO0FBR2xCLFFBQU87O0FBSVQsTUFBTSx5QkFDSixZQUNBLGdCQUM0QjtDQUM1QixNQUFNQSxTQUFrQyxFQUFFO0FBQzFDLE1BQUssTUFBTSxDQUFDLFFBQVEsY0FBYyxPQUFPLFFBQVEsWUFBWSxDQUMzRCxLQUFJLGFBQWEsV0FDZixRQUFPLFVBQVUsV0FBVztBQUdoQyxRQUFPOztBQUlULE1BQU0sa0JBQWtCLFFBQTBEO0NBQ2hGLE1BQU1BLFNBQWtDLEVBQUU7QUFDMUMsTUFBSyxNQUFNLENBQUMsS0FBSyxVQUFVLE9BQU8sUUFBUSxJQUFJLENBQzVDLFFBQU8sSUFBSSxRQUFRLE9BQU8sSUFBSSxJQUFJO0FBRXBDLFFBQU87O0FBVVQsTUFBTSxrQkFBa0IsYUFBK0Q7Q0FDckYsTUFBTSxXQUFXLFNBQVMsZ0JBQWdCLFNBQVM7QUFDbkQsS0FBSSxhQUFhLFNBQVMsYUFBYSxNQUNyQyxRQUFPO0NBRVQsTUFBTSxPQUFPLEVBQUUsR0FBRyxVQUFVO0FBQzVCLFFBQU8sS0FBSztBQUNaLFFBQU8sS0FBSztBQUNaLFFBQU87O0FBR1QsTUFBTSxrQkFBa0IsS0FBOEIsU0FBMEI7Q0FDOUUsTUFBTSxRQUFRLEtBQUssTUFBTSxJQUFJO0NBQzdCLElBQUlDLFVBQW1CO0FBQ3ZCLE1BQUssTUFBTSxRQUFRLE9BQU87QUFDeEIsTUFBSSxZQUFZLFFBQVEsT0FBTyxZQUFZLFNBQVUsUUFBTztBQUM1RCxZQUFXLFFBQW9DOztBQUVqRCxRQUFPOztBQUlULE1BQU0sZ0NBQ0osWUFDQSxXQUM0QjtBQUM1QixLQUFJLENBQUMsT0FBTyxpQ0FDVixRQUFPLEVBQUU7Q0FHWCxNQUFNLGNBQWMsV0FBVztBQUMvQixLQUFJLE9BQU8sZ0JBQWdCLFNBQ3pCLFFBQU8sRUFBRTtDQUdYLE1BQU0sZ0JBQWdCLE9BQU8saUNBQWlDO0FBQzlELEtBQUksQ0FBQyxjQUNILFFBQU8sRUFBRTtDQUdYLE1BQU0sa0JBQWtCLFdBQVc7QUFDbkMsS0FDRSxvQkFBb0IsUUFDcEIsb0JBQW9CLFVBQ3BCLE9BQU8sb0JBQW9CLFNBRTNCLFFBQU8sRUFBRTtDQUdYLE1BQU0sT0FBTztDQUNiLE1BQU1ELFNBQWtDLEVBQUU7QUFDMUMsTUFBSyxNQUFNLENBQUMsT0FBTyxlQUFlLE9BQU8sUUFBUSxjQUFjLEVBQUU7RUFDL0QsTUFBTSxRQUFRLGVBQWUsTUFBTSxXQUFXO0FBQzlDLE1BQUksVUFBVSxPQUNaLFFBQU8sU0FBUzs7QUFHcEIsUUFBTzs7QUFHVCxNQUFNLGtCQUFrQixVQUE0QjtBQUNsRCxLQUFJLE9BQU8sVUFBVSxZQUFZLE1BQU0sU0FBUyxJQUM5QyxRQUFPLEdBQUcsTUFBTSxVQUFVLEdBQUcsR0FBRyxDQUFDO0FBRW5DLFFBQU87O0FBR1QsTUFBTSxrQkFBa0IsUUFBMEQ7Q0FDaEYsTUFBTUEsU0FBa0MsRUFBRTtBQUMxQyxNQUFLLE1BQU0sQ0FBQyxLQUFLLFVBQVUsT0FBTyxRQUFRLElBQUksQ0FDNUMsUUFBTyxPQUFPLGVBQWUsTUFBTTtBQUVyQyxRQUFPOztBQUdULE1BQU0sbUJBQW1CLFlBQTJDO0FBQ2xFLEtBQUksT0FBTyxXQUFXLGVBQWUsT0FBTyxVQUMxQyxRQUFPLFVBQVUsS0FBSyxRQUFROztBQUlsQyxNQUFhLGdCQUNYLFdBQ0EsZUFDUztBQUNULEtBQUk7RUFDRixNQUFNLGNBQWNFLHdDQUFpQjtBQUVyQyxNQUFJLFlBQVksZ0JBQWdCLEtBQzlCO0VBR0YsTUFBTSxTQUFTO0VBQ2YsTUFBTSxRQUFRLGdCQUFnQixjQUFjLEVBQUUsQ0FBQztFQUUvQyxJQUFJQztBQUNKLE1BQUksT0FBTyxpQkFDVCxZQUFXLHNCQUFzQixPQUFPLE9BQU8saUJBQWlCO01BRWhFLFlBQVcsZUFBZSxPQUFPLE9BQU8sY0FBYztBQUV4RCxhQUFXLGVBQWUsU0FBUztFQUVuQyxNQUFNLG9CQUFvQiw2QkFBNkIsT0FBTyxPQUFPO0VBT3JFLE1BQU0sa0JBQWtCLGVBTEw7R0FDakIsR0FBRyxlQUFlLFNBQVM7R0FDM0IsR0FBRztHQUNKLENBRWlEO0FBRWxELGtCQUFnQjtHQUNkLE9BQU8sT0FBTztHQUNkLEdBQUc7R0FDSixDQUFDO1VBQ0ssS0FBSztBQUNaLFNBQU8sU0FBUyxpQ0FBaUMsS0FBSyxFQUNwRCxXQUNELENBQUMifQ==
|
|
@@ -8,18 +8,39 @@ const filterToSchema = (eventProps, allowedFields) => {
|
|
|
8
8
|
for (const field of allowedFields) if (field in eventProps) result[field] = eventProps[field];
|
|
9
9
|
return result;
|
|
10
10
|
};
|
|
11
|
+
const flattenOneLevel = (obj) => {
|
|
12
|
+
const result = {};
|
|
13
|
+
for (const [key, value] of Object.entries(obj)) if (!key.includes(".") && value !== null && typeof value === "object" && !Array.isArray(value)) for (const [subKey, subValue] of Object.entries(value)) result[`${key}.${subKey}`] = subValue;
|
|
14
|
+
else result[key] = value;
|
|
15
|
+
return result;
|
|
16
|
+
};
|
|
17
|
+
const filterWithProjections = (eventProps, projections) => {
|
|
18
|
+
const result = {};
|
|
19
|
+
for (const [ga4Key, sourceKey] of Object.entries(projections)) if (sourceKey in eventProps) result[ga4Key] = eventProps[sourceKey];
|
|
20
|
+
return result;
|
|
21
|
+
};
|
|
11
22
|
const flattenDotKeys = (obj) => {
|
|
12
23
|
const result = {};
|
|
13
24
|
for (const [key, value] of Object.entries(obj)) result[key.replace(/\./g, "_")] = value;
|
|
14
25
|
return result;
|
|
15
26
|
};
|
|
16
27
|
const sanitizePageId = (filtered) => {
|
|
17
|
-
const pageType = filtered["context.page_type"];
|
|
28
|
+
const pageType = filtered["page_type"] ?? filtered["context.page_type"];
|
|
18
29
|
if (pageType === "pdp" || pageType === "plp") return filtered;
|
|
19
30
|
const rest = { ...filtered };
|
|
31
|
+
delete rest["page_id"];
|
|
20
32
|
delete rest["context.page_id"];
|
|
21
33
|
return rest;
|
|
22
34
|
};
|
|
35
|
+
const getNestedValue = (obj, path) => {
|
|
36
|
+
const parts = path.split(".");
|
|
37
|
+
let current = obj;
|
|
38
|
+
for (const part of parts) {
|
|
39
|
+
if (current === null || typeof current !== "object") return void 0;
|
|
40
|
+
current = current[part];
|
|
41
|
+
}
|
|
42
|
+
return current;
|
|
43
|
+
};
|
|
23
44
|
const projectWidgetInteractionData = (eventProps, config) => {
|
|
24
45
|
if (!config.widgetInteractionDataProjections) return {};
|
|
25
46
|
const interaction = eventProps["trigger.widget_interaction"];
|
|
@@ -30,7 +51,10 @@ const projectWidgetInteractionData = (eventProps, config) => {
|
|
|
30
51
|
if (interactionData === null || interactionData === void 0 || typeof interactionData !== "object") return {};
|
|
31
52
|
const data = interactionData;
|
|
32
53
|
const result = {};
|
|
33
|
-
for (const [gaKey,
|
|
54
|
+
for (const [gaKey, sourcePath] of Object.entries(projectionMap)) {
|
|
55
|
+
const value = getNestedValue(data, sourcePath);
|
|
56
|
+
if (value !== void 0) result[gaKey] = value;
|
|
57
|
+
}
|
|
34
58
|
return result;
|
|
35
59
|
};
|
|
36
60
|
const truncateString = (value) => {
|
|
@@ -50,8 +74,10 @@ const projectToGA4 = (eventName, eventProps) => {
|
|
|
50
74
|
const schemaEntry = GA4_EVENT_SCHEMA[eventName];
|
|
51
75
|
if (schemaEntry.gaEventName === null) return;
|
|
52
76
|
const config = schemaEntry;
|
|
53
|
-
const props = eventProps ?? {};
|
|
54
|
-
let filtered
|
|
77
|
+
const props = flattenOneLevel(eventProps ?? {});
|
|
78
|
+
let filtered;
|
|
79
|
+
if (config.fieldProjections) filtered = filterWithProjections(props, config.fieldProjections);
|
|
80
|
+
else filtered = filterToSchema(props, config.allowedFields);
|
|
55
81
|
filtered = sanitizePageId(filtered);
|
|
56
82
|
const interactionFields = projectWidgetInteractionData(props, config);
|
|
57
83
|
const truncatedParams = truncateValues({
|
|
@@ -69,4 +95,4 @@ const projectToGA4 = (eventName, eventProps) => {
|
|
|
69
95
|
|
|
70
96
|
//#endregion
|
|
71
97
|
export { projectToGA4 };
|
|
72
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2E0UHJvamVjdGlvblNlcnZpY2UuanMiLCJuYW1lcyI6WyJMb2dnZXIiLCJyZXN1bHQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+Il0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3NlcnZpY2VzL2dhNFByb2plY3Rpb25TZXJ2aWNlL2dhNFByb2plY3Rpb25TZXJ2aWNlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBMb2dnZXIgZnJvbSAnc3JjL2FwcGxpY2F0aW9uL2xvZ2dpbmcvbG9nZ2VyJztcbmltcG9ydCB7IEVudml2ZU1ldHJpY3NFdmVudE5hbWUgfSBmcm9tICcuLi9hbXBsaXR1ZGVTZXJ2aWNlL2V2ZW50TmFtZXMnO1xuaW1wb3J0IHsgR0E0UHJvamVjdGVkRXZlbnRDb25maWcsIEdBNF9FVkVOVF9TQ0hFTUEgfSBmcm9tICcuL2dhNEV2ZW50U2NoZW1hJztcblxuY29uc3QgbG9nZ2VyID0gbmV3IExvZ2dlcignZ2E0UHJvamVjdGlvblNlcnZpY2UnKTtcblxuY29uc3QgZmlsdGVyVG9TY2hlbWEgPSAoXG4gIGV2ZW50UHJvcHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICBhbGxvd2VkRmllbGRzOiByZWFkb25seSBzdHJpbmdbXSxcbik6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0+IHtcbiAgY29uc3QgcmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuICBmb3IgKGNvbnN0IGZpZWxkIG9mIGFsbG93ZWRGaWVsZHMpIHtcbiAgICBpZiAoZmllbGQgaW4gZXZlbnRQcm9wcykge1xuICAgICAgcmVzdWx0W2ZpZWxkXSA9IGV2ZW50UHJvcHNbZmllbGRdO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuLy8gXCJjb250ZXh0LnBhZ2VfdHlwZVwiIOKGkiBcImNvbnRleHRfcGFnZV90eXBlXCJcbmNvbnN0IGZsYXR0ZW5Eb3RLZXlzID0gKG9iajogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9PiB7XG4gIGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMob2JqKSkge1xuICAgIHJlc3VsdFtrZXkucmVwbGFjZSgvXFwuL2csICdfJyldID0gdmFsdWU7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8vIE9taXQgY29udGV4dC5wYWdlX2lkIGZvciBub24tcGRwL3BscCBwYWdlIHR5cGVzLiBUaGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBmb3IgY29udGV4dC5wYWdlX2lkIGlzOlxuLy8gUERQOiBwcm9kdWN0X2lkXG4vLyBQTFA6IHBscF9pZFxuLy8gU2VhcmNoOiBzZWFyY2ggcXVlcnlcbi8vIE90aGVyOiBwYWdlIHVybFxuLy8gV2Ugd2FudCB0byBvbWl0IGFsbCBidXQgcGRwIGFuZCBwbHAgcGFnZSB0eXBlcyB0byBwcm92aWRlIGEgY2xlYXIsIGNvbnNpc3RlbnQgaW50ZXJmYWNlIGZvciBtZXJjaGFudHMuXG5jb25zdCBzYW5pdGl6ZVBhZ2VJZCA9IChmaWx0ZXJlZDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9PiB7XG4gIGNvbnN0IHBhZ2VUeXBlID0gZmlsdGVyZWRbJ2NvbnRleHQucGFnZV90eXBlJ107XG4gIGlmIChwYWdlVHlwZSA9PT0gJ3BkcCcgfHwgcGFnZVR5cGUgPT09ICdwbHAnKSB7XG4gICAgcmV0dXJuIGZpbHRlcmVkO1xuICB9XG4gIGNvbnN0IHJlc3QgPSB7IC4uLmZpbHRlcmVkIH07XG4gIGRlbGV0ZSByZXN0Wydjb250ZXh0LnBhZ2VfaWQnXTtcbiAgcmV0dXJuIHJlc3Q7XG59O1xuXG4vLyBFeHRyYWN0IHdoaXRlbGlzdGVkIHN1Yi1maWVsZHMgZnJvbSB0cmlnZ2VyLndpZGdldF9pbnRlcmFjdGlvbl9kYXRhXG5jb25zdCBwcm9qZWN0V2lkZ2V0SW50ZXJhY3Rpb25EYXRhID0gKFxuICBldmVudFByb3BzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgY29uZmlnOiBHQTRQcm9qZWN0ZWRFdmVudENvbmZpZyxcbik6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0+IHtcbiAgaWYgKCFjb25maWcud2lkZ2V0SW50ZXJhY3Rpb25EYXRhUHJvamVjdGlvbnMpIHtcbiAgICByZXR1cm4ge307XG4gIH1cblxuICBjb25zdCBpbnRlcmFjdGlvbiA9IGV2ZW50UHJvcHNbJ3RyaWdnZXIud2lkZ2V0X2ludGVyYWN0aW9uJ107XG4gIGlmICh0eXBlb2YgaW50ZXJhY3Rpb24gIT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG5cbiAgY29uc3QgcHJvamVjdGlvbk1hcCA9IGNvbmZpZy53aWRnZXRJbnRlcmFjdGlvbkRhdGFQcm9qZWN0aW9uc1tpbnRlcmFjdGlvbl07XG4gIGlmICghcHJvamVjdGlvbk1hcCkge1xuICAgIHJldHVybiB7fTtcbiAgfVxuXG4gIGNvbnN0IGludGVyYWN0aW9uRGF0YSA9IGV2ZW50UHJvcHNbJ3RyaWdnZXIud2lkZ2V0X2ludGVyYWN0aW9uX2RhdGEnXTtcbiAgaWYgKFxuICAgIGludGVyYWN0aW9uRGF0YSA9PT0gbnVsbCB8fFxuICAgIGludGVyYWN0aW9uRGF0YSA9PT0gdW5kZWZpbmVkIHx8XG4gICAgdHlwZW9mIGludGVyYWN0aW9uRGF0YSAhPT0gJ29iamVjdCdcbiAgKSB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG5cbiAgY29uc3QgZGF0YSA9IGludGVyYWN0aW9uRGF0YSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgY29uc3QgcmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuICBmb3IgKGNvbnN0IFtnYUtleSwgc291cmNlRmllbGRdIG9mIE9iamVjdC5lbnRyaWVzKHByb2plY3Rpb25NYXApKSB7XG4gICAgaWYgKHNvdXJjZUZpZWxkIGluIGRhdGEpIHtcbiAgICAgIHJlc3VsdFtnYUtleV0gPSBkYXRhW3NvdXJjZUZpZWxkXTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbmNvbnN0IHRydW5jYXRlU3RyaW5nID0gKHZhbHVlOiB1bmtub3duKTogdW5rbm93biA9PiB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIHZhbHVlLmxlbmd0aCA+IDEwMCkge1xuICAgIHJldHVybiBgJHt2YWx1ZS5zdWJzdHJpbmcoMCwgOTcpfS4uLmA7XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufTtcblxuY29uc3QgdHJ1bmNhdGVWYWx1ZXMgPSAob2JqOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0+IHtcbiAgY29uc3QgcmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhvYmopKSB7XG4gICAgcmVzdWx0W2tleV0gPSB0cnVuY2F0ZVN0cmluZyh2YWx1ZSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbmNvbnN0IHB1c2hUb0RhdGFMYXllciA9IChnYUV2ZW50OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IHZvaWQgPT4ge1xuICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93LmRhdGFMYXllcikge1xuICAgIHdpbmRvdy5kYXRhTGF5ZXIucHVzaChnYUV2ZW50KTtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IHByb2plY3RUb0dBNCA9IChcbiAgZXZlbnROYW1lOiBFbnZpdmVNZXRyaWNzRXZlbnROYW1lLFxuICBldmVudFByb3BzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4pOiB2b2lkID0+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzY2hlbWFFbnRyeSA9IEdBNF9FVkVOVF9TQ0hFTUFbZXZlbnROYW1lXTtcblxuICAgIGlmIChzY2hlbWFFbnRyeS5nYUV2ZW50TmFtZSA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbmZpZyA9IHNjaGVtYUVudHJ5O1xuICAgIGNvbnN0IHByb3BzID0gZXZlbnRQcm9wcyA/PyB7fTtcblxuICAgIGxldCBmaWx0ZXJlZCA9IGZpbHRlclRvU2NoZW1hKHByb3BzLCBjb25maWcuYWxsb3dlZEZpZWxkcyk7XG4gICAgZmlsdGVyZWQgPSBzYW5pdGl6ZVBhZ2VJZChmaWx0ZXJlZCk7XG5cbiAgICBjb25zdCBpbnRlcmFjdGlvbkZpZWxkcyA9IHByb2plY3RXaWRnZXRJbnRlcmFjdGlvbkRhdGEocHJvcHMsIGNvbmZpZyk7XG5cbiAgICBjb25zdCBmbGF0UGFyYW1zID0ge1xuICAgICAgLi4uZmxhdHRlbkRvdEtleXMoZmlsdGVyZWQpLFxuICAgICAgLi4uaW50ZXJhY3Rpb25GaWVsZHMsXG4gICAgfTtcblxuICAgIGNvbnN0IHRydW5jYXRlZFBhcmFtcyA9IHRydW5jYXRlVmFsdWVzKGZsYXRQYXJhbXMpO1xuXG4gICAgcHVzaFRvRGF0YUxheWVyKHtcbiAgICAgIGV2ZW50OiBjb25maWcuZ2FFdmVudE5hbWUsXG4gICAgICAuLi50cnVuY2F0ZWRQYXJhbXMsXG4gICAgfSk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZ2dlci5sb2dFcnJvcignRXJyb3IgcHJvamVjdGluZyBldmVudCB0byBHQTQnLCBlcnIsIHtcbiAgICAgIGV2ZW50TmFtZSxcbiAgICB9KTtcbiAgfVxufTtcbiJdLCJtYXBwaW5ncyI6Ijs7OztBQUlBLE1BQU0sU0FBUyxJQUFJQSxlQUFPLHVCQUF1QjtBQUVqRCxNQUFNLGtCQUNKLFlBQ0Esa0JBQzRCO0NBQzVCLE1BQU1DLFNBQWtDLEVBQUU7QUFDMUMsTUFBSyxNQUFNLFNBQVMsY0FDbEIsS0FBSSxTQUFTLFdBQ1gsUUFBTyxTQUFTLFdBQVc7QUFHL0IsUUFBTzs7QUFJVCxNQUFNLGtCQUFrQixRQUEwRDtDQUNoRixNQUFNQSxTQUFrQyxFQUFFO0FBQzFDLE1BQUssTUFBTSxDQUFDLEtBQUssVUFBVSxPQUFPLFFBQVEsSUFBSSxDQUM1QyxRQUFPLElBQUksUUFBUSxPQUFPLElBQUksSUFBSTtBQUVwQyxRQUFPOztBQVNULE1BQU0sa0JBQWtCLGFBQStEO0NBQ3JGLE1BQU0sV0FBVyxTQUFTO0FBQzFCLEtBQUksYUFBYSxTQUFTLGFBQWEsTUFDckMsUUFBTztDQUVULE1BQU0sT0FBTyxFQUFFLEdBQUcsVUFBVTtBQUM1QixRQUFPLEtBQUs7QUFDWixRQUFPOztBQUlULE1BQU0sZ0NBQ0osWUFDQSxXQUM0QjtBQUM1QixLQUFJLENBQUMsT0FBTyxpQ0FDVixRQUFPLEVBQUU7Q0FHWCxNQUFNLGNBQWMsV0FBVztBQUMvQixLQUFJLE9BQU8sZ0JBQWdCLFNBQ3pCLFFBQU8sRUFBRTtDQUdYLE1BQU0sZ0JBQWdCLE9BQU8saUNBQWlDO0FBQzlELEtBQUksQ0FBQyxjQUNILFFBQU8sRUFBRTtDQUdYLE1BQU0sa0JBQWtCLFdBQVc7QUFDbkMsS0FDRSxvQkFBb0IsUUFDcEIsb0JBQW9CLFVBQ3BCLE9BQU8sb0JBQW9CLFNBRTNCLFFBQU8sRUFBRTtDQUdYLE1BQU0sT0FBTztDQUNiLE1BQU1BLFNBQWtDLEVBQUU7QUFDMUMsTUFBSyxNQUFNLENBQUMsT0FBTyxnQkFBZ0IsT0FBTyxRQUFRLGNBQWMsQ0FDOUQsS0FBSSxlQUFlLEtBQ2pCLFFBQU8sU0FBUyxLQUFLO0FBR3pCLFFBQU87O0FBR1QsTUFBTSxrQkFBa0IsVUFBNEI7QUFDbEQsS0FBSSxPQUFPLFVBQVUsWUFBWSxNQUFNLFNBQVMsSUFDOUMsUUFBTyxHQUFHLE1BQU0sVUFBVSxHQUFHLEdBQUcsQ0FBQztBQUVuQyxRQUFPOztBQUdULE1BQU0sa0JBQWtCLFFBQTBEO0NBQ2hGLE1BQU1BLFNBQWtDLEVBQUU7QUFDMUMsTUFBSyxNQUFNLENBQUMsS0FBSyxVQUFVLE9BQU8sUUFBUSxJQUFJLENBQzVDLFFBQU8sT0FBTyxlQUFlLE1BQU07QUFFckMsUUFBTzs7QUFHVCxNQUFNLG1CQUFtQixZQUEyQztBQUNsRSxLQUFJLE9BQU8sV0FBVyxlQUFlLE9BQU8sVUFDMUMsUUFBTyxVQUFVLEtBQUssUUFBUTs7QUFJbEMsTUFBYSxnQkFDWCxXQUNBLGVBQ1M7QUFDVCxLQUFJO0VBQ0YsTUFBTSxjQUFjLGlCQUFpQjtBQUVyQyxNQUFJLFlBQVksZ0JBQWdCLEtBQzlCO0VBR0YsTUFBTSxTQUFTO0VBQ2YsTUFBTSxRQUFRLGNBQWMsRUFBRTtFQUU5QixJQUFJLFdBQVcsZUFBZSxPQUFPLE9BQU8sY0FBYztBQUMxRCxhQUFXLGVBQWUsU0FBUztFQUVuQyxNQUFNLG9CQUFvQiw2QkFBNkIsT0FBTyxPQUFPO0VBT3JFLE1BQU0sa0JBQWtCLGVBTEw7R0FDakIsR0FBRyxlQUFlLFNBQVM7R0FDM0IsR0FBRztHQUNKLENBRWlEO0FBRWxELGtCQUFnQjtHQUNkLE9BQU8sT0FBTztHQUNkLEdBQUc7R0FDSixDQUFDO1VBQ0ssS0FBSztBQUNaLFNBQU8sU0FBUyxpQ0FBaUMsS0FBSyxFQUNwRCxXQUNELENBQUMifQ==
|
|
98
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2E0UHJvamVjdGlvblNlcnZpY2UuanMiLCJuYW1lcyI6WyJMb2dnZXIiLCJyZXN1bHQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IiwiY3VycmVudDogdW5rbm93biIsImZpbHRlcmVkOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zZXJ2aWNlcy9nYTRQcm9qZWN0aW9uU2VydmljZS9nYTRQcm9qZWN0aW9uU2VydmljZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgTG9nZ2VyIGZyb20gJ3NyYy9hcHBsaWNhdGlvbi9sb2dnaW5nL2xvZ2dlcic7XG5pbXBvcnQgeyBFbnZpdmVNZXRyaWNzRXZlbnROYW1lIH0gZnJvbSAnLi4vYW1wbGl0dWRlU2VydmljZS9ldmVudE5hbWVzJztcbmltcG9ydCB7IEdBNFByb2plY3RlZEV2ZW50Q29uZmlnLCBHQTRfRVZFTlRfU0NIRU1BIH0gZnJvbSAnLi9nYTRFdmVudFNjaGVtYSc7XG5cbmNvbnN0IGxvZ2dlciA9IG5ldyBMb2dnZXIoJ2dhNFByb2plY3Rpb25TZXJ2aWNlJyk7XG5cbmNvbnN0IGZpbHRlclRvU2NoZW1hID0gKFxuICBldmVudFByb3BzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgYWxsb3dlZEZpZWxkczogcmVhZG9ubHkgc3RyaW5nW10sXG4pOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9PiB7XG4gIGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgZm9yIChjb25zdCBmaWVsZCBvZiBhbGxvd2VkRmllbGRzKSB7XG4gICAgaWYgKGZpZWxkIGluIGV2ZW50UHJvcHMpIHtcbiAgICAgIHJlc3VsdFtmaWVsZF0gPSBldmVudFByb3BzW2ZpZWxkXTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8vIEZsYXR0ZW4gb25seSB0cnVlIHRvcC1sZXZlbCBuZXN0ZWQgb2JqZWN0cyAoa2V5cyB3aXRoIG5vIGRvdHMpIG9uZSBsZXZlbCBkZWVwLlxuLy8gS2V5cyB0aGF0IGFscmVhZHkgY29udGFpbiBkb3RzIGFyZSBsZWZ0IGludGFjdCBzbyB0aGF0IGUuZy5cbi8vIGB0cmlnZ2VyLndpZGdldF9pbnRlcmFjdGlvbl9kYXRhOiB7IC4uLiB9YCBpcyBwcmVzZXJ2ZWQgZm9yIGRvd25zdHJlYW0gZXh0cmFjdGlvbi5cbmNvbnN0IGZsYXR0ZW5PbmVMZXZlbCA9IChvYmo6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPT4ge1xuICBjb25zdCByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKG9iaikpIHtcbiAgICBpZiAoXG4gICAgICAha2V5LmluY2x1ZGVzKCcuJykgJiZcbiAgICAgIHZhbHVlICE9PSBudWxsICYmXG4gICAgICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmXG4gICAgICAhQXJyYXkuaXNBcnJheSh2YWx1ZSlcbiAgICApIHtcbiAgICAgIGZvciAoY29uc3QgW3N1YktleSwgc3ViVmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KSkge1xuICAgICAgICByZXN1bHRbYCR7a2V5fS4ke3N1YktleX1gXSA9IHN1YlZhbHVlO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHRba2V5XSA9IHZhbHVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuLy8gQXBwbHkgYSBHQTQgcHJvamVjdGlvbiBtYXAgeyBnYTRLZXk6IHNvdXJjZUtleSB9IHRvIGV4dHJhY3QgYW5kIHJlbmFtZSBmaWVsZHMuXG5jb25zdCBmaWx0ZXJXaXRoUHJvamVjdGlvbnMgPSAoXG4gIGV2ZW50UHJvcHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICBwcm9qZWN0aW9uczogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbik6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0+IHtcbiAgY29uc3QgcmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuICBmb3IgKGNvbnN0IFtnYTRLZXksIHNvdXJjZUtleV0gb2YgT2JqZWN0LmVudHJpZXMocHJvamVjdGlvbnMpKSB7XG4gICAgaWYgKHNvdXJjZUtleSBpbiBldmVudFByb3BzKSB7XG4gICAgICByZXN1bHRbZ2E0S2V5XSA9IGV2ZW50UHJvcHNbc291cmNlS2V5XTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8vIFwiY29udGV4dC5wYWdlX3R5cGVcIiDihpIgXCJjb250ZXh0X3BhZ2VfdHlwZVwiXG5jb25zdCBmbGF0dGVuRG90S2V5cyA9IChvYmo6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPT4ge1xuICBjb25zdCByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKG9iaikpIHtcbiAgICByZXN1bHRba2V5LnJlcGxhY2UoL1xcLi9nLCAnXycpXSA9IHZhbHVlO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG4vLyBPbWl0IGNvbnRleHQucGFnZV9pZCBmb3Igbm9uLXBkcC9wbHAgcGFnZSB0eXBlcy4gVGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gZm9yIGNvbnRleHQucGFnZV9pZCBpczpcbi8vIFBEUDogcHJvZHVjdF9pZFxuLy8gUExQOiBwbHBfaWRcbi8vIFNlYXJjaDogc2VhcmNoIHF1ZXJ5XG4vLyBPdGhlcjogcGFnZSB1cmxcbi8vIFdlIHdhbnQgdG8gb21pdCBhbGwgYnV0IHBkcCBhbmQgcGxwIHBhZ2UgdHlwZXMgdG8gcHJvdmlkZSBhIGNsZWFyLCBjb25zaXN0ZW50IGludGVyZmFjZSBmb3IgbWVyY2hhbnRzLlxuLy8gSGFuZGxlcyBib3RoIGRvdC1ub3RhdGlvbiBrZXlzIChhbGxvd2VkRmllbGRzIHBhdGgpIGFuZCByZW5hbWVkIEdBNCBrZXlzIChmaWVsZFByb2plY3Rpb25zIHBhdGgpLlxuY29uc3Qgc2FuaXRpemVQYWdlSWQgPSAoZmlsdGVyZWQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPT4ge1xuICBjb25zdCBwYWdlVHlwZSA9IGZpbHRlcmVkWydwYWdlX3R5cGUnXSA/PyBmaWx0ZXJlZFsnY29udGV4dC5wYWdlX3R5cGUnXTtcbiAgaWYgKHBhZ2VUeXBlID09PSAncGRwJyB8fCBwYWdlVHlwZSA9PT0gJ3BscCcpIHtcbiAgICByZXR1cm4gZmlsdGVyZWQ7XG4gIH1cbiAgY29uc3QgcmVzdCA9IHsgLi4uZmlsdGVyZWQgfTtcbiAgZGVsZXRlIHJlc3RbJ3BhZ2VfaWQnXTtcbiAgZGVsZXRlIHJlc3RbJ2NvbnRleHQucGFnZV9pZCddO1xuICByZXR1cm4gcmVzdDtcbn07XG5cbmNvbnN0IGdldE5lc3RlZFZhbHVlID0gKG9iajogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIHBhdGg6IHN0cmluZyk6IHVua25vd24gPT4ge1xuICBjb25zdCBwYXJ0cyA9IHBhdGguc3BsaXQoJy4nKTtcbiAgbGV0IGN1cnJlbnQ6IHVua25vd24gPSBvYmo7XG4gIGZvciAoY29uc3QgcGFydCBvZiBwYXJ0cykge1xuICAgIGlmIChjdXJyZW50ID09PSBudWxsIHx8IHR5cGVvZiBjdXJyZW50ICE9PSAnb2JqZWN0JykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBjdXJyZW50ID0gKGN1cnJlbnQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW3BhcnRdO1xuICB9XG4gIHJldHVybiBjdXJyZW50O1xufTtcblxuLy8gRXh0cmFjdCB3aGl0ZWxpc3RlZCBzdWItZmllbGRzIGZyb20gdHJpZ2dlci53aWRnZXRfaW50ZXJhY3Rpb25fZGF0YVxuY29uc3QgcHJvamVjdFdpZGdldEludGVyYWN0aW9uRGF0YSA9IChcbiAgZXZlbnRQcm9wczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIGNvbmZpZzogR0E0UHJvamVjdGVkRXZlbnRDb25maWcsXG4pOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9PiB7XG4gIGlmICghY29uZmlnLndpZGdldEludGVyYWN0aW9uRGF0YVByb2plY3Rpb25zKSB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG5cbiAgY29uc3QgaW50ZXJhY3Rpb24gPSBldmVudFByb3BzWyd0cmlnZ2VyLndpZGdldF9pbnRlcmFjdGlvbiddO1xuICBpZiAodHlwZW9mIGludGVyYWN0aW9uICE9PSAnc3RyaW5nJykge1xuICAgIHJldHVybiB7fTtcbiAgfVxuXG4gIGNvbnN0IHByb2plY3Rpb25NYXAgPSBjb25maWcud2lkZ2V0SW50ZXJhY3Rpb25EYXRhUHJvamVjdGlvbnNbaW50ZXJhY3Rpb25dO1xuICBpZiAoIXByb2plY3Rpb25NYXApIHtcbiAgICByZXR1cm4ge307XG4gIH1cblxuICBjb25zdCBpbnRlcmFjdGlvbkRhdGEgPSBldmVudFByb3BzWyd0cmlnZ2VyLndpZGdldF9pbnRlcmFjdGlvbl9kYXRhJ107XG4gIGlmIChcbiAgICBpbnRlcmFjdGlvbkRhdGEgPT09IG51bGwgfHxcbiAgICBpbnRlcmFjdGlvbkRhdGEgPT09IHVuZGVmaW5lZCB8fFxuICAgIHR5cGVvZiBpbnRlcmFjdGlvbkRhdGEgIT09ICdvYmplY3QnXG4gICkge1xuICAgIHJldHVybiB7fTtcbiAgfVxuXG4gIGNvbnN0IGRhdGEgPSBpbnRlcmFjdGlvbkRhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgZm9yIChjb25zdCBbZ2FLZXksIHNvdXJjZVBhdGhdIG9mIE9iamVjdC5lbnRyaWVzKHByb2plY3Rpb25NYXApKSB7XG4gICAgY29uc3QgdmFsdWUgPSBnZXROZXN0ZWRWYWx1ZShkYXRhLCBzb3VyY2VQYXRoKTtcbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmVzdWx0W2dhS2V5XSA9IHZhbHVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuY29uc3QgdHJ1bmNhdGVTdHJpbmcgPSAodmFsdWU6IHVua25vd24pOiB1bmtub3duID0+IHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgdmFsdWUubGVuZ3RoID4gMTAwKSB7XG4gICAgcmV0dXJuIGAke3ZhbHVlLnN1YnN0cmluZygwLCA5Nyl9Li4uYDtcbiAgfVxuICByZXR1cm4gdmFsdWU7XG59O1xuXG5jb25zdCB0cnVuY2F0ZVZhbHVlcyA9IChvYmo6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPT4ge1xuICBjb25zdCByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKG9iaikpIHtcbiAgICByZXN1bHRba2V5XSA9IHRydW5jYXRlU3RyaW5nKHZhbHVlKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuY29uc3QgcHVzaFRvRGF0YUxheWVyID0gKGdhRXZlbnQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogdm9pZCA9PiB7XG4gIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cuZGF0YUxheWVyKSB7XG4gICAgd2luZG93LmRhdGFMYXllci5wdXNoKGdhRXZlbnQpO1xuICB9XG59O1xuXG5leHBvcnQgY29uc3QgcHJvamVjdFRvR0E0ID0gKFxuICBldmVudE5hbWU6IEVudml2ZU1ldHJpY3NFdmVudE5hbWUsXG4gIGV2ZW50UHJvcHM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbik6IHZvaWQgPT4ge1xuICB0cnkge1xuICAgIGNvbnN0IHNjaGVtYUVudHJ5ID0gR0E0X0VWRU5UX1NDSEVNQVtldmVudE5hbWVdO1xuXG4gICAgaWYgKHNjaGVtYUVudHJ5LmdhRXZlbnROYW1lID09PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY29uZmlnID0gc2NoZW1hRW50cnk7XG4gICAgY29uc3QgcHJvcHMgPSBmbGF0dGVuT25lTGV2ZWwoZXZlbnRQcm9wcyA/PyB7fSk7XG5cbiAgICBsZXQgZmlsdGVyZWQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIGlmIChjb25maWcuZmllbGRQcm9qZWN0aW9ucykge1xuICAgICAgZmlsdGVyZWQgPSBmaWx0ZXJXaXRoUHJvamVjdGlvbnMocHJvcHMsIGNvbmZpZy5maWVsZFByb2plY3Rpb25zKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZmlsdGVyZWQgPSBmaWx0ZXJUb1NjaGVtYShwcm9wcywgY29uZmlnLmFsbG93ZWRGaWVsZHMpO1xuICAgIH1cbiAgICBmaWx0ZXJlZCA9IHNhbml0aXplUGFnZUlkKGZpbHRlcmVkKTtcblxuICAgIGNvbnN0IGludGVyYWN0aW9uRmllbGRzID0gcHJvamVjdFdpZGdldEludGVyYWN0aW9uRGF0YShwcm9wcywgY29uZmlnKTtcblxuICAgIGNvbnN0IGZsYXRQYXJhbXMgPSB7XG4gICAgICAuLi5mbGF0dGVuRG90S2V5cyhmaWx0ZXJlZCksXG4gICAgICAuLi5pbnRlcmFjdGlvbkZpZWxkcyxcbiAgICB9O1xuXG4gICAgY29uc3QgdHJ1bmNhdGVkUGFyYW1zID0gdHJ1bmNhdGVWYWx1ZXMoZmxhdFBhcmFtcyk7XG5cbiAgICBwdXNoVG9EYXRhTGF5ZXIoe1xuICAgICAgZXZlbnQ6IGNvbmZpZy5nYUV2ZW50TmFtZSxcbiAgICAgIC4uLnRydW5jYXRlZFBhcmFtcyxcbiAgICB9KTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nZ2VyLmxvZ0Vycm9yKCdFcnJvciBwcm9qZWN0aW5nIGV2ZW50IHRvIEdBNCcsIGVyciwge1xuICAgICAgZXZlbnROYW1lLFxuICAgIH0pO1xu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
|
package/package.json
CHANGED
|
@@ -27,4 +27,5 @@ export enum FeatureGates {
|
|
|
27
27
|
IsAiSuggestionsVariantEnabled = 'is_ai_suggestions_variant_enabled',
|
|
28
28
|
IsAiSuggestionsVariantAEnabled = 'is_ai_suggestions_variant_a_enabled',
|
|
29
29
|
IsAiSuggestionsVariantBEnabled = 'is_ai_suggestions_variant_b_enabled',
|
|
30
|
+
IsVoiceInputEnabled = 'is_voice_input_enabled',
|
|
30
31
|
}
|
|
@@ -26,6 +26,7 @@ export const initializedAtom = atom<boolean>(false);
|
|
|
26
26
|
export const chatIsOpenAtom = atom<boolean>(false);
|
|
27
27
|
export const requestFailureAtom = atom<boolean>(false);
|
|
28
28
|
export const formSubmitAtom = atom<FormSubmittedAttributes>();
|
|
29
|
+
export const listeningToSpeechAtom = atom<boolean>(false);
|
|
29
30
|
export const chatOnToggleAtom = atom(
|
|
30
31
|
null,
|
|
31
32
|
(
|
|
@@ -20,6 +20,7 @@ import { AmplitudeProvider, SpiffyMetricsEventName, useAmplitude } from '../ampl
|
|
|
20
20
|
const mockTrackEvent = vi.fn().mockResolvedValue(undefined);
|
|
21
21
|
const mockSetSupplementalDefaultProps = vi.fn();
|
|
22
22
|
const mockIsReady = vi.fn().mockReturnValue(true);
|
|
23
|
+
const mockIsMockApiKey = vi.fn().mockReturnValue(false);
|
|
23
24
|
|
|
24
25
|
vi.mock('src/services/amplitudeService/amplitudeService', async () => {
|
|
25
26
|
const actual = await vi.importActual<
|
|
@@ -34,6 +35,10 @@ vi.mock('src/services/amplitudeService/amplitudeService', async () => {
|
|
|
34
35
|
get isReady(): boolean {
|
|
35
36
|
return mockIsReady();
|
|
36
37
|
}
|
|
38
|
+
|
|
39
|
+
get isMockApiKey(): boolean {
|
|
40
|
+
return mockIsMockApiKey();
|
|
41
|
+
}
|
|
37
42
|
}
|
|
38
43
|
|
|
39
44
|
function MockAmplitudeServiceConstructor() {
|
|
@@ -55,6 +60,7 @@ const MockAmplitudeComponent: React.FC = () => {
|
|
|
55
60
|
return (
|
|
56
61
|
<div data-testid="amplitude-component">
|
|
57
62
|
<div data-testid="is-ready">{amplitude.isReady.toString()}</div>
|
|
63
|
+
<div data-testid="is-mock-mode">{amplitude.isMockMode.toString()}</div>
|
|
58
64
|
<button
|
|
59
65
|
data-testid="track-event-button"
|
|
60
66
|
type="button"
|
|
@@ -213,6 +219,7 @@ describe('AmplitudeProvider - React Context Integration', () => {
|
|
|
213
219
|
mockTrackEvent.mockClear();
|
|
214
220
|
mockSetSupplementalDefaultProps.mockClear();
|
|
215
221
|
mockIsReady.mockReturnValue(true);
|
|
222
|
+
mockIsMockApiKey.mockReturnValue(false);
|
|
216
223
|
if (AmplitudeService && typeof AmplitudeService === 'function') {
|
|
217
224
|
(AmplitudeService as unknown as ReturnType<typeof vi.fn>).mockClear();
|
|
218
225
|
}
|
|
@@ -332,38 +339,35 @@ describe('AmplitudeProvider - React Context Integration', () => {
|
|
|
332
339
|
});
|
|
333
340
|
});
|
|
334
341
|
|
|
335
|
-
it('should
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
);
|
|
356
|
-
};
|
|
342
|
+
it('should render children with isReady=false when isMockMode=true', async () => {
|
|
343
|
+
mockIsReady.mockReturnValue(false);
|
|
344
|
+
mockIsMockApiKey.mockReturnValue(true);
|
|
345
|
+
|
|
346
|
+
render(
|
|
347
|
+
<TestWrapper amplitudeApiKey="mock-amplitude-key">
|
|
348
|
+
<MockAmplitudeComponent />
|
|
349
|
+
</TestWrapper>,
|
|
350
|
+
);
|
|
351
|
+
|
|
352
|
+
await waitFor(() => {
|
|
353
|
+
expect(screen.getByTestId('amplitude-component')).toBeInTheDocument();
|
|
354
|
+
expect(screen.getByTestId('is-ready').textContent).toBe('false');
|
|
355
|
+
expect(screen.getByTestId('is-mock-mode').textContent).toBe('true');
|
|
356
|
+
});
|
|
357
|
+
});
|
|
358
|
+
|
|
359
|
+
it('should NOT render children when isReady=false and isMockMode=false', async () => {
|
|
360
|
+
mockIsReady.mockReturnValue(false);
|
|
361
|
+
mockIsMockApiKey.mockReturnValue(false);
|
|
357
362
|
|
|
358
363
|
render(
|
|
359
|
-
<
|
|
360
|
-
<
|
|
361
|
-
</
|
|
364
|
+
<TestWrapper>
|
|
365
|
+
<MockAmplitudeComponent />
|
|
366
|
+
</TestWrapper>,
|
|
362
367
|
);
|
|
363
368
|
|
|
364
|
-
// AmplitudeProvider returns null when not ready, so children should not render
|
|
365
369
|
await waitFor(() => {
|
|
366
|
-
expect(screen.queryByTestId('
|
|
370
|
+
expect(screen.queryByTestId('amplitude-component')).not.toBeInTheDocument();
|
|
367
371
|
});
|
|
368
372
|
});
|
|
369
373
|
});
|
|
@@ -23,6 +23,7 @@ export { EnviveMetricsEventName, SpiffyMetricsEventName };
|
|
|
23
23
|
interface AmplitudeContextType {
|
|
24
24
|
trackEvent: (params: TrackEventParams) => Promise<void>;
|
|
25
25
|
isReady: boolean;
|
|
26
|
+
isMockMode: boolean;
|
|
26
27
|
setSupplementalDefaultProps: (props: Record<string, unknown>) => void;
|
|
27
28
|
}
|
|
28
29
|
|
|
@@ -55,6 +56,7 @@ export const AmplitudeProvider: React.FC<{
|
|
|
55
56
|
const [service, setService] = useState<AmplitudeService | null>(null);
|
|
56
57
|
|
|
57
58
|
const isReady = Boolean(userId && service && service.isReady);
|
|
59
|
+
const isMockMode = Boolean(service?.isMockApiKey);
|
|
58
60
|
|
|
59
61
|
// Create service instance when dependencies are ready
|
|
60
62
|
useEffect(() => {
|
|
@@ -109,16 +111,17 @@ export const AmplitudeProvider: React.FC<{
|
|
|
109
111
|
}
|
|
110
112
|
},
|
|
111
113
|
isReady,
|
|
114
|
+
isMockMode,
|
|
112
115
|
setSupplementalDefaultProps: (props: Record<string, unknown>) => {
|
|
113
116
|
if (service) {
|
|
114
117
|
service.setSupplementalDefaultProps(props);
|
|
115
118
|
}
|
|
116
119
|
},
|
|
117
120
|
}),
|
|
118
|
-
[service, isReady],
|
|
121
|
+
[service, isReady, isMockMode],
|
|
119
122
|
);
|
|
120
123
|
|
|
121
|
-
if (!isReady) {
|
|
124
|
+
if (!isReady && !isMockMode) {
|
|
122
125
|
return null;
|
|
123
126
|
}
|
|
124
127
|
|
|
@@ -219,10 +219,18 @@ export const HardcopyProvider: React.FC<HardcopyProviderProps> = ({
|
|
|
219
219
|
const { featureFlagService } = useFeatureFlagService();
|
|
220
220
|
const getHardcopyFromBackend = useCallback(
|
|
221
221
|
async (request: HardcopyRequest): Promise<HardcopyResponse> => {
|
|
222
|
-
|
|
222
|
+
const fallbackWidgetType =
|
|
223
|
+
request.widgetType === WidgetTypeV3.ProductCardV3
|
|
224
|
+
? WidgetTypeV3.ImagePromptCardV3
|
|
225
|
+
: request.widgetType;
|
|
226
|
+
|
|
227
|
+
const overrideEntry =
|
|
228
|
+
hardcopyOverride?.[request.widgetType] ?? hardcopyOverride?.[fallbackWidgetType];
|
|
229
|
+
if (overrideEntry) {
|
|
223
230
|
logger.logDebug('using hardcopy override', request.widgetType);
|
|
224
|
-
return
|
|
231
|
+
return overrideEntry;
|
|
225
232
|
}
|
|
233
|
+
|
|
226
234
|
const overrideConfigVersion =
|
|
227
235
|
getQueryParam('spiffy_config_version') ||
|
|
228
236
|
getQueryParam('envive_config_version') ||
|
|
@@ -19,6 +19,16 @@ vi.spyOn(Logger.prototype, 'logInfo').mockImplementation(() => {});
|
|
|
19
19
|
vi.spyOn(Logger.prototype, 'logWarn').mockImplementation(() => {});
|
|
20
20
|
vi.spyOn(Logger.prototype, 'logError').mockImplementation(() => {});
|
|
21
21
|
|
|
22
|
+
vi.mock('src/contexts/amplitudeContext', () => ({
|
|
23
|
+
useAmplitude: () => ({
|
|
24
|
+
trackEvent: vi.fn(),
|
|
25
|
+
isReady: true,
|
|
26
|
+
}),
|
|
27
|
+
EnviveMetricsEventName: {
|
|
28
|
+
PageViewed: 'Page Viewed',
|
|
29
|
+
},
|
|
30
|
+
}));
|
|
31
|
+
|
|
22
32
|
// Mock CommerceApiClient
|
|
23
33
|
const mockResolveUrl = vi.fn();
|
|
24
34
|
vi.mock('src/application/commerce-api', () => ({
|
|
@@ -14,6 +14,7 @@ import {
|
|
|
14
14
|
import { hasParsedVariantInfoAtom } from 'src/atoms/app';
|
|
15
15
|
import { analyticsContextAtom } from 'src/atoms/app/variant';
|
|
16
16
|
import { formSubmitAtom, replyEventCategoryAtom } from 'src/atoms/chat';
|
|
17
|
+
import { suggestionsAtom } from 'src/atoms/chat/chatState';
|
|
17
18
|
import { queueUserEventAtom } from 'src/atoms/chat/messageQueue';
|
|
18
19
|
import { useWidgetInteraction } from 'src/hooks/WidgetInteraction';
|
|
19
20
|
import {
|
|
@@ -56,6 +57,7 @@ export const useSalesAgentChatAPI = (widget?: WidgetInteractionComponent) => {
|
|
|
56
57
|
const context = useAtomValue(analyticsContextAtom);
|
|
57
58
|
const hasParsedVariantInfo = useAtomValue(hasParsedVariantInfoAtom);
|
|
58
59
|
const queueUserEvent = useSetAtom(queueUserEventAtom);
|
|
60
|
+
const setSuggestions = useSetAtom(suggestionsAtom);
|
|
59
61
|
const setReplyEventCategory = useSetAtom(replyEventCategoryAtom);
|
|
60
62
|
const setFormSubmit = useSetAtom(formSubmitAtom);
|
|
61
63
|
const { trackEvent } = useAmplitude();
|
|
@@ -164,9 +166,10 @@ export const useSalesAgentChatAPI = (widget?: WidgetInteractionComponent) => {
|
|
|
164
166
|
content: suggestion.content,
|
|
165
167
|
},
|
|
166
168
|
};
|
|
169
|
+
setSuggestions([]);
|
|
167
170
|
queueUserEvent(event);
|
|
168
171
|
},
|
|
169
|
-
[queueUserEvent, trackEvent, context],
|
|
172
|
+
[queueUserEvent, setSuggestions, trackEvent, context],
|
|
170
173
|
);
|
|
171
174
|
const onTypedMessageSubmitted = useCallback(
|
|
172
175
|
({
|
|
@@ -229,9 +232,10 @@ export const useSalesAgentChatAPI = (widget?: WidgetInteractionComponent) => {
|
|
|
229
232
|
userTyped,
|
|
230
233
|
},
|
|
231
234
|
};
|
|
235
|
+
setSuggestions([]);
|
|
232
236
|
queueUserEvent(event);
|
|
233
237
|
},
|
|
234
|
-
[queueUserEvent, trackEvent, context],
|
|
238
|
+
[queueUserEvent, setSuggestions, trackEvent, context],
|
|
235
239
|
);
|
|
236
240
|
const onFormResponseSubmitted = useCallback(
|
|
237
241
|
(form: FormSubmittedAttributes) => {
|
package/src/contexts/typesV3.ts
CHANGED
|
@@ -29,10 +29,6 @@ import { UserIdentityService } from 'src/services/userIdentityService';
|
|
|
29
29
|
import { useSearch } from '../useSearch';
|
|
30
30
|
|
|
31
31
|
// Mock dependencies
|
|
32
|
-
vi.mock('src/hooks/TrackComponentVisibleEvent/useTrackComponentVisibleEvent', () => ({
|
|
33
|
-
useTrackComponentVisibleEvent: vi.fn(),
|
|
34
|
-
}));
|
|
35
|
-
|
|
36
32
|
vi.mock('src/hooks/Intersection/useIntersection', () => ({
|
|
37
33
|
useIntersection: vi.fn(() => false),
|
|
38
34
|
}));
|