@bash-app/bash-common 30.386.0 → 30.393.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (126) hide show
  1. package/dist/__tests__/bashSectionTitleForBashType.test.js +5 -0
  2. package/dist/__tests__/bashSectionTitleForBashType.test.js.map +1 -1
  3. package/dist/__tests__/budgetApproval.test.d.ts +2 -0
  4. package/dist/__tests__/budgetApproval.test.d.ts.map +1 -0
  5. package/dist/__tests__/budgetApproval.test.js +109 -0
  6. package/dist/__tests__/budgetApproval.test.js.map +1 -0
  7. package/dist/__tests__/crewSocialCopy.test.d.ts +2 -0
  8. package/dist/__tests__/crewSocialCopy.test.d.ts.map +1 -0
  9. package/dist/__tests__/crewSocialCopy.test.js +21 -0
  10. package/dist/__tests__/crewSocialCopy.test.js.map +1 -0
  11. package/dist/__tests__/discoveryScope.test.d.ts +2 -0
  12. package/dist/__tests__/discoveryScope.test.d.ts.map +1 -0
  13. package/dist/__tests__/discoveryScope.test.js +40 -0
  14. package/dist/__tests__/discoveryScope.test.js.map +1 -0
  15. package/dist/__tests__/scenePulse.test.d.ts +2 -0
  16. package/dist/__tests__/scenePulse.test.d.ts.map +1 -0
  17. package/dist/__tests__/scenePulse.test.js +52 -0
  18. package/dist/__tests__/scenePulse.test.js.map +1 -0
  19. package/dist/__tests__/suggestedNight.test.d.ts +2 -0
  20. package/dist/__tests__/suggestedNight.test.d.ts.map +1 -0
  21. package/dist/__tests__/suggestedNight.test.js +10 -0
  22. package/dist/__tests__/suggestedNight.test.js.map +1 -0
  23. package/dist/__tests__/suggestionScore.test.d.ts +2 -0
  24. package/dist/__tests__/suggestionScore.test.d.ts.map +1 -0
  25. package/dist/__tests__/suggestionScore.test.js +68 -0
  26. package/dist/__tests__/suggestionScore.test.js.map +1 -0
  27. package/dist/__tests__/userTaste.test.d.ts +2 -0
  28. package/dist/__tests__/userTaste.test.d.ts.map +1 -0
  29. package/dist/__tests__/userTaste.test.js +21 -0
  30. package/dist/__tests__/userTaste.test.js.map +1 -0
  31. package/dist/budgetApproval.d.ts +126 -0
  32. package/dist/budgetApproval.d.ts.map +1 -0
  33. package/dist/budgetApproval.js +161 -0
  34. package/dist/budgetApproval.js.map +1 -0
  35. package/dist/crewSocialCopy.d.ts +16 -0
  36. package/dist/crewSocialCopy.d.ts.map +1 -0
  37. package/dist/crewSocialCopy.js +23 -0
  38. package/dist/crewSocialCopy.js.map +1 -0
  39. package/dist/definitions.d.ts +6 -0
  40. package/dist/definitions.d.ts.map +1 -1
  41. package/dist/definitions.js +6 -0
  42. package/dist/definitions.js.map +1 -1
  43. package/dist/discoveryScope.d.ts +48 -0
  44. package/dist/discoveryScope.d.ts.map +1 -0
  45. package/dist/discoveryScope.js +114 -0
  46. package/dist/discoveryScope.js.map +1 -0
  47. package/dist/extendedSchemas.d.ts +7 -0
  48. package/dist/extendedSchemas.d.ts.map +1 -1
  49. package/dist/extendedSchemas.js +8 -0
  50. package/dist/extendedSchemas.js.map +1 -1
  51. package/dist/home.d.ts +6 -1
  52. package/dist/home.d.ts.map +1 -1
  53. package/dist/home.js +5 -1
  54. package/dist/home.js.map +1 -1
  55. package/dist/hostCrmCrowdPulse.d.ts +2 -0
  56. package/dist/hostCrmCrowdPulse.d.ts.map +1 -1
  57. package/dist/hostCrmCrowdPulse.js.map +1 -1
  58. package/dist/hostCrmSegments.d.ts +6 -0
  59. package/dist/hostCrmSegments.d.ts.map +1 -1
  60. package/dist/hostCrmSegments.js.map +1 -1
  61. package/dist/index.d.ts +9 -1
  62. package/dist/index.d.ts.map +1 -1
  63. package/dist/index.js +15 -2
  64. package/dist/index.js.map +1 -1
  65. package/dist/scenePulse.d.ts +66 -0
  66. package/dist/scenePulse.d.ts.map +1 -0
  67. package/dist/scenePulse.js +54 -0
  68. package/dist/scenePulse.js.map +1 -0
  69. package/dist/sms/smsTemplates.d.ts +6 -1
  70. package/dist/sms/smsTemplates.d.ts.map +1 -1
  71. package/dist/sms/smsTemplates.js +1 -0
  72. package/dist/sms/smsTemplates.js.map +1 -1
  73. package/dist/suggestedNight.d.ts +12 -0
  74. package/dist/suggestedNight.d.ts.map +1 -0
  75. package/dist/suggestedNight.js +12 -0
  76. package/dist/suggestedNight.js.map +1 -0
  77. package/dist/suggestionScore.d.ts +42 -0
  78. package/dist/suggestionScore.d.ts.map +1 -0
  79. package/dist/suggestionScore.js +100 -0
  80. package/dist/suggestionScore.js.map +1 -0
  81. package/dist/userTaste.d.ts +40 -0
  82. package/dist/userTaste.d.ts.map +1 -0
  83. package/dist/userTaste.js +103 -0
  84. package/dist/userTaste.js.map +1 -0
  85. package/dist/utils/__tests__/featuredDiscoveryGeo.test.js +9 -1
  86. package/dist/utils/__tests__/featuredDiscoveryGeo.test.js.map +1 -1
  87. package/dist/utils/featuredDiscoveryGeo.d.ts +7 -0
  88. package/dist/utils/featuredDiscoveryGeo.d.ts.map +1 -1
  89. package/dist/utils/featuredDiscoveryGeo.js +11 -0
  90. package/dist/utils/featuredDiscoveryGeo.js.map +1 -1
  91. package/dist/utils/service/__tests__/foodAndBeverageQuote.test.d.ts +2 -0
  92. package/dist/utils/service/__tests__/foodAndBeverageQuote.test.d.ts.map +1 -0
  93. package/dist/utils/service/__tests__/foodAndBeverageQuote.test.js +353 -0
  94. package/dist/utils/service/__tests__/foodAndBeverageQuote.test.js.map +1 -0
  95. package/dist/utils/service/foodAndBeverageQuote.d.ts +171 -0
  96. package/dist/utils/service/foodAndBeverageQuote.d.ts.map +1 -0
  97. package/dist/utils/service/foodAndBeverageQuote.js +467 -0
  98. package/dist/utils/service/foodAndBeverageQuote.js.map +1 -0
  99. package/package.json +1 -1
  100. package/prisma/schema.prisma +185 -53
  101. package/src/__tests__/bashSectionTitleForBashType.test.ts +10 -0
  102. package/src/__tests__/budgetApproval.test.ts +153 -0
  103. package/src/__tests__/crewSocialCopy.test.ts +25 -0
  104. package/src/__tests__/discoveryScope.test.ts +65 -0
  105. package/src/__tests__/scenePulse.test.ts +69 -0
  106. package/src/__tests__/suggestedNight.test.ts +11 -0
  107. package/src/__tests__/suggestionScore.test.ts +81 -0
  108. package/src/__tests__/userTaste.test.ts +33 -0
  109. package/src/budgetApproval.ts +303 -0
  110. package/src/crewSocialCopy.ts +37 -0
  111. package/src/definitions.ts +11 -0
  112. package/src/discoveryScope.ts +170 -0
  113. package/src/extendedSchemas.ts +8 -0
  114. package/src/home.ts +15 -0
  115. package/src/hostCrmCrowdPulse.ts +2 -0
  116. package/src/hostCrmSegments.ts +6 -0
  117. package/src/index.ts +18 -3
  118. package/src/scenePulse.ts +113 -0
  119. package/src/sms/smsTemplates.ts +6 -0
  120. package/src/suggestedNight.ts +20 -0
  121. package/src/suggestionScore.ts +140 -0
  122. package/src/userTaste.ts +152 -0
  123. package/src/utils/__tests__/featuredDiscoveryGeo.test.ts +13 -0
  124. package/src/utils/featuredDiscoveryGeo.ts +15 -0
  125. package/src/utils/service/__tests__/foodAndBeverageQuote.test.ts +502 -0
  126. package/src/utils/service/foodAndBeverageQuote.ts +613 -0
@@ -0,0 +1,103 @@
1
+ import { BashEventType } from "@prisma/client";
2
+ import { isCauseTagId } from "./causeTags.js";
3
+ import { DiscoveryScope, DISCOVERY_SCOPE_VALUES, isDiscoveryScope, } from "./discoveryScope.js";
4
+ export const UserTasteKind = {
5
+ EventType: "EventType",
6
+ CauseTag: "CauseTag",
7
+ MusicGenre: "MusicGenre",
8
+ DiscoveryScope: "DiscoveryScope",
9
+ };
10
+ export const UserTasteSource = {
11
+ Explicit: "Explicit",
12
+ Inferred: "Inferred",
13
+ };
14
+ const BASH_EVENT_TYPE_VALUES = new Set(Object.values(BashEventType));
15
+ /** Mirrors Prisma MusicGenreType — kept local so validation works without extra imports. */
16
+ export const MUSIC_GENRE_TASTE_VALUES = [
17
+ "EDM",
18
+ "Electronic",
19
+ "House",
20
+ "Techno",
21
+ "Dubstep",
22
+ "Trance",
23
+ "Pop",
24
+ "Rock",
25
+ "HipHop",
26
+ "Country",
27
+ "RnB",
28
+ "Jazz",
29
+ "Blues",
30
+ "Indie",
31
+ "Alternative",
32
+ "Folk",
33
+ "Acoustic",
34
+ "Classical",
35
+ "Opera",
36
+ "World",
37
+ "Latin",
38
+ "Experimental",
39
+ "Fusion",
40
+ "Other",
41
+ ];
42
+ const MUSIC_GENRE_SET = new Set(MUSIC_GENRE_TASTE_VALUES);
43
+ const CIVIC_EVENT_TYPES = new Set(["ChurchEvent", "SchoolEvent"]);
44
+ export function isUserTasteKind(value) {
45
+ return (value === UserTasteKind.EventType ||
46
+ value === UserTasteKind.CauseTag ||
47
+ value === UserTasteKind.MusicGenre ||
48
+ value === UserTasteKind.DiscoveryScope);
49
+ }
50
+ export function isValidTasteValue(kind, value) {
51
+ if (!value.trim())
52
+ return false;
53
+ switch (kind) {
54
+ case UserTasteKind.EventType:
55
+ return BASH_EVENT_TYPE_VALUES.has(value);
56
+ case UserTasteKind.CauseTag:
57
+ return isCauseTagId(value);
58
+ case UserTasteKind.MusicGenre:
59
+ return MUSIC_GENRE_SET.has(value);
60
+ case UserTasteKind.DiscoveryScope:
61
+ return (isDiscoveryScope(value) &&
62
+ value !== DiscoveryScope.Unspecified &&
63
+ DISCOVERY_SCOPE_VALUES.includes(value));
64
+ default:
65
+ return false;
66
+ }
67
+ }
68
+ export function isCivicEventType(eventType) {
69
+ return CIVIC_EVENT_TYPES.has(eventType);
70
+ }
71
+ /** First-screen chips — no Networking. */
72
+ export const SCENE_TASTE_CHIPS = [
73
+ { id: "festival", label: "Festivals", kind: UserTasteKind.EventType, value: "Festival" },
74
+ { id: "concert", label: "Concerts", kind: UserTasteKind.EventType, value: "Concert" },
75
+ { id: "comedy", label: "Comedy", kind: UserTasteKind.EventType, value: "ComedyShow" },
76
+ { id: "rave", label: "Raves / nightlife", kind: UserTasteKind.EventType, value: "Rave" },
77
+ { id: "fair", label: "Fairs", kind: UserTasteKind.EventType, value: "Fair" },
78
+ { id: "sports", label: "Sports", kind: UserTasteKind.EventType, value: "SportsWatchParty" },
79
+ { id: "pride", label: "Drag / Pride", kind: UserTasteKind.CauseTag, value: "lgbtq" },
80
+ { id: "arts", label: "Arts & culture", kind: UserTasteKind.CauseTag, value: "arts_culture" },
81
+ { id: "food", label: "Food", kind: UserTasteKind.EventType, value: "FestivalFood" },
82
+ { id: "outdoor", label: "Outdoor", kind: UserTasteKind.EventType, value: "OutdoorActivity" },
83
+ ];
84
+ export const TRAVEL_TASTE_CHIP = {
85
+ id: "travel",
86
+ label: "I'll travel for the right night",
87
+ kind: UserTasteKind.DiscoveryScope,
88
+ value: DiscoveryScope.National,
89
+ };
90
+ export const TRAVEL_TASTE_VALUES = [
91
+ DiscoveryScope.National,
92
+ DiscoveryScope.International,
93
+ ];
94
+ export function normalizeTasteWeight(weight) {
95
+ if (weight === 2 || weight === -1 || weight === 1)
96
+ return weight;
97
+ return 1;
98
+ }
99
+ export function userHasTravelTaste(rows) {
100
+ return rows.some((r) => r.kind === UserTasteKind.DiscoveryScope &&
101
+ TRAVEL_TASTE_VALUES.includes(r.value));
102
+ }
103
+ //# sourceMappingURL=userTaste.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"userTaste.js","sourceRoot":"","sources":["../src/userTaste.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,5 @@
1
- import { haversineMiles, effectiveFeaturedForGeoScope, sortPublicEventsForFeaturedDiscovery, } from "../featuredDiscoveryGeo.js";
1
+ import { SUGGESTION_WEIGHTS } from "../../suggestionScore.js";
2
+ import { applyFeaturedTasteMultiplier, FEATURED_TASTE_MATCH_SCORE, haversineMiles, effectiveFeaturedForGeoScope, sortPublicEventsForFeaturedDiscovery, } from "../featuredDiscoveryGeo.js";
2
3
  describe("haversineMiles", () => {
3
4
  it("returns zero for identical coordinates", () => {
4
5
  expect(haversineMiles(40.7128, -74.006, 40.7128, -74.006)).toBeCloseTo(0, 5);
@@ -95,4 +96,11 @@ describe("sortPublicEventsForFeaturedDiscovery", () => {
95
96
  ]);
96
97
  });
97
98
  });
99
+ describe("applyFeaturedTasteMultiplier", () => {
100
+ it("stays smaller than crew-going weights", () => {
101
+ expect(applyFeaturedTasteMultiplier(10, false)).toBe(10);
102
+ expect(applyFeaturedTasteMultiplier(10, true)).toBe(10.5);
103
+ expect(FEATURED_TASTE_MATCH_SCORE).toBeLessThan(SUGGESTION_WEIGHTS.connectionsGoing);
104
+ });
105
+ });
98
106
  //# sourceMappingURL=featuredDiscoveryGeo.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"featuredDiscoveryGeo.test.js","sourceRoot":"","sources":["../../../src/utils/__tests__/featuredDiscoveryGeo.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"featuredDiscoveryGeo.test.js","sourceRoot":"","sources":["../../../src/utils/__tests__/featuredDiscoveryGeo.test.ts"],"names":[],"mappings":"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"}
@@ -27,4 +27,11 @@ export type EventWithFeaturedAndCoords = {
27
27
  * Sort: effective featured (in geo scope if viewer set) first, then by startDateTime.
28
28
  */
29
29
  export declare function sortPublicEventsForFeaturedDiscovery<T extends EventWithFeaturedAndCoords>(events: T[], viewer: ViewerGeoScope | undefined): T[];
30
+ /**
31
+ * Paid featuring × taste overlap. Must stay smaller than any crew-going
32
+ * boost (`SUGGESTION_WEIGHTS.connectionsGoing` / followed / attended host).
33
+ */
34
+ export declare const FEATURED_TASTE_MATCH_MULTIPLIER = 1.05;
35
+ export declare const FEATURED_TASTE_MATCH_SCORE = 1;
36
+ export declare function applyFeaturedTasteMultiplier(featuredScore: number, tasteOverlaps: boolean): number;
30
37
  //# sourceMappingURL=featuredDiscoveryGeo.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"featuredDiscoveryGeo.d.ts","sourceRoot":"","sources":["../../src/utils/featuredDiscoveryGeo.ts"],"names":[],"mappings":"AAAA,qFAAqF;AACrF,eAAO,MAAM,6BAA6B,MAAM,CAAC;AAEjD;;GAEG;AACH,wBAAgB,cAAc,CAC5B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,GACX,MAAM,CAYR;AAED,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,4BAA4B,CAC1C,UAAU,EAAE,OAAO,EACnB,WAAW,EAAE,KAAK,CAAC;IAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC,GAAG,IAAI,GAAG,SAAS,EACjF,MAAM,EAAE,cAAc,GAAG,SAAS,GACjC,OAAO,CAOT;AAED,MAAM,MAAM,0BAA0B,GAAG;IACvC,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,OAAO,GAAG,IAAI,CAAC;IAC3B,aAAa,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IAC5B,aAAa,EAAE,IAAI,GAAG,MAAM,GAAG,IAAI,CAAC;IACpC,WAAW,CAAC,EAAE,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC,GAAG,IAAI,CAAC;CACxE,CAAC;AAEF;;GAEG;AACH,wBAAgB,oCAAoC,CAClD,CAAC,SAAS,0BAA0B,EACpC,MAAM,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,cAAc,GAAG,SAAS,GAAG,CAAC,EAAE,CAiBtD"}
1
+ {"version":3,"file":"featuredDiscoveryGeo.d.ts","sourceRoot":"","sources":["../../src/utils/featuredDiscoveryGeo.ts"],"names":[],"mappings":"AAAA,qFAAqF;AACrF,eAAO,MAAM,6BAA6B,MAAM,CAAC;AAEjD;;GAEG;AACH,wBAAgB,cAAc,CAC5B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,GACX,MAAM,CAYR;AAED,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,4BAA4B,CAC1C,UAAU,EAAE,OAAO,EACnB,WAAW,EAAE,KAAK,CAAC;IAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC,GAAG,IAAI,GAAG,SAAS,EACjF,MAAM,EAAE,cAAc,GAAG,SAAS,GACjC,OAAO,CAOT;AAED,MAAM,MAAM,0BAA0B,GAAG;IACvC,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,OAAO,GAAG,IAAI,CAAC;IAC3B,aAAa,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IAC5B,aAAa,EAAE,IAAI,GAAG,MAAM,GAAG,IAAI,CAAC;IACpC,WAAW,CAAC,EAAE,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC,GAAG,IAAI,CAAC;CACxE,CAAC;AAEF;;GAEG;AACH,wBAAgB,oCAAoC,CAClD,CAAC,SAAS,0BAA0B,EACpC,MAAM,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,cAAc,GAAG,SAAS,GAAG,CAAC,EAAE,CAiBtD;AAED;;;GAGG;AACH,eAAO,MAAM,+BAA+B,OAAO,CAAC;AACpD,eAAO,MAAM,0BAA0B,IAAI,CAAC;AAE5C,wBAAgB,4BAA4B,CAC1C,aAAa,EAAE,MAAM,EACrB,aAAa,EAAE,OAAO,GACrB,MAAM,CAGR"}
@@ -44,4 +44,15 @@ export function sortPublicEventsForFeaturedDiscovery(events, viewer) {
44
44
  });
45
45
  return withKeys.map((x) => x.e);
46
46
  }
47
+ /**
48
+ * Paid featuring × taste overlap. Must stay smaller than any crew-going
49
+ * boost (`SUGGESTION_WEIGHTS.connectionsGoing` / followed / attended host).
50
+ */
51
+ export const FEATURED_TASTE_MATCH_MULTIPLIER = 1.05;
52
+ export const FEATURED_TASTE_MATCH_SCORE = 1;
53
+ export function applyFeaturedTasteMultiplier(featuredScore, tasteOverlaps) {
54
+ if (!tasteOverlaps)
55
+ return featuredScore;
56
+ return featuredScore * FEATURED_TASTE_MATCH_MULTIPLIER;
57
+ }
47
58
  //# sourceMappingURL=featuredDiscoveryGeo.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"featuredDiscoveryGeo.js","sourceRoot":"","sources":["../../src/utils/featuredDiscoveryGeo.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"featuredDiscoveryGeo.js","sourceRoot":"","sources":["../../src/utils/featuredDiscoveryGeo.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=foodAndBeverageQuote.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"foodAndBeverageQuote.test.d.ts","sourceRoot":"","sources":["../../../../src/utils/service/__tests__/foodAndBeverageQuote.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,353 @@
1
+ import { CELEBRATION_CAKE_FLAVORS, EVENT_SERVICE_FULFILLMENT_MODES, celebrationCakeStartingPriceLabel, encodeCakeOption, filterCelebrationCakeFulfillmentModes, filterFulfillmentModes, foodAndBeverageLeadTimeLabel, foodAndBeverageQuoteCents, foodAndBeverageRateSummary, getFoodAndBeverageMenuCategories, isBelowGuestMinimum, GRAZING_TABLE_STYLES, encodeGrazingOption, grazingTableStartingPriceLabel, isCelebrationCakeEventService, isCelebrationCakeFulfillmentMode, isFoodAndBeverageEventService, isFulfillmentMode, isGrazingTableEventService, isOfficiantEventService, isPackagePricedFoodEventService, isPerGuestFoodAndBeverageEventService, packagePricedFoodStartingPriceLabel, parseCakeOptions, parseGrazingOptions, quotedGuestCount, serializeCakeOptions, serializeGrazingOptions, } from "../foodAndBeverageQuote.js";
2
+ describe("isFoodAndBeverageEventService", () => {
3
+ it("returns true for FoodAndBeverage eventServiceType", () => {
4
+ expect(isFoodAndBeverageEventService({ eventServiceType: "FoodAndBeverage" })).toBe(true);
5
+ });
6
+ it("returns true for canonical subtype even without eventServiceType", () => {
7
+ expect(isFoodAndBeverageEventService({ eventServiceSubType: "Caterer" })).toBe(true);
8
+ expect(isFoodAndBeverageEventService({ eventServiceSubType: "DessertBar" })).toBe(true);
9
+ expect(isFoodAndBeverageEventService({ eventServiceSubType: "CelebrationCake" })).toBe(true);
10
+ expect(isFoodAndBeverageEventService({ eventServiceSubType: "GrazingTable" })).toBe(true);
11
+ });
12
+ it("returns true for legacy/alias subtypes", () => {
13
+ expect(isFoodAndBeverageEventService({ eventServiceSubType: "PrivateChef" })).toBe(true);
14
+ expect(isFoodAndBeverageEventService({ eventServiceSubType: "Bartender" })).toBe(true);
15
+ });
16
+ it("returns false for unrelated types", () => {
17
+ expect(isFoodAndBeverageEventService({ eventServiceType: "EventPlanningAndManagement" })).toBe(false);
18
+ expect(isFoodAndBeverageEventService({ eventServiceSubType: "EventPlanner" })).toBe(false);
19
+ });
20
+ it("returns false when both are null/undefined", () => {
21
+ expect(isFoodAndBeverageEventService({})).toBe(false);
22
+ expect(isFoodAndBeverageEventService({ eventServiceType: null, eventServiceSubType: null })).toBe(false);
23
+ });
24
+ });
25
+ describe("EVENT_SERVICE_FULFILLMENT_MODES", () => {
26
+ it("contains Pickup, Delivery, and FullService", () => {
27
+ expect(EVENT_SERVICE_FULFILLMENT_MODES).toContain("Pickup");
28
+ expect(EVENT_SERVICE_FULFILLMENT_MODES).toContain("Delivery");
29
+ expect(EVENT_SERVICE_FULFILLMENT_MODES).toContain("FullService");
30
+ expect(EVENT_SERVICE_FULFILLMENT_MODES).toHaveLength(3);
31
+ });
32
+ });
33
+ describe("getFoodAndBeverageMenuCategories", () => {
34
+ it("returns Caterer chips for Caterer subtype", () => {
35
+ const chips = getFoodAndBeverageMenuCategories("Caterer");
36
+ expect(chips).toContain("Salads");
37
+ expect(chips).toContain("Mains");
38
+ expect(chips).toContain("Sides");
39
+ });
40
+ it("returns DessertBar chips for DessertBar subtype", () => {
41
+ const chips = getFoodAndBeverageMenuCategories("DessertBar");
42
+ expect(chips).toContain("Cakes");
43
+ expect(chips).toContain("Cupcakes");
44
+ });
45
+ it("falls back to generic chips for unknown subtypes", () => {
46
+ const chips = getFoodAndBeverageMenuCategories("SomeUnknownType");
47
+ expect(chips.length).toBeGreaterThan(0);
48
+ expect(chips).toContain("Mains");
49
+ });
50
+ it("returns generic chips for null subtype", () => {
51
+ const chips = getFoodAndBeverageMenuCategories(null);
52
+ expect(chips.length).toBeGreaterThan(0);
53
+ });
54
+ });
55
+ describe("quotedGuestCount", () => {
56
+ it("returns headcount when no minimum is set", () => {
57
+ expect(quotedGuestCount(80)).toBe(80);
58
+ expect(quotedGuestCount(80, null)).toBe(80);
59
+ expect(quotedGuestCount(80, 0)).toBe(80);
60
+ });
61
+ it("returns headcount when above minimum", () => {
62
+ expect(quotedGuestCount(80, 25)).toBe(80);
63
+ });
64
+ it("floors to minimum when headcount is below", () => {
65
+ expect(quotedGuestCount(10, 25)).toBe(25);
66
+ expect(quotedGuestCount(0, 25)).toBe(25);
67
+ });
68
+ it("returns minimum exactly when headcount equals minimum", () => {
69
+ expect(quotedGuestCount(25, 25)).toBe(25);
70
+ });
71
+ it("never returns a negative count", () => {
72
+ expect(quotedGuestCount(-5)).toBe(0);
73
+ });
74
+ });
75
+ describe("foodAndBeverageQuoteCents", () => {
76
+ it("calculates basic per-guest price", () => {
77
+ // $18/guest × 100 guests = $1,800
78
+ expect(foodAndBeverageQuoteCents({ baseRateCents: 1800, headcount: 100 })).toBe(180000);
79
+ });
80
+ it("floors headcount at minimumQuantity", () => {
81
+ // $18/guest × min 25 guests; host enters 10 → billed for 25
82
+ expect(foodAndBeverageQuoteCents({
83
+ baseRateCents: 1800,
84
+ headcount: 10,
85
+ minimumQuantity: 25,
86
+ })).toBe(1800 * 25);
87
+ });
88
+ it("does not floor when headcount is above minimum", () => {
89
+ expect(foodAndBeverageQuoteCents({
90
+ baseRateCents: 1800,
91
+ headcount: 80,
92
+ minimumQuantity: 25,
93
+ })).toBe(1800 * 80);
94
+ });
95
+ it("applies minimumChargeCents dollar floor after guest floor", () => {
96
+ // $8/guest × 25 guests (floored from 5) = $200. Min charge $500 → $500.
97
+ expect(foodAndBeverageQuoteCents({
98
+ baseRateCents: 800,
99
+ headcount: 5,
100
+ minimumQuantity: 25,
101
+ minimumChargeCents: 50000,
102
+ })).toBe(50000);
103
+ });
104
+ it("dollar floor does not fire when rate total already exceeds it", () => {
105
+ // $18/guest × 50 guests = $900 > $500 min charge
106
+ expect(foodAndBeverageQuoteCents({
107
+ baseRateCents: 1800,
108
+ headcount: 50,
109
+ minimumQuantity: 25,
110
+ minimumChargeCents: 50000,
111
+ })).toBe(1800 * 50);
112
+ });
113
+ it("returns 0 for zero baseRate", () => {
114
+ expect(foodAndBeverageQuoteCents({ baseRateCents: 0, headcount: 100 })).toBe(0);
115
+ });
116
+ it("returns 0 for negative headcount", () => {
117
+ expect(foodAndBeverageQuoteCents({ baseRateCents: 1800, headcount: -1 })).toBe(0);
118
+ });
119
+ });
120
+ describe("foodAndBeverageRateSummary", () => {
121
+ it("formats without a minimum", () => {
122
+ const result = foodAndBeverageRateSummary(1800);
123
+ expect(result).toBe("$18 / guest");
124
+ });
125
+ it("formats with a minimum", () => {
126
+ const result = foodAndBeverageRateSummary(1800, 25);
127
+ expect(result).toBe("$18 / guest · min 25 guests");
128
+ });
129
+ it("formats cents correctly", () => {
130
+ const result = foodAndBeverageRateSummary(1850);
131
+ expect(result).toBe("$18.50 / guest");
132
+ });
133
+ });
134
+ describe("foodAndBeverageLeadTimeLabel", () => {
135
+ it("returns null for falsy inputs", () => {
136
+ expect(foodAndBeverageLeadTimeLabel(null)).toBeNull();
137
+ expect(foodAndBeverageLeadTimeLabel(0)).toBeNull();
138
+ expect(foodAndBeverageLeadTimeLabel(undefined)).toBeNull();
139
+ });
140
+ it("formats days when not divisible by 7", () => {
141
+ expect(foodAndBeverageLeadTimeLabel(1)).toBe("Needs 1 day notice");
142
+ expect(foodAndBeverageLeadTimeLabel(5)).toBe("Needs 5 days notice");
143
+ expect(foodAndBeverageLeadTimeLabel(10)).toBe("Needs 10 days notice");
144
+ });
145
+ it("formats weeks when divisible by 7", () => {
146
+ expect(foodAndBeverageLeadTimeLabel(7)).toBe("Needs 1 week notice");
147
+ expect(foodAndBeverageLeadTimeLabel(14)).toBe("Needs 2 weeks notice");
148
+ });
149
+ });
150
+ describe("package-priced food detection", () => {
151
+ it("treats cake and grazing as package-priced, not per-guest", () => {
152
+ expect(isPackagePricedFoodEventService({ eventServiceSubType: "CelebrationCake" })).toBe(true);
153
+ expect(isPackagePricedFoodEventService({ eventServiceSubType: "GrazingTable" })).toBe(true);
154
+ expect(isPackagePricedFoodEventService({ eventServiceSubType: "Caterer" })).toBe(false);
155
+ expect(isPackagePricedFoodEventService({})).toBe(false);
156
+ });
157
+ it("isPerGuestFoodAndBeverage is false for cake and grazing", () => {
158
+ expect(isPerGuestFoodAndBeverageEventService({
159
+ eventServiceType: "FoodAndBeverage",
160
+ eventServiceSubType: "CelebrationCake",
161
+ })).toBe(false);
162
+ expect(isPerGuestFoodAndBeverageEventService({
163
+ eventServiceType: "FoodAndBeverage",
164
+ eventServiceSubType: "GrazingTable",
165
+ })).toBe(false);
166
+ expect(isPerGuestFoodAndBeverageEventService({
167
+ eventServiceType: "FoodAndBeverage",
168
+ eventServiceSubType: "Caterer",
169
+ })).toBe(true);
170
+ });
171
+ it("isGrazingTableEventService is true only for GrazingTable", () => {
172
+ expect(isGrazingTableEventService({ eventServiceSubType: "GrazingTable" })).toBe(true);
173
+ expect(isGrazingTableEventService({ eventServiceSubType: "CelebrationCake" })).toBe(false);
174
+ expect(isGrazingTableEventService({})).toBe(false);
175
+ });
176
+ it("isOfficiantEventService is true only for Officiant", () => {
177
+ expect(isOfficiantEventService({ eventServiceSubType: "Officiant" })).toBe(true);
178
+ expect(isOfficiantEventService({ eventServiceSubType: "HostingSupportOther" })).toBe(false);
179
+ expect(isFoodAndBeverageEventService({ eventServiceSubType: "Officiant" })).toBe(false);
180
+ });
181
+ });
182
+ describe("isCelebrationCakeEventService", () => {
183
+ it("returns true only for CelebrationCake", () => {
184
+ expect(isCelebrationCakeEventService({ eventServiceSubType: "CelebrationCake" })).toBe(true);
185
+ expect(isCelebrationCakeEventService({ eventServiceSubType: "Caterer" })).toBe(false);
186
+ expect(isCelebrationCakeEventService({ eventServiceSubType: "DessertBar" })).toBe(false);
187
+ expect(isCelebrationCakeEventService({})).toBe(false);
188
+ expect(isCelebrationCakeEventService({ eventServiceSubType: null })).toBe(false);
189
+ });
190
+ });
191
+ describe("parseCakeOptions", () => {
192
+ it("returns empty groups for null or empty input", () => {
193
+ expect(parseCakeOptions(null)).toEqual({
194
+ flavors: [],
195
+ frostings: [],
196
+ fillings: [],
197
+ dietary: [],
198
+ other: [],
199
+ });
200
+ expect(parseCakeOptions([])).toEqual({
201
+ flavors: [],
202
+ frostings: [],
203
+ fillings: [],
204
+ dietary: [],
205
+ other: [],
206
+ });
207
+ });
208
+ it("splits prefixed chips and keeps unprefixed leftovers", () => {
209
+ const parsed = parseCakeOptions([
210
+ "flavor:Red Velvet",
211
+ "frosting:Chocolate Buttercream",
212
+ "filling:Lemon Custard",
213
+ "dietary:Gluten-Free",
214
+ "Desserts",
215
+ ]);
216
+ expect(parsed.flavors).toEqual(["Red Velvet"]);
217
+ expect(parsed.frostings).toEqual(["Chocolate Buttercream"]);
218
+ expect(parsed.fillings).toEqual(["Lemon Custard"]);
219
+ expect(parsed.dietary).toEqual(["Gluten-Free"]);
220
+ expect(parsed.other).toEqual(["Desserts"]);
221
+ });
222
+ it("round-trips through serializeCakeOptions", () => {
223
+ const serialized = serializeCakeOptions({
224
+ flavors: ["Vanilla", "Chocolate"],
225
+ frostings: ["Fondant"],
226
+ fillings: [],
227
+ dietary: ["Vegan"],
228
+ });
229
+ expect(serialized).toEqual([
230
+ "flavor:Vanilla",
231
+ "flavor:Chocolate",
232
+ "frosting:Fondant",
233
+ "dietary:Vegan",
234
+ ]);
235
+ expect(parseCakeOptions(serialized)).toEqual({
236
+ flavors: ["Vanilla", "Chocolate"],
237
+ frostings: ["Fondant"],
238
+ fillings: [],
239
+ dietary: ["Vegan"],
240
+ other: [],
241
+ });
242
+ });
243
+ it("encodeCakeOption uses lowercase prefixes", () => {
244
+ expect(encodeCakeOption("flavor", "Red Velvet")).toBe("flavor:Red Velvet");
245
+ expect(CELEBRATION_CAKE_FLAVORS).toContain("Red Velvet");
246
+ });
247
+ });
248
+ describe("celebrationCakeStartingPriceLabel", () => {
249
+ it("returns null when there is no starting price", () => {
250
+ expect(celebrationCakeStartingPriceLabel(null)).toBeNull();
251
+ expect(celebrationCakeStartingPriceLabel(0)).toBeNull();
252
+ });
253
+ it("formats whole-dollar starting prices", () => {
254
+ expect(celebrationCakeStartingPriceLabel(35000)).toBe("Cakes start at $350");
255
+ });
256
+ });
257
+ describe("grazing options", () => {
258
+ it("returns empty groups for null or empty input", () => {
259
+ expect(parseGrazingOptions(null)).toEqual({
260
+ styles: [],
261
+ proteins: [],
262
+ dietary: [],
263
+ other: [],
264
+ });
265
+ expect(parseGrazingOptions([])).toEqual({
266
+ styles: [],
267
+ proteins: [],
268
+ dietary: [],
269
+ other: [],
270
+ });
271
+ });
272
+ it("splits prefixed chips and keeps unprefixed leftovers", () => {
273
+ const parsed = parseGrazingOptions([
274
+ "style:Classic Charcuterie",
275
+ "protein:Cured Meats",
276
+ "dietary:Gluten-Free",
277
+ "Mains",
278
+ ]);
279
+ expect(parsed.styles).toEqual(["Classic Charcuterie"]);
280
+ expect(parsed.proteins).toEqual(["Cured Meats"]);
281
+ expect(parsed.dietary).toEqual(["Gluten-Free"]);
282
+ expect(parsed.other).toEqual(["Mains"]);
283
+ });
284
+ it("round-trips through serializeGrazingOptions", () => {
285
+ const serialized = serializeGrazingOptions({
286
+ styles: ["Modern Grazing"],
287
+ proteins: ["Artisan Cheeses"],
288
+ dietary: ["Vegan"],
289
+ });
290
+ expect(serialized).toEqual([
291
+ "style:Modern Grazing",
292
+ "protein:Artisan Cheeses",
293
+ "dietary:Vegan",
294
+ ]);
295
+ expect(parseGrazingOptions(serialized)).toEqual({
296
+ styles: ["Modern Grazing"],
297
+ proteins: ["Artisan Cheeses"],
298
+ dietary: ["Vegan"],
299
+ other: [],
300
+ });
301
+ });
302
+ it("encodeGrazingOption uses lowercase prefixes", () => {
303
+ expect(encodeGrazingOption("style", "Seasonal")).toBe("style:Seasonal");
304
+ expect(GRAZING_TABLE_STYLES).toContain("Classic Charcuterie");
305
+ });
306
+ });
307
+ describe("grazing and package starting-price labels", () => {
308
+ it("formats grazing starting prices", () => {
309
+ expect(grazingTableStartingPriceLabel(null)).toBeNull();
310
+ expect(grazingTableStartingPriceLabel(17500)).toBe("Boards start at $175");
311
+ });
312
+ it("delegates packagePricedFoodStartingPriceLabel by subtype", () => {
313
+ expect(packagePricedFoodStartingPriceLabel("GrazingTable", 17500)).toBe("Boards start at $175");
314
+ expect(packagePricedFoodStartingPriceLabel("CelebrationCake", 35000)).toBe("Cakes start at $350");
315
+ expect(packagePricedFoodStartingPriceLabel("Caterer", 35000)).toBeNull();
316
+ });
317
+ });
318
+ describe("isBelowGuestMinimum", () => {
319
+ it("returns false when no minimum is set", () => {
320
+ expect(isBelowGuestMinimum(5)).toBe(false);
321
+ expect(isBelowGuestMinimum(5, null)).toBe(false);
322
+ expect(isBelowGuestMinimum(5, 0)).toBe(false);
323
+ });
324
+ it("returns true when below minimum", () => {
325
+ expect(isBelowGuestMinimum(10, 25)).toBe(true);
326
+ });
327
+ it("returns false when exactly at minimum", () => {
328
+ expect(isBelowGuestMinimum(25, 25)).toBe(false);
329
+ });
330
+ it("returns false when above minimum", () => {
331
+ expect(isBelowGuestMinimum(100, 25)).toBe(false);
332
+ });
333
+ });
334
+ describe("fulfillment mode filters", () => {
335
+ it("keeps known F&B modes and drops unknowns", () => {
336
+ expect(isFulfillmentMode("Pickup")).toBe(true);
337
+ expect(isFulfillmentMode("FullService")).toBe(true);
338
+ expect(isFulfillmentMode("Curbside")).toBe(false);
339
+ expect(filterFulfillmentModes(["Pickup", "Curbside", "Delivery", "FullService"])).toEqual(["Pickup", "Delivery", "FullService"]);
340
+ expect(filterFulfillmentModes(null)).toEqual([]);
341
+ });
342
+ it("keeps cake pickup/delivery only", () => {
343
+ expect(isCelebrationCakeFulfillmentMode("Pickup")).toBe(true);
344
+ expect(isCelebrationCakeFulfillmentMode("FullService")).toBe(false);
345
+ expect(filterCelebrationCakeFulfillmentModes([
346
+ "Pickup",
347
+ "FullService",
348
+ "Delivery",
349
+ ])).toEqual(["Pickup", "Delivery"]);
350
+ expect(filterCelebrationCakeFulfillmentModes(undefined)).toEqual([]);
351
+ });
352
+ });
353
+ //# sourceMappingURL=foodAndBeverageQuote.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"foodAndBeverageQuote.test.js","sourceRoot":"","sources":["../../../../src/utils/service/__tests__/foodAndBeverageQuote.test.ts"],"names":[],"mappings":"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"}