@simplybusiness/services 2.3.3 → 2.4.1

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 (32) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/dist/cjs/index.js +84 -2
  3. package/dist/cjs/index.js.map +2 -2
  4. package/dist/cjs/meta.json +19 -19
  5. package/dist/cjs/snowplow/SnowplowContext.js +84 -2
  6. package/dist/cjs/snowplow/SnowplowContext.js.map +2 -2
  7. package/dist/cjs/snowplow/event-definitions/index.js +84 -2
  8. package/dist/cjs/snowplow/event-definitions/index.js.map +2 -2
  9. package/dist/cjs/snowplow/event-definitions/questionnaire/questionnaire.js +84 -2
  10. package/dist/cjs/snowplow/event-definitions/questionnaire/questionnaire.js.map +2 -2
  11. package/dist/cjs/snowplow/index.js +84 -2
  12. package/dist/cjs/snowplow/index.js.map +2 -2
  13. package/dist/cjs/utils/testUtils.js +84 -2
  14. package/dist/cjs/utils/testUtils.js.map +2 -2
  15. package/dist/esm/{chunk-PI33NKP7.js → chunk-LLSH4K4D.js} +2 -2
  16. package/dist/esm/{chunk-OFQYDVHG.js → chunk-WB3C6L4X.js} +2 -2
  17. package/dist/esm/{chunk-OQ4YGZGX.js → chunk-YO5FUC73.js} +85 -3
  18. package/dist/esm/chunk-YO5FUC73.js.map +7 -0
  19. package/dist/esm/index.js +3 -3
  20. package/dist/esm/meta.json +27 -27
  21. package/dist/esm/snowplow/SnowplowContext.js +3 -3
  22. package/dist/esm/snowplow/event-definitions/index.js +2 -2
  23. package/dist/esm/snowplow/event-definitions/questionnaire/questionnaire.js +1 -1
  24. package/dist/esm/snowplow/index.js +3 -3
  25. package/dist/esm/utils/testUtils.js +3 -3
  26. package/dist/tsconfig.build.tsbuildinfo +1 -1
  27. package/package.json +2 -2
  28. package/src/snowplow/event-definitions/questionnaire/questionnaire.test.ts +222 -5
  29. package/src/snowplow/event-definitions/questionnaire/questionnaire.ts +93 -1
  30. package/dist/esm/chunk-OQ4YGZGX.js.map +0 -7
  31. /package/dist/esm/{chunk-PI33NKP7.js.map → chunk-LLSH4K4D.js.map} +0 -0
  32. /package/dist/esm/{chunk-OFQYDVHG.js.map → chunk-WB3C6L4X.js.map} +0 -0
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@simplybusiness/services",
3
3
  "license": "UNLICENSED",
4
- "version": "2.3.3",
4
+ "version": "2.4.1",
5
5
  "description": "Internal library for services",
6
6
  "repository": {
7
7
  "type": "git",
@@ -88,7 +88,7 @@
88
88
  },
89
89
  "dependencies": {
90
90
  "@airbrake/browser": "^2.1.9",
91
- "@simplybusiness/mobius": "^9.3.1",
91
+ "@simplybusiness/mobius": "^9.3.2",
92
92
  "@snowplow/browser-plugin-ga-cookies": "^3.24.0",
93
93
  "@snowplow/browser-tracker": "^3.24.6",
94
94
  "classnames": "^2.5.1"
@@ -71,6 +71,15 @@ describe("questionnaireEventDefinitions", () => {
71
71
  });
72
72
  });
73
73
 
74
+ it("should have serviceChannelContext context", () => {
75
+ const event = findEventByName(
76
+ questionnaireEventDefinitions,
77
+ "questionAnswered",
78
+ );
79
+
80
+ expect(event.contexts).toEqual(["serviceChannelContext"]);
81
+ });
82
+
74
83
  it("should redact answers", () => {
75
84
  const params = {
76
85
  section: "test-section",
@@ -125,7 +134,7 @@ describe("questionnaireEventDefinitions", () => {
125
134
 
126
135
  expect(result).toEqual({
127
136
  schema:
128
- "iglu:com.simplybusiness/primary_detail_selected/jsonschema/1-4-0",
137
+ "iglu:com.simplybusiness/primary_detail_selected/jsonschema/1-5-0",
129
138
  data: {
130
139
  site: "us",
131
140
  vertical: "shop",
@@ -172,7 +181,7 @@ describe("questionnaireEventDefinitions", () => {
172
181
 
173
182
  expect(result).toEqual({
174
183
  schema:
175
- "iglu:com.simplybusiness/primary_detail_selected/jsonschema/1-4-0",
184
+ "iglu:com.simplybusiness/primary_detail_selected/jsonschema/1-5-0",
176
185
  data: {
177
186
  site: "simplybusiness_us",
178
187
  vertical: "shop",
@@ -207,7 +216,7 @@ describe("questionnaireEventDefinitions", () => {
207
216
 
208
217
  expect(result).toEqual({
209
218
  schema:
210
- "iglu:com.simplybusiness/primary_detail_selected/jsonschema/1-4-0",
219
+ "iglu:com.simplybusiness/primary_detail_selected/jsonschema/1-5-0",
211
220
  data: {
212
221
  site: "simplybusiness_uk",
213
222
  vertical: "shop",
@@ -239,7 +248,7 @@ describe("questionnaireEventDefinitions", () => {
239
248
 
240
249
  expect(result).toEqual({
241
250
  schema:
242
- "iglu:com.simplybusiness/primary_detail_selected/jsonschema/1-4-0",
251
+ "iglu:com.simplybusiness/primary_detail_selected/jsonschema/1-5-0",
243
252
  data: {
244
253
  site: "simplybusiness_us",
245
254
  vertical: "shop",
@@ -271,7 +280,7 @@ describe("questionnaireEventDefinitions", () => {
271
280
 
272
281
  expect(result).toEqual({
273
282
  schema:
274
- "iglu:com.simplybusiness/primary_detail_selected/jsonschema/1-4-0",
283
+ "iglu:com.simplybusiness/primary_detail_selected/jsonschema/1-5-0",
275
284
  data: {
276
285
  site: "simplybusiness_us",
277
286
  vertical: "shop",
@@ -577,6 +586,214 @@ describe("questionnaireEventDefinitions", () => {
577
586
  });
578
587
  });
579
588
 
589
+ describe("primaryDetailSelected pre_filled_source", () => {
590
+ afterEach(() => {
591
+ sessionStorage.clear();
592
+ });
593
+
594
+ it("should include pre_filled_source from params when provided", () => {
595
+ const params = {
596
+ context: {
597
+ site: "simplybusiness_us",
598
+ vertical: "shop",
599
+ },
600
+ answer: "Plumber",
601
+ preFilledSource: "sjp_recommendation",
602
+ };
603
+
604
+ const result = findEventByName(
605
+ questionnaireEventDefinitions,
606
+ "primaryDetailSelected",
607
+ ).makePayload(params);
608
+
609
+ expect(result).toHaveProperty("data");
610
+ if ("data" in result) {
611
+ expect(result.data.pre_filled_source).toBe("sjp_recommendation");
612
+ }
613
+ });
614
+
615
+ it("should include pre_filled_source from sessionStorage when available", () => {
616
+ sessionStorage.setItem("preFilledSource", "cross_sell");
617
+
618
+ const params = {
619
+ context: {
620
+ site: "simplybusiness_us",
621
+ vertical: "shop",
622
+ },
623
+ answer: "Plumber",
624
+ };
625
+
626
+ const result = findEventByName(
627
+ questionnaireEventDefinitions,
628
+ "primaryDetailSelected",
629
+ ).makePayload(params);
630
+
631
+ expect(result).toHaveProperty("data");
632
+ if ("data" in result) {
633
+ expect(result.data.pre_filled_source).toBe("cross_sell");
634
+ }
635
+ });
636
+
637
+ it("should not include pre_filled_source when not available", () => {
638
+ const params = {
639
+ context: {
640
+ site: "simplybusiness_us",
641
+ vertical: "shop",
642
+ },
643
+ answer: "Plumber",
644
+ };
645
+
646
+ const result = findEventByName(
647
+ questionnaireEventDefinitions,
648
+ "primaryDetailSelected",
649
+ ).makePayload(params);
650
+
651
+ expect(result).toHaveProperty("data");
652
+ if ("data" in result) {
653
+ expect(result.data).not.toHaveProperty("pre_filled_source");
654
+ }
655
+ });
656
+ });
657
+
658
+ describe("tradeSelectorClicked", () => {
659
+ it("should create correct payload", () => {
660
+ const result = findEventByName(
661
+ questionnaireEventDefinitions,
662
+ "tradeSelectorClicked",
663
+ ).makePayload({});
664
+
665
+ expect(result).toEqual({
666
+ category: "marketing",
667
+ action: "trade_selector_clicked",
668
+ label: "trade selector clicked",
669
+ property: window?.location?.href ?? "",
670
+ });
671
+ });
672
+ });
673
+
674
+ describe("usStateClicked", () => {
675
+ it("should create correct payload", () => {
676
+ const result = findEventByName(
677
+ questionnaireEventDefinitions,
678
+ "usStateClicked",
679
+ ).makePayload({});
680
+
681
+ expect(result).toEqual({
682
+ category: "marketing",
683
+ action: "us_state_clicked",
684
+ label: "US state clicked",
685
+ property: window?.location?.href ?? "",
686
+ });
687
+ });
688
+ });
689
+
690
+ describe("usStateErrorMessageDisplayed", () => {
691
+ it("should create correct payload with state value", () => {
692
+ const result = findEventByName(
693
+ questionnaireEventDefinitions,
694
+ "usStateErrorMessageDisplayed",
695
+ ).makePayload({ stateValue: "California" });
696
+
697
+ expect(result).toEqual({
698
+ category: "marketing",
699
+ action: "us_state_error_message_displayed",
700
+ label: "US state error message displayed",
701
+ property: "California",
702
+ });
703
+ });
704
+
705
+ it("should handle empty state value", () => {
706
+ const result = findEventByName(
707
+ questionnaireEventDefinitions,
708
+ "usStateErrorMessageDisplayed",
709
+ ).makePayload({});
710
+
711
+ expect(result).toEqual({
712
+ category: "marketing",
713
+ action: "us_state_error_message_displayed",
714
+ label: "US state error message displayed",
715
+ property: "",
716
+ });
717
+ });
718
+ });
719
+
720
+ describe("pagesetSectionChanged", () => {
721
+ it("should create correct payload", () => {
722
+ const params = {
723
+ context: {
724
+ site: "simplybusiness_us",
725
+ vertical: "cyber",
726
+ },
727
+ pageIndex: 1,
728
+ pageName: "quick_to_quote",
729
+ sectionName: "Coverage Primary trade",
730
+ sectionIndex: 1,
731
+ sectionComplete: true,
732
+ };
733
+
734
+ const result = findEventByName(
735
+ questionnaireEventDefinitions,
736
+ "pagesetSectionChanged",
737
+ ).makePayload(params);
738
+
739
+ expect(result).toEqual({
740
+ schema:
741
+ "iglu:com.simplybusiness/pageset_section_changed/jsonschema/1-0-0",
742
+ data: {
743
+ site: "simplybusiness_us",
744
+ vertical: "cyber",
745
+ page_index: 1,
746
+ page_name: "quick_to_quote",
747
+ section_name: "Coverage Primary trade",
748
+ section_index: 1,
749
+ section_complete: true,
750
+ },
751
+ });
752
+ });
753
+
754
+ it("should have distributionChannelContext and serviceChannelContext contexts", () => {
755
+ const event = findEventByName(
756
+ questionnaireEventDefinitions,
757
+ "pagesetSectionChanged",
758
+ );
759
+
760
+ expect(event.contexts).toEqual([
761
+ "distributionChannelContext",
762
+ "serviceChannelContext",
763
+ ]);
764
+ });
765
+ });
766
+
767
+ describe("aiTradeSelectorFindMyBusiness", () => {
768
+ it("should create correct payload with search query", () => {
769
+ const result = findEventByName(
770
+ questionnaireEventDefinitions,
771
+ "aiTradeSelectorFindMyBusiness",
772
+ ).makePayload({ searchQuery: "plumbing contractor" });
773
+
774
+ expect(result).toEqual({
775
+ category: "ai_trade_selector_find_my_business_btn",
776
+ action: "click",
777
+ label: "plumbing contractor",
778
+ property: window?.location?.href ?? "",
779
+ });
780
+ });
781
+
782
+ it("should handle empty search query", () => {
783
+ const result = findEventByName(
784
+ questionnaireEventDefinitions,
785
+ "aiTradeSelectorFindMyBusiness",
786
+ ).makePayload({});
787
+
788
+ expect(result).toEqual({
789
+ category: "ai_trade_selector_find_my_business_btn",
790
+ action: "click",
791
+ label: "",
792
+ property: window?.location?.href ?? "",
793
+ });
794
+ });
795
+ });
796
+
580
797
  describe("questionValidationFailed", () => {
581
798
  it("sets the question name in the action and the error message as the label", () => {
582
799
  const params = {
@@ -31,6 +31,7 @@ export const questionnaireEventDefinitions: EventDefinition[] = [
31
31
  },
32
32
  };
33
33
  },
34
+ contexts: ["serviceChannelContext"],
34
35
  },
35
36
  {
36
37
  name: "primaryDetailSelected",
@@ -80,9 +81,19 @@ export const questionnaireEventDefinitions: EventDefinition[] = [
80
81
  data.business_unit = site;
81
82
  }
82
83
 
84
+ // Optional pre-filled source
85
+ const preFilledSource =
86
+ (params as ParamsType).preFilledSource ??
87
+ (typeof sessionStorage !== "undefined"
88
+ ? sessionStorage.getItem("preFilledSource")
89
+ : null);
90
+ if (preFilledSource) {
91
+ data.pre_filled_source = preFilledSource;
92
+ }
93
+
83
94
  return {
84
95
  schema:
85
- "iglu:com.simplybusiness/primary_detail_selected/jsonschema/1-4-0",
96
+ "iglu:com.simplybusiness/primary_detail_selected/jsonschema/1-5-0",
86
97
  data,
87
98
  };
88
99
  },
@@ -254,4 +265,85 @@ export const questionnaireEventDefinitions: EventDefinition[] = [
254
265
  };
255
266
  },
256
267
  },
268
+ {
269
+ name: "tradeSelectorClicked",
270
+ type: "structured",
271
+ makePayload: () => {
272
+ return {
273
+ category: "marketing",
274
+ action: "trade_selector_clicked",
275
+ label: "trade selector clicked",
276
+ property: window?.location?.href ?? "",
277
+ };
278
+ },
279
+ },
280
+ {
281
+ name: "usStateClicked",
282
+ type: "structured",
283
+ makePayload: () => {
284
+ return {
285
+ category: "marketing",
286
+ action: "us_state_clicked",
287
+ label: "US state clicked",
288
+ property: window?.location?.href ?? "",
289
+ };
290
+ },
291
+ },
292
+ {
293
+ name: "usStateErrorMessageDisplayed",
294
+ type: "structured",
295
+ makePayload: params => {
296
+ const { stateValue } = params as ParamsType;
297
+
298
+ return {
299
+ category: "marketing",
300
+ action: "us_state_error_message_displayed",
301
+ label: "US state error message displayed",
302
+ property: stateValue ?? "",
303
+ };
304
+ },
305
+ },
306
+ {
307
+ name: "pagesetSectionChanged",
308
+ type: "unstructured",
309
+ makePayload: params => {
310
+ const {
311
+ context,
312
+ pageIndex,
313
+ pageName,
314
+ sectionName,
315
+ sectionIndex,
316
+ sectionComplete,
317
+ } = params as ParamsType;
318
+
319
+ return {
320
+ schema:
321
+ "iglu:com.simplybusiness/pageset_section_changed/jsonschema/1-0-0",
322
+ data: {
323
+ site: context.site,
324
+ vertical: context.vertical,
325
+ page_index: pageIndex,
326
+ page_name: pageName,
327
+ section_name: sectionName,
328
+ section_index: sectionIndex,
329
+ section_complete: sectionComplete,
330
+ },
331
+ };
332
+ },
333
+ contexts: ["distributionChannelContext", "serviceChannelContext"],
334
+ },
335
+ {
336
+ name: "aiTradeSelectorFindMyBusiness",
337
+ type: "structured",
338
+ makePayload: params => {
339
+ const { searchQuery } = params as ParamsType;
340
+
341
+ return {
342
+ category: "ai_trade_selector_find_my_business_btn",
343
+ action: "click",
344
+ label: searchQuery ?? "",
345
+ property: window?.location?.href ?? "",
346
+ };
347
+ },
348
+ },
257
349
  ];
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/snowplow/event-definitions/questionnaire/questionnaire.ts"],
4
- "sourcesContent": ["import { DELIMITER } from \"../../constants\";\nimport type { EventDefinition, ParamsType } from \"../../types\";\nimport { redact } from \"./redaction\";\n\n// Questionnaire events\nexport const questionnaireEventDefinitions: EventDefinition[] = [\n {\n name: \"questionAnswered\",\n type: \"unstructured\",\n makePayload: params => {\n const { section, context } = params as ParamsType;\n const { question, answer } = redact(params as ParamsType);\n // Flatten the answer to a delimited string\n const flatAnswer = Array.isArray(answer)\n ? answer.join(DELIMITER)\n : answer;\n\n return {\n schema:\n \"iglu:com.simplybusiness/form_question_answered/jsonschema/1-0-4\",\n data: {\n site: context.site,\n page_index: 1,\n page_name: \"quick_to_quote\",\n submitted_from: \"quick_to_quote_experiment\",\n section_name: section,\n question,\n answer: flatAnswer,\n vertical: context.vertical,\n journey_id: context.journeyId,\n },\n };\n },\n },\n {\n name: \"primaryDetailSelected\",\n type: \"unstructured\",\n makePayload: params => {\n const {\n context,\n answer,\n vertical,\n searchId,\n selectedListPosition,\n selectionMethod,\n } = params as ParamsType;\n const { site } = context;\n const isUSPage = site === \"simplybusiness_us\";\n let verticalName = vertical || context.vertical;\n\n if (verticalName.toLowerCase().indexOf(\"landlord\") > -1) {\n verticalName =\n answer === \"residential\" ? \"Landlord\" : \"Commercial landlord\";\n }\n\n const data: Record<string, unknown> = {\n site,\n vertical: verticalName,\n primary_detail: answer,\n selected_type: \"trade_selector\",\n location: window?.location?.pathname ?? \"\",\n };\n\n // Always include search_id if present\n if (searchId) {\n data.search_id = searchId;\n }\n // Always include selection_method if present\n if (selectionMethod) {\n data.selection_method = selectionMethod;\n }\n\n // US only fields\n if (isUSPage) {\n data.selected_list_position =\n selectedListPosition !== undefined\n ? (selectedListPosition + 1).toString()\n : null;\n data.selected_location = \"trade_selector_vertical\";\n data.business_unit = site;\n }\n\n return {\n schema:\n \"iglu:com.simplybusiness/primary_detail_selected/jsonschema/1-4-0\",\n data,\n };\n },\n contexts: [\"distributionChannelContext\", \"serviceChannelContext\"],\n },\n {\n name: \"helpTextOpened\",\n type: \"unstructured\",\n makePayload: params => {\n const { primaryText, label, context, helpText } = params as ParamsType;\n\n return {\n schema: \"iglu:com.simplybusiness/help_text_opened/jsonschema/1-1-0\",\n data: {\n vertical: context.vertical,\n site: context.site,\n primary_text: primaryText,\n help_text: helpText,\n label,\n page_name: \"quick_to_quote\",\n },\n };\n },\n },\n {\n name: \"assumptionsButtonClicked\",\n type: \"structured\",\n makePayload: params => {\n const { source, presentationGroup } = params as ParamsType;\n\n return {\n action: source,\n category: presentationGroup,\n };\n },\n },\n {\n name: \"navButtonClicked\",\n type: \"structured\",\n makePayload: params => {\n const { label, category } = params as ParamsType;\n\n return {\n label,\n action: \"link_click\",\n category,\n };\n },\n },\n {\n name: \"manualAddressClicked\",\n type: \"structured\",\n makePayload: params => {\n const { category } = params as ParamsType;\n\n return {\n action: \"link_click\",\n category,\n label: \"Enter address manually\",\n };\n },\n },\n {\n name: \"assumptionLinkClicked\",\n type: \"structured\",\n makePayload: params => {\n const { label, category, property } = params as ParamsType;\n\n return {\n action: \"assumption_link_click\",\n category,\n label,\n property,\n };\n },\n },\n {\n name: \"addressLookupFocused\",\n type: \"structured\",\n makePayload: params => {\n const { label, category } = params as ParamsType;\n\n return {\n action: \"address_lookup_focused\",\n category,\n label,\n };\n },\n },\n {\n name: \"addressLookupTypedIn\",\n type: \"structured\",\n makePayload: params => {\n const { label, category } = params as ParamsType;\n\n return {\n action: \"address_lookup_typed_in\",\n category,\n label,\n };\n },\n },\n {\n name: \"addressOptionsDisplayed\",\n type: \"structured\",\n makePayload: params => {\n const { label, category } = params as ParamsType;\n\n return {\n action: \"address_options_displayed\",\n category,\n label,\n };\n },\n },\n {\n name: \"tradeChanged\",\n type: \"structured\",\n makePayload: params => {\n const { label, property } = params as ParamsType;\n\n return {\n action: \"change_your_selected_profession_button_clicked\",\n category: \"change_your_selected_profession_button\",\n label: `Question: ${label}`,\n property, // Answer before change\n };\n },\n },\n {\n name: \"questionValidationFailed\",\n type: \"structured\",\n makePayload: params => {\n const { question, errorMessage } = params as ParamsType;\n\n return {\n category: \"questionnaire\",\n action: `${question} validation failed`,\n label: errorMessage,\n };\n },\n },\n {\n name: \"stateQuestionAnswered\",\n type: \"unstructured\",\n makePayload: params => {\n const { context, answer, selectedCoverages } = params as ParamsType & {\n selectedCoverages?: string[];\n selectedType?: string;\n };\n\n const data: Record<string, string> = {\n vertical: context.vertical,\n selected_type: context.journeyName ?? \"usa\",\n location: window?.location?.pathname ?? \"\",\n url: window?.location?.href ?? \"\",\n state: answer,\n selection_method: \"dropdown\",\n };\n\n if (selectedCoverages?.length) {\n data.products = selectedCoverages.join(\",\");\n }\n\n return {\n schema:\n \"iglu:com.simplybusiness/state_question_answered/jsonschema/1-0-0\",\n data,\n };\n },\n },\n];\n"],
5
- "mappings": "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",
6
- "names": []
7
- }