@bash-app/bash-common 30.331.0 → 30.334.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 (59) hide show
  1. package/dist/__tests__/causeTags.test.d.ts +2 -0
  2. package/dist/__tests__/causeTags.test.d.ts.map +1 -0
  3. package/dist/__tests__/causeTags.test.js +94 -0
  4. package/dist/__tests__/causeTags.test.js.map +1 -0
  5. package/dist/__tests__/definitionsHelpers.test.js +6 -2
  6. package/dist/__tests__/definitionsHelpers.test.js.map +1 -1
  7. package/dist/__tests__/hostCrmGrowthPack.test.js +12 -2
  8. package/dist/__tests__/hostCrmGrowthPack.test.js.map +1 -1
  9. package/dist/__tests__/hostPromoter.test.d.ts +2 -0
  10. package/dist/__tests__/hostPromoter.test.d.ts.map +1 -0
  11. package/dist/__tests__/hostPromoter.test.js +79 -0
  12. package/dist/__tests__/hostPromoter.test.js.map +1 -0
  13. package/dist/causeTags.d.ts +42 -0
  14. package/dist/causeTags.d.ts.map +1 -0
  15. package/dist/causeTags.js +173 -0
  16. package/dist/causeTags.js.map +1 -0
  17. package/dist/definitions.d.ts +38 -5
  18. package/dist/definitions.d.ts.map +1 -1
  19. package/dist/definitions.js +47 -7
  20. package/dist/definitions.js.map +1 -1
  21. package/dist/hostCrmAutomation.d.ts +12 -2
  22. package/dist/hostCrmAutomation.d.ts.map +1 -1
  23. package/dist/hostCrmAutomation.js +16 -2
  24. package/dist/hostCrmAutomation.js.map +1 -1
  25. package/dist/index.d.ts +2 -0
  26. package/dist/index.d.ts.map +1 -1
  27. package/dist/index.js +2 -0
  28. package/dist/index.js.map +1 -1
  29. package/dist/sms/smsTemplates.d.ts +6 -1
  30. package/dist/sms/smsTemplates.d.ts.map +1 -1
  31. package/dist/sms/smsTemplates.js +1 -0
  32. package/dist/sms/smsTemplates.js.map +1 -1
  33. package/dist/utils/__tests__/coatCheckUtils.test.d.ts +2 -0
  34. package/dist/utils/__tests__/coatCheckUtils.test.d.ts.map +1 -0
  35. package/dist/utils/__tests__/coatCheckUtils.test.js +76 -0
  36. package/dist/utils/__tests__/coatCheckUtils.test.js.map +1 -0
  37. package/dist/utils/coatCheckUtils.d.ts +30 -0
  38. package/dist/utils/coatCheckUtils.d.ts.map +1 -0
  39. package/dist/utils/coatCheckUtils.js +85 -0
  40. package/dist/utils/coatCheckUtils.js.map +1 -0
  41. package/dist/utils/slugUtils.d.ts +3 -4
  42. package/dist/utils/slugUtils.d.ts.map +1 -1
  43. package/dist/utils/slugUtils.js +3 -4
  44. package/dist/utils/slugUtils.js.map +1 -1
  45. package/package.json +1 -1
  46. package/prisma/COMPREHENSIVE-MIGRATION-README.md +1 -1
  47. package/prisma/schema.prisma +431 -3
  48. package/src/__tests__/causeTags.test.ts +143 -0
  49. package/src/__tests__/definitionsHelpers.test.ts +11 -1
  50. package/src/__tests__/hostCrmGrowthPack.test.ts +14 -1
  51. package/src/__tests__/hostPromoter.test.ts +133 -0
  52. package/src/causeTags.ts +243 -0
  53. package/src/definitions.ts +77 -14
  54. package/src/hostCrmAutomation.ts +25 -2
  55. package/src/index.ts +2 -0
  56. package/src/sms/smsTemplates.ts +6 -0
  57. package/src/utils/__tests__/coatCheckUtils.test.ts +110 -0
  58. package/src/utils/coatCheckUtils.ts +134 -0
  59. package/src/utils/slugUtils.ts +3 -4
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=causeTags.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"causeTags.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/causeTags.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,94 @@
1
+ import { causeTagIdsMatchingSearch, causeTagLabels, causeTagsMatchSearch, normalizeCauseTags, resolveDonationCauseLabel, validateBashDonationCauseFields, } from "../causeTags";
2
+ describe("causeTags", () => {
3
+ describe("normalizeCauseTags", () => {
4
+ it("drops unknown ids and dedupes", () => {
5
+ expect(normalizeCauseTags(["lgbtq", "nope", "lgbtq", "mutual_aid"])).toEqual(["lgbtq", "mutual_aid"]);
6
+ });
7
+ it("handles empty input", () => {
8
+ expect(normalizeCauseTags(undefined)).toEqual([]);
9
+ expect(normalizeCauseTags(null)).toEqual([]);
10
+ expect(normalizeCauseTags([])).toEqual([]);
11
+ });
12
+ });
13
+ describe("causeTagLabels", () => {
14
+ it("maps known ids to labels", () => {
15
+ expect(causeTagLabels(["lgbtq", "fundraiser"])).toEqual([
16
+ "LGBTQ+",
17
+ "Fundraiser",
18
+ ]);
19
+ });
20
+ });
21
+ describe("causeTagIdsMatchingSearch", () => {
22
+ it("returns empty for blank query", () => {
23
+ expect(causeTagIdsMatchingSearch("")).toEqual([]);
24
+ expect(causeTagIdsMatchingSearch(" ")).toEqual([]);
25
+ });
26
+ it("matches by label substring", () => {
27
+ expect(causeTagIdsMatchingSearch("mutual")).toContain("mutual_aid");
28
+ expect(causeTagIdsMatchingSearch("LGBTQ")).toContain("lgbtq");
29
+ expect(causeTagIdsMatchingSearch("music")).toContain("music_scene");
30
+ });
31
+ it("matches by id / spaced id", () => {
32
+ expect(causeTagIdsMatchingSearch("mental_health")).toContain("mental_health");
33
+ expect(causeTagIdsMatchingSearch("mental health")).toContain("mental_health");
34
+ });
35
+ });
36
+ describe("causeTagsMatchSearch", () => {
37
+ it("is false when entity has no matching tags", () => {
38
+ expect(causeTagsMatchSearch(["neighborhood"], "lgbtq")).toBe(false);
39
+ expect(causeTagsMatchSearch([], "mutual")).toBe(false);
40
+ expect(causeTagsMatchSearch(undefined, "mutual")).toBe(false);
41
+ });
42
+ it("is true when a selected tag matches the query", () => {
43
+ expect(causeTagsMatchSearch(["lgbtq", "arts_culture"], "queer")).toBe(false);
44
+ expect(causeTagsMatchSearch(["lgbtq", "arts_culture"], "lgbtq")).toBe(true);
45
+ expect(causeTagsMatchSearch(["mutual_aid"], "mutual aid")).toBe(true);
46
+ });
47
+ });
48
+ describe("resolveDonationCauseLabel", () => {
49
+ it("prefers curated tag label over free text", () => {
50
+ expect(resolveDonationCauseLabel({
51
+ donationCauseTagId: "mutual_aid",
52
+ donationCauseLabel: "Something else",
53
+ })).toBe("Mutual aid");
54
+ });
55
+ it("falls back to free-text label", () => {
56
+ expect(resolveDonationCauseLabel({
57
+ donationCauseTagId: null,
58
+ donationCauseLabel: " Local food bank ",
59
+ })).toBe("Local food bank");
60
+ });
61
+ });
62
+ describe("validateBashDonationCauseFields", () => {
63
+ it("accepts empty / unset fields", () => {
64
+ expect(validateBashDonationCauseFields({})).toBeNull();
65
+ expect(validateBashDonationCauseFields({
66
+ donationGoalCents: null,
67
+ donationCausePercent: null,
68
+ })).toBeNull();
69
+ });
70
+ it("rejects non-positive goals", () => {
71
+ expect(validateBashDonationCauseFields({ donationGoalCents: 0 })).toBe("invalid_goal");
72
+ expect(validateBashDonationCauseFields({ donationGoalCents: -1 })).toBe("invalid_goal");
73
+ });
74
+ it("rejects percent without a cause", () => {
75
+ expect(validateBashDonationCauseFields({ donationCausePercent: 80 })).toBe("percent_requires_cause");
76
+ });
77
+ it("accepts percent with tag or label", () => {
78
+ expect(validateBashDonationCauseFields({
79
+ donationCausePercent: 80,
80
+ donationCauseTagId: "mutual_aid",
81
+ })).toBeNull();
82
+ expect(validateBashDonationCauseFields({
83
+ donationCausePercent: 100,
84
+ donationCauseLabel: "Food bank",
85
+ })).toBeNull();
86
+ });
87
+ it("rejects invalid tag ids", () => {
88
+ expect(validateBashDonationCauseFields({
89
+ donationCauseTagId: "not_a_real_tag",
90
+ })).toBe("invalid_cause_tag");
91
+ });
92
+ });
93
+ });
94
+ //# sourceMappingURL=causeTags.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"causeTags.test.js","sourceRoot":"","sources":["../../src/__tests__/causeTags.test.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,yBAAyB,EACzB,cAAc,EACd,oBAAoB,EACpB,kBAAkB,EAClB,yBAAyB,EACzB,+BAA+B,GAChC,MAAM,cAAc,CAAC;AAEtB,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE;IACzB,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;QAClC,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;YACvC,MAAM,CACJ,kBAAkB,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC,CAC7D,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC;QACrC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qBAAqB,EAAE,GAAG,EAAE;YAC7B,MAAM,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YAClD,MAAM,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YAC7C,MAAM,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;QAC9B,EAAE,CAAC,0BAA0B,EAAE,GAAG,EAAE;YAClC,MAAM,CAAC,cAAc,CAAC,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;gBACtD,QAAQ;gBACR,YAAY;aACb,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACzC,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;YACvC,MAAM,CAAC,yBAAyB,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YAClD,MAAM,CAAC,yBAAyB,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACvD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;YACpC,MAAM,CAAC,yBAAyB,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;YACpE,MAAM,CAAC,yBAAyB,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;YAC9D,MAAM,CAAC,yBAAyB,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;QACtE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;YACnC,MAAM,CAAC,yBAAyB,CAAC,eAAe,CAAC,CAAC,CAAC,SAAS,CAC1D,eAAe,CAChB,CAAC;YACF,MAAM,CAAC,yBAAyB,CAAC,eAAe,CAAC,CAAC,CAAC,SAAS,CAC1D,eAAe,CAChB,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;QACpC,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;YACnD,MAAM,CAAC,oBAAoB,CAAC,CAAC,cAAc,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACpE,MAAM,CAAC,oBAAoB,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACvD,MAAM,CAAC,oBAAoB,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAChE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;YACvD,MAAM,CAAC,oBAAoB,CAAC,CAAC,OAAO,EAAE,cAAc,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CACnE,KAAK,CACN,CAAC;YACF,MAAM,CAAC,oBAAoB,CAAC,CAAC,OAAO,EAAE,cAAc,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CACnE,IAAI,CACL,CAAC;YACF,MAAM,CAAC,oBAAoB,CAAC,CAAC,YAAY,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxE,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACzC,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;YAClD,MAAM,CACJ,yBAAyB,CAAC;gBACxB,kBAAkB,EAAE,YAAY;gBAChC,kBAAkB,EAAE,gBAAgB;aACrC,CAAC,CACH,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACvB,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;YACvC,MAAM,CACJ,yBAAyB,CAAC;gBACxB,kBAAkB,EAAE,IAAI;gBACxB,kBAAkB,EAAE,mBAAmB;aACxC,CAAC,CACH,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAC5B,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,iCAAiC,EAAE,GAAG,EAAE;QAC/C,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;YACtC,MAAM,CAAC,+BAA+B,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;YACvD,MAAM,CACJ,+BAA+B,CAAC;gBAC9B,iBAAiB,EAAE,IAAI;gBACvB,oBAAoB,EAAE,IAAI;aAC3B,CAAC,CACH,CAAC,QAAQ,EAAE,CAAC;QACf,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;YACpC,MAAM,CAAC,+BAA+B,CAAC,EAAE,iBAAiB,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CACpE,cAAc,CACf,CAAC;YACF,MAAM,CAAC,+BAA+B,CAAC,EAAE,iBAAiB,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CACrE,cAAc,CACf,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;YACzC,MAAM,CACJ,+BAA+B,CAAC,EAAE,oBAAoB,EAAE,EAAE,EAAE,CAAC,CAC9D,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;QACnC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;YAC3C,MAAM,CACJ,+BAA+B,CAAC;gBAC9B,oBAAoB,EAAE,EAAE;gBACxB,kBAAkB,EAAE,YAAY;aACjC,CAAC,CACH,CAAC,QAAQ,EAAE,CAAC;YACb,MAAM,CACJ,+BAA+B,CAAC;gBAC9B,oBAAoB,EAAE,GAAG;gBACzB,kBAAkB,EAAE,WAAW;aAChC,CAAC,CACH,CAAC,QAAQ,EAAE,CAAC;QACf,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yBAAyB,EAAE,GAAG,EAAE;YACjC,MAAM,CACJ,+BAA+B,CAAC;gBAC9B,kBAAkB,EAAE,gBAAgB;aACrC,CAAC,CACH,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;QAC9B,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1,5 +1,5 @@
1
1
  import { describe, expect, test } from "@jest/globals";
2
- import { createEmptyFilterFields, removeDataFromResult, canonicalBashEventRowKey, PASSWORD_REQUIREMENTS_REGEX, PASSWORD_MIN_LENGTH, EMPTY_FILTER_FIELDS, ticketIsPaidForEventAdmission, isUnpaidPayAtDoorTicket, TICKET_PURCHASE_TYPE_COMP, TICKET_PURCHASE_TYPE_PAY_AT_DOOR, COMPLEMENTARY_SERVICE_TYPE, ServiceTypes, } from "../definitions.js";
2
+ import { createEmptyFilterFields, removeDataFromResult, canonicalBashEventRowKey, PASSWORD_REQUIREMENTS_REGEX, PASSWORD_MIN_LENGTH, EMPTY_FILTER_FIELDS, ticketIsPaidForEventAdmission, isUnpaidPayAtDoorTicket, TICKET_PURCHASE_TYPE_COMP, TICKET_PURCHASE_TYPE_PAY_AT_DOOR, COMPLEMENTARY_SERVICE_TYPE, complementaryServiceTypeFor, ServiceTypes, } from "../definitions.js";
3
3
  describe("definitions helpers", () => {
4
4
  describe("createEmptyFilterFields", () => {
5
5
  test("returns fresh arrays not shared with EMPTY_FILTER_FIELDS", () => {
@@ -85,7 +85,11 @@ describe("definitions helpers", () => {
85
85
  test("pairs Vendors and EventServices both ways", () => {
86
86
  expect(COMPLEMENTARY_SERVICE_TYPE[ServiceTypes.Vendors]).toBe(ServiceTypes.EventServices);
87
87
  expect(COMPLEMENTARY_SERVICE_TYPE[ServiceTypes.EventServices]).toBe(ServiceTypes.Vendors);
88
- expect(COMPLEMENTARY_SERVICE_TYPE[ServiceTypes.EntertainmentServices]).toBeUndefined();
88
+ expect(ServiceTypes.EntertainmentServices in COMPLEMENTARY_SERVICE_TYPE).toBe(false);
89
+ });
90
+ test("complementaryServiceTypeFor returns undefined for unsupported types", () => {
91
+ expect(complementaryServiceTypeFor(ServiceTypes.Vendors)).toBe(ServiceTypes.EventServices);
92
+ expect(complementaryServiceTypeFor(ServiceTypes.EntertainmentServices)).toBeUndefined();
89
93
  });
90
94
  });
91
95
  });
@@ -1 +1 @@
1
- {"version":3,"file":"definitionsHelpers.test.js","sourceRoot":"","sources":["../../src/__tests__/definitionsHelpers.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"definitionsHelpers.test.js","sourceRoot":"","sources":["../../src/__tests__/definitionsHelpers.test.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,10 @@
1
- import { hostCrmGrowthPackIsComplete, hostCrmHasPostEventPackAutomation, hostCrmHasWinBackPackAutomation, HOST_CRM_GROWTH_PACK_WINBACK_PRESET_ID, } from "../hostCrmAutomation.js";
1
+ import { hostCrmGrowthPackIsComplete, hostCrmHasLateBuyerPackAutomation, hostCrmHasPostEventPackAutomation, hostCrmHasWinBackPackAutomation, HOST_CRM_GROWTH_PACK_LATE_BUYER_PRESET_ID, HOST_CRM_GROWTH_PACK_WINBACK_PRESET_ID, } from "../hostCrmAutomation.js";
2
2
  describe("host CRM growth pack detection", () => {
3
- it("detects win-back and post-event pack rows", () => {
3
+ it("detects win-back, post-event, and late-buyer pack rows", () => {
4
4
  const empty = [];
5
5
  expect(hostCrmHasWinBackPackAutomation(empty)).toBe(false);
6
6
  expect(hostCrmHasPostEventPackAutomation(empty)).toBe(false);
7
+ expect(hostCrmHasLateBuyerPackAutomation(empty)).toBe(false);
7
8
  expect(hostCrmGrowthPackIsComplete(empty)).toBe(false);
8
9
  const winBack = [
9
10
  {
@@ -20,6 +21,15 @@ describe("host CRM growth pack detection", () => {
20
21
  ];
21
22
  expect(hostCrmHasPostEventPackAutomation(both)).toBe(true);
22
23
  expect(hostCrmGrowthPackIsComplete(both)).toBe(true);
24
+ const withLateBuyer = [
25
+ ...both,
26
+ {
27
+ trigger: "Recurring",
28
+ channel: "Email",
29
+ audiencePresetId: HOST_CRM_GROWTH_PACK_LATE_BUYER_PRESET_ID,
30
+ },
31
+ ];
32
+ expect(hostCrmHasLateBuyerPackAutomation(withLateBuyer)).toBe(true);
23
33
  });
24
34
  });
25
35
  //# sourceMappingURL=hostCrmGrowthPack.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"hostCrmGrowthPack.test.js","sourceRoot":"","sources":["../../src/__tests__/hostCrmGrowthPack.test.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,2BAA2B,EAC3B,iCAAiC,EACjC,+BAA+B,EAC/B,sCAAsC,GACvC,MAAM,yBAAyB,CAAC;AAEjC,QAAQ,CAAC,gCAAgC,EAAE,GAAG,EAAE;IAC9C,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,MAAM,KAAK,GACT,EAAE,CAAC;QACL,MAAM,CAAC,+BAA+B,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC3D,MAAM,CAAC,iCAAiC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC7D,MAAM,CAAC,2BAA2B,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAEvD,MAAM,OAAO,GAAG;YACd;gBACE,OAAO,EAAE,WAAW;gBACpB,OAAO,EAAE,OAAO;gBAChB,gBAAgB,EAAE,sCAAsC;aACzD;SACF,CAAC;QACF,MAAM,CAAC,+BAA+B,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5D,MAAM,CAAC,2BAA2B,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAEzD,MAAM,IAAI,GAAG;YACX,GAAG,OAAO;YACV,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,EAAE,gBAAgB,EAAE,IAAI,EAAE;SACnE,CAAC;QACF,MAAM,CAAC,iCAAiC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3D,MAAM,CAAC,2BAA2B,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"hostCrmGrowthPack.test.js","sourceRoot":"","sources":["../../src/__tests__/hostCrmGrowthPack.test.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,2BAA2B,EAC3B,iCAAiC,EACjC,iCAAiC,EACjC,+BAA+B,EAC/B,yCAAyC,EACzC,sCAAsC,GACvC,MAAM,yBAAyB,CAAC;AAEjC,QAAQ,CAAC,gCAAgC,EAAE,GAAG,EAAE;IAC9C,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;QAChE,MAAM,KAAK,GACT,EAAE,CAAC;QACL,MAAM,CAAC,+BAA+B,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC3D,MAAM,CAAC,iCAAiC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC7D,MAAM,CAAC,iCAAiC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC7D,MAAM,CAAC,2BAA2B,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAEvD,MAAM,OAAO,GAAG;YACd;gBACE,OAAO,EAAE,WAAW;gBACpB,OAAO,EAAE,OAAO;gBAChB,gBAAgB,EAAE,sCAAsC;aACzD;SACF,CAAC;QACF,MAAM,CAAC,+BAA+B,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5D,MAAM,CAAC,2BAA2B,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAEzD,MAAM,IAAI,GAAG;YACX,GAAG,OAAO;YACV,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,EAAE,gBAAgB,EAAE,IAAI,EAAE;SACnE,CAAC;QACF,MAAM,CAAC,iCAAiC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3D,MAAM,CAAC,2BAA2B,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAErD,MAAM,aAAa,GAAG;YACpB,GAAG,IAAI;YACP;gBACE,OAAO,EAAE,WAAW;gBACpB,OAAO,EAAE,OAAO;gBAChB,gBAAgB,EAAE,yCAAyC;aAC5D;SACF,CAAC;QACF,MAAM,CAAC,iCAAiC,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=hostPromoter.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hostPromoter.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/hostPromoter.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,79 @@
1
+ /**
2
+ * hostPromoter — kind/subtype mapping, hireable guards, deep links, influencer tiers.
3
+ */
4
+ import { describe, expect, test } from "@jest/globals";
5
+ import { HOST_PROMOTER_KIND, buildHireStreetTeamServiceDeepLink, eventServiceSubTypeFromHostPromoterKind, hostPromoterKindFromEventServiceSubType, isHostPromoterHireableKind, isHostPromoterInfluencerTier, isHostPromoterSyncServiceSubType, } from "../hostPromoter.js";
6
+ describe("hostPromoterKindFromEventServiceSubType", () => {
7
+ test("maps known EventService subtypes to host promoter kinds", () => {
8
+ expect(hostPromoterKindFromEventServiceSubType("Promoter")).toBe(HOST_PROMOTER_KIND.EventPromoter);
9
+ expect(hostPromoterKindFromEventServiceSubType("Influencer")).toBe(HOST_PROMOTER_KIND.Influencer);
10
+ expect(hostPromoterKindFromEventServiceSubType("ContentCreator")).toBe(HOST_PROMOTER_KIND.ContentCreator);
11
+ expect(hostPromoterKindFromEventServiceSubType("Model")).toBe(HOST_PROMOTER_KIND.Model);
12
+ expect(hostPromoterKindFromEventServiceSubType("BrandAmbassador")).toBe(HOST_PROMOTER_KIND.BrandAmbassador);
13
+ });
14
+ test("returns null for unknown or empty subtypes", () => {
15
+ expect(hostPromoterKindFromEventServiceSubType("DJ")).toBeNull();
16
+ expect(hostPromoterKindFromEventServiceSubType(null)).toBeNull();
17
+ expect(hostPromoterKindFromEventServiceSubType(undefined)).toBeNull();
18
+ });
19
+ });
20
+ describe("eventServiceSubTypeFromHostPromoterKind", () => {
21
+ test("maps hireable kinds back to EventService subtypes", () => {
22
+ expect(eventServiceSubTypeFromHostPromoterKind(HOST_PROMOTER_KIND.EventPromoter)).toBe("Promoter");
23
+ expect(eventServiceSubTypeFromHostPromoterKind(HOST_PROMOTER_KIND.Influencer)).toBe("Influencer");
24
+ expect(eventServiceSubTypeFromHostPromoterKind(HOST_PROMOTER_KIND.ContentCreator)).toBe("ContentCreator");
25
+ expect(eventServiceSubTypeFromHostPromoterKind(HOST_PROMOTER_KIND.Model)).toBe("Model");
26
+ expect(eventServiceSubTypeFromHostPromoterKind(HOST_PROMOTER_KIND.BrandAmbassador)).toBe("BrandAmbassador");
27
+ });
28
+ test("PromoCode and unknown kinds have no hireable subtype", () => {
29
+ expect(eventServiceSubTypeFromHostPromoterKind(HOST_PROMOTER_KIND.PromoCode)).toBeNull();
30
+ expect(eventServiceSubTypeFromHostPromoterKind("Nope")).toBeNull();
31
+ expect(eventServiceSubTypeFromHostPromoterKind(null)).toBeNull();
32
+ });
33
+ });
34
+ describe("isHostPromoterHireableKind / isHostPromoterSyncServiceSubType", () => {
35
+ test("hireable kinds exclude PromoCode", () => {
36
+ expect(isHostPromoterHireableKind(HOST_PROMOTER_KIND.Influencer)).toBe(true);
37
+ expect(isHostPromoterHireableKind(HOST_PROMOTER_KIND.PromoCode)).toBe(false);
38
+ expect(isHostPromoterHireableKind(null)).toBe(false);
39
+ expect(isHostPromoterHireableKind("")).toBe(false);
40
+ });
41
+ test("sync subtypes match marketplace EventService values", () => {
42
+ expect(isHostPromoterSyncServiceSubType("Promoter")).toBe(true);
43
+ expect(isHostPromoterSyncServiceSubType("PromoCode")).toBe(false);
44
+ expect(isHostPromoterSyncServiceSubType(undefined)).toBe(false);
45
+ });
46
+ });
47
+ describe("buildHireStreetTeamServiceDeepLink", () => {
48
+ test("builds service detail path without bash query", () => {
49
+ expect(buildHireStreetTeamServiceDeepLink({
50
+ serviceId: "svc-1",
51
+ eventServiceId: "es-1",
52
+ })).toBe("/services/svc-1/EventServices/es-1");
53
+ });
54
+ test("appends encoded bashEventId when provided", () => {
55
+ expect(buildHireStreetTeamServiceDeepLink({
56
+ serviceId: "svc-1",
57
+ eventServiceId: "es-1",
58
+ bashEventId: "bash/with spaces",
59
+ })).toBe("/services/svc-1/EventServices/es-1?bashEventId=bash%2Fwith%20spaces");
60
+ });
61
+ test("omits query when bashEventId is null", () => {
62
+ expect(buildHireStreetTeamServiceDeepLink({
63
+ serviceId: "svc-1",
64
+ eventServiceId: "es-1",
65
+ bashEventId: null,
66
+ })).toBe("/services/svc-1/EventServices/es-1");
67
+ });
68
+ });
69
+ describe("isHostPromoterInfluencerTier", () => {
70
+ test("accepts known audience tiers", () => {
71
+ expect(isHostPromoterInfluencerTier("Nano")).toBe(true);
72
+ expect(isHostPromoterInfluencerTier("Mega")).toBe(true);
73
+ });
74
+ test("rejects empty and unknown values", () => {
75
+ expect(isHostPromoterInfluencerTier(null)).toBe(false);
76
+ expect(isHostPromoterInfluencerTier("Huge")).toBe(false);
77
+ });
78
+ });
79
+ //# sourceMappingURL=hostPromoter.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hostPromoter.test.js","sourceRoot":"","sources":["../../src/__tests__/hostPromoter.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Curated cause / community tags for bash + service Why flows.
3
+ * Stored as stable string IDs on `causeTags` (Service / BashEvent) so search
4
+ * can filter later without parsing free text.
5
+ */
6
+ export type CauseTagId = "neighborhood" | "mutual_aid" | "arts_culture" | "music_scene" | "youth" | "lgbtq" | "environment" | "mental_health" | "education" | "food_security" | "animal_welfare" | "sports_rec" | "faith_spiritual" | "civic" | "fundraiser" | "small_business";
7
+ export type CauseTag = {
8
+ id: CauseTagId;
9
+ label: string;
10
+ /** Short seed line for bash descriptions when a chip is selected. */
11
+ bashSeed: string;
12
+ };
13
+ export declare const CAUSE_TAGS: readonly CauseTag[];
14
+ export declare const CAUSE_TAG_BY_ID: Readonly<Record<CauseTagId, CauseTag>>;
15
+ export declare function isCauseTagId(value: string): value is CauseTagId;
16
+ export declare function normalizeCauseTags(ids: string[] | null | undefined): CauseTagId[];
17
+ export declare function causeTagLabels(ids: string[] | null | undefined): string[];
18
+ /**
19
+ * Cause tag IDs whose label or id matches a free-text search query.
20
+ * Used by keyword search (Prisma `hasSome`) and client-side filters.
21
+ */
22
+ export declare function causeTagIdsMatchingSearch(query: string): CauseTagId[];
23
+ /** True when any of the entity's cause tags match the search query. */
24
+ export declare function causeTagsMatchSearch(causeTags: string[] | null | undefined, query: string): boolean;
25
+ export type BashDonationCauseFields = {
26
+ donationGoalCents?: number | null;
27
+ donationCausePercent?: number | null;
28
+ donationCauseTagId?: string | null;
29
+ donationCauseLabel?: string | null;
30
+ };
31
+ /**
32
+ * Resolve the public cause label for host-declared donation split.
33
+ * Prefers curated tag label over free-text.
34
+ */
35
+ export declare function resolveDonationCauseLabel(fields: Pick<BashDonationCauseFields, "donationCauseTagId" | "donationCauseLabel">): string | null;
36
+ export type DonationCauseValidationError = "invalid_goal" | "invalid_percent" | "percent_requires_cause" | "invalid_cause_tag";
37
+ /**
38
+ * Validate bash donation goal / cause-split fields before persist.
39
+ * Returns null when valid.
40
+ */
41
+ export declare function validateBashDonationCauseFields(fields: BashDonationCauseFields): DonationCauseValidationError | null;
42
+ //# sourceMappingURL=causeTags.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"causeTags.d.ts","sourceRoot":"","sources":["../src/causeTags.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,MAAM,UAAU,GAClB,cAAc,GACd,YAAY,GACZ,cAAc,GACd,aAAa,GACb,OAAO,GACP,OAAO,GACP,aAAa,GACb,eAAe,GACf,WAAW,GACX,eAAe,GACf,gBAAgB,GAChB,YAAY,GACZ,iBAAiB,GACjB,OAAO,GACP,YAAY,GACZ,gBAAgB,CAAC;AAErB,MAAM,MAAM,QAAQ,GAAG;IACrB,EAAE,EAAE,UAAU,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,qEAAqE;IACrE,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,SAAS,QAAQ,EAiFhC,CAAC;AAEX,eAAO,MAAM,eAAe,EAAE,QAAQ,CAAC,MAAM,CAAC,UAAU,EAAE,QAAQ,CAAC,CAOhE,CAAC;AAEJ,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,UAAU,CAE/D;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,IAAI,GAAG,SAAS,GAAG,UAAU,EAAE,CAOjF;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,EAAE,CAEzE;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,EAAE,CAarE;AAED,uEAAuE;AACvE,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,MAAM,EAAE,GAAG,IAAI,GAAG,SAAS,EACtC,KAAK,EAAE,MAAM,GACZ,OAAO,CAKT;AAED,MAAM,MAAM,uBAAuB,GAAG;IACpC,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,oBAAoB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,kBAAkB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,kBAAkB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACpC,CAAC;AAEF;;;GAGG;AACH,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,IAAI,CACV,uBAAuB,EACvB,oBAAoB,GAAG,oBAAoB,CAC5C,GACA,MAAM,GAAG,IAAI,CAOf;AAED,MAAM,MAAM,4BAA4B,GACpC,cAAc,GACd,iBAAiB,GACjB,wBAAwB,GACxB,mBAAmB,CAAC;AAExB;;;GAGG;AACH,wBAAgB,+BAA+B,CAC7C,MAAM,EAAE,uBAAuB,GAC9B,4BAA4B,GAAG,IAAI,CAoCrC"}
@@ -0,0 +1,173 @@
1
+ export const CAUSE_TAGS = [
2
+ {
3
+ id: "neighborhood",
4
+ label: "Neighborhood / block",
5
+ bashSeed: "This bash is for the neighbors — building our block crew.",
6
+ },
7
+ {
8
+ id: "mutual_aid",
9
+ label: "Mutual aid",
10
+ bashSeed: "We're gathering to support mutual aid in our community.",
11
+ },
12
+ {
13
+ id: "arts_culture",
14
+ label: "Arts & culture",
15
+ bashSeed: "This night celebrates local arts and culture.",
16
+ },
17
+ {
18
+ id: "music_scene",
19
+ label: "Music scene",
20
+ bashSeed: "Built for the local music scene — come through for the sound.",
21
+ },
22
+ {
23
+ id: "youth",
24
+ label: "Youth & kids",
25
+ bashSeed: "This bash supports youth and families in our area.",
26
+ },
27
+ {
28
+ id: "lgbtq",
29
+ label: "LGBTQ+",
30
+ bashSeed: "A queer-friendly bash — everyone who shows respect is welcome.",
31
+ },
32
+ {
33
+ id: "environment",
34
+ label: "Environment",
35
+ bashSeed: "We're tying this night to environmental care and climate action.",
36
+ },
37
+ {
38
+ id: "mental_health",
39
+ label: "Mental health",
40
+ bashSeed: "This gathering centers mental health, rest, and real connection.",
41
+ },
42
+ {
43
+ id: "education",
44
+ label: "Education",
45
+ bashSeed: "We're here for learning, mentoring, and education in our community.",
46
+ },
47
+ {
48
+ id: "food_security",
49
+ label: "Food security",
50
+ bashSeed: "Part of this night supports food access for people nearby.",
51
+ },
52
+ {
53
+ id: "animal_welfare",
54
+ label: "Animal welfare",
55
+ bashSeed: "We're throwing this with animal welfare in mind.",
56
+ },
57
+ {
58
+ id: "sports_rec",
59
+ label: "Sports & recreation",
60
+ bashSeed: "Come move, play, and build the local sports / rec crew.",
61
+ },
62
+ {
63
+ id: "faith_spiritual",
64
+ label: "Faith / spiritual",
65
+ bashSeed: "This bash brings our faith / spiritual community together.",
66
+ },
67
+ {
68
+ id: "civic",
69
+ label: "Civic / local politics",
70
+ bashSeed: "A civic hang — talk, organize, and show up for our city.",
71
+ },
72
+ {
73
+ id: "fundraiser",
74
+ label: "Fundraiser",
75
+ bashSeed: "This bash raises support for a cause we care about.",
76
+ },
77
+ {
78
+ id: "small_business",
79
+ label: "Small business / makers",
80
+ bashSeed: "Celebrating local small businesses and makers.",
81
+ },
82
+ ];
83
+ export const CAUSE_TAG_BY_ID = CAUSE_TAGS.reduce((acc, tag) => {
84
+ acc[tag.id] = tag;
85
+ return acc;
86
+ }, {});
87
+ export function isCauseTagId(value) {
88
+ return Object.prototype.hasOwnProperty.call(CAUSE_TAG_BY_ID, value);
89
+ }
90
+ export function normalizeCauseTags(ids) {
91
+ if (!ids?.length)
92
+ return [];
93
+ const seen = new Set();
94
+ for (const id of ids) {
95
+ if (isCauseTagId(id))
96
+ seen.add(id);
97
+ }
98
+ return [...seen];
99
+ }
100
+ export function causeTagLabels(ids) {
101
+ return normalizeCauseTags(ids).map((id) => CAUSE_TAG_BY_ID[id].label);
102
+ }
103
+ /**
104
+ * Cause tag IDs whose label or id matches a free-text search query.
105
+ * Used by keyword search (Prisma `hasSome`) and client-side filters.
106
+ */
107
+ export function causeTagIdsMatchingSearch(query) {
108
+ const term = query.trim().toLowerCase();
109
+ if (!term)
110
+ return [];
111
+ const termAsId = term.replace(/\s+/g, "_");
112
+ return CAUSE_TAGS.filter((tag) => {
113
+ const idSpaced = tag.id.replace(/_/g, " ");
114
+ return (tag.label.toLowerCase().includes(term) ||
115
+ tag.id.includes(termAsId) ||
116
+ idSpaced.includes(term));
117
+ }).map((tag) => tag.id);
118
+ }
119
+ /** True when any of the entity's cause tags match the search query. */
120
+ export function causeTagsMatchSearch(causeTags, query) {
121
+ const matching = causeTagIdsMatchingSearch(query);
122
+ if (matching.length === 0)
123
+ return false;
124
+ const selected = new Set(normalizeCauseTags(causeTags));
125
+ return matching.some((id) => selected.has(id));
126
+ }
127
+ /**
128
+ * Resolve the public cause label for host-declared donation split.
129
+ * Prefers curated tag label over free-text.
130
+ */
131
+ export function resolveDonationCauseLabel(fields) {
132
+ const tagId = fields.donationCauseTagId?.trim();
133
+ if (tagId && isCauseTagId(tagId)) {
134
+ return CAUSE_TAG_BY_ID[tagId].label;
135
+ }
136
+ const label = fields.donationCauseLabel?.trim();
137
+ return label ? label : null;
138
+ }
139
+ /**
140
+ * Validate bash donation goal / cause-split fields before persist.
141
+ * Returns null when valid.
142
+ */
143
+ export function validateBashDonationCauseFields(fields) {
144
+ const goal = fields.donationGoalCents;
145
+ if (goal != null &&
146
+ (typeof goal !== "number" ||
147
+ !Number.isFinite(goal) ||
148
+ goal <= 0 ||
149
+ !Number.isInteger(goal))) {
150
+ return "invalid_goal";
151
+ }
152
+ const rawTag = fields.donationCauseTagId?.trim() || null;
153
+ if (rawTag && !isCauseTagId(rawTag)) {
154
+ return "invalid_cause_tag";
155
+ }
156
+ const percent = fields.donationCausePercent;
157
+ if (percent != null) {
158
+ if (typeof percent !== "number" ||
159
+ !Number.isFinite(percent) ||
160
+ !Number.isInteger(percent) ||
161
+ percent < 0 ||
162
+ percent > 100) {
163
+ return "invalid_percent";
164
+ }
165
+ const hasTag = !!rawTag && isCauseTagId(rawTag);
166
+ const hasLabel = !!fields.donationCauseLabel?.trim();
167
+ if (!hasTag && !hasLabel) {
168
+ return "percent_requires_cause";
169
+ }
170
+ }
171
+ return null;
172
+ }
173
+ //# sourceMappingURL=causeTags.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"causeTags.js","sourceRoot":"","sources":["../src/causeTags.ts"],"names":[],"mappings":"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"}
@@ -10,21 +10,31 @@ import type { UtmFields } from "./utmAttribution.js";
10
10
  /**
11
11
  * Prisma's `index-browser` bundle (used by Vite in bash-app) omits some enums as runtime
12
12
  * values — importing them from `@prisma/client` yields `undefined` and crashes on first
13
- * property access. These mirrors match the Prisma schema / full client enum strings.
14
- */
15
- /**
13
+ * property access. Incomplete Jest `@prisma/client` mocks hit the same landmine.
14
+ * These mirrors match the Prisma schema / full client enum strings.
15
+ *
16
16
  * "Also list as [complementary type]" — a one-time identity-field prefill copy
17
17
  * (see Service.complementaryOfServiceId), not an ongoing synced link. Scoped to
18
18
  * the Vendors <-> EventServices pairing only (e.g. a food truck that vends
19
19
  * publicly at festivals and is also paid a flat fee at private weddings).
20
20
  */
21
- export declare const COMPLEMENTARY_SERVICE_TYPE: Partial<Record<ServiceTypes, ServiceTypes>>;
21
+ export declare const COMPLEMENTARY_SERVICE_TYPE: {
22
+ readonly Vendors: "EventServices";
23
+ readonly EventServices: "Vendors";
24
+ };
25
+ export type ComplementaryServiceSourceType = keyof typeof COMPLEMENTARY_SERVICE_TYPE;
26
+ export declare function isComplementaryServiceSourceType(serviceType: ServiceTypes): serviceType is ComplementaryServiceSourceType;
27
+ /** Vendors ↔ EventServices only; other types return undefined. */
28
+ export declare function complementaryServiceTypeFor(serviceType: ServiceTypes): ServiceTypes | undefined;
22
29
  /**
23
30
  * Human-readable label for a ServiceTypes value — the raw enum ("EventServices")
24
31
  * is not fit for display copy. Only covers the values COMPLEMENTARY_SERVICE_TYPE
25
32
  * can produce; extend as more callers need display labels for other types.
26
33
  */
27
- export declare const SERVICE_TYPE_DISPLAY_LABEL: Partial<Record<ServiceTypes, string>>;
34
+ export declare const SERVICE_TYPE_DISPLAY_LABEL: {
35
+ readonly Vendors: "Vendor";
36
+ readonly EventServices: "Event Service";
37
+ };
28
38
  /** Picks "a"/"an" for the given word, e.g. for "a Vendor" vs "an Event Service". */
29
39
  export declare function articleFor(word: string): "a" | "an";
30
40
  export declare const ServiceBookingOfferDirection: {
@@ -112,6 +122,23 @@ export declare const CHECKOUT_PURPOSE_DOOR_TERMINAL_SALE: "door_terminal_sale";
112
122
  export declare const CHECKOUT_PURPOSE_DOOR_SQUARE_SALE: "door_square_sale";
113
123
  /** Walk-up / PAD door sale via Square Terminal (card present). */
114
124
  export declare const CHECKOUT_PURPOSE_DOOR_SQUARE_TERMINAL_SALE: "door_square_terminal_sale";
125
+ /** Online ticket checkout line: coat/bag check add-on. */
126
+ export declare const CHECKOUT_PURPOSE_COAT_CHECK_ONLINE: "coat_check_online";
127
+ /** Walk-up coat/bag check via Stripe Checkout (guest pays on phone). */
128
+ export declare const CHECKOUT_PURPOSE_COAT_CHECK_DOOR_SALE: "coat_check_door_sale";
129
+ /** Coat/bag check via Stripe Terminal (card present). */
130
+ export declare const CHECKOUT_PURPOSE_COAT_CHECK_DOOR_TERMINAL_SALE: "coat_check_door_terminal_sale";
131
+ /** Walk-up coat/bag check via Square Payment Link. */
132
+ export declare const CHECKOUT_PURPOSE_COAT_CHECK_DOOR_SQUARE_SALE: "coat_check_door_square_sale";
133
+ /** Coat/bag check via Square Terminal. */
134
+ export declare const CHECKOUT_PURPOSE_COAT_CHECK_DOOR_SQUARE_TERMINAL_SALE: "coat_check_door_square_terminal_sale";
135
+ export declare const COAT_CHECK_ENTITLEMENT_STATUSES: readonly ["Paid", "CheckedIn", "Claimed", "Refunded", "Cancelled"];
136
+ export type CoatCheckEntitlementStatusName = (typeof COAT_CHECK_ENTITLEMENT_STATUSES)[number];
137
+ export declare const COAT_CHECK_QR_TYPE: "coat_check";
138
+ export declare const COAT_CHECK_SCAN_OUTCOMES: readonly ["ready_for_dropoff", "ready_for_claim", "already_claimed", "invalid_or_expired", "wrong_event", "cancelled_or_refunded"];
139
+ export type CoatCheckScanOutcome = (typeof COAT_CHECK_SCAN_OUTCOMES)[number];
140
+ /** Statuses that occupy a coat-check slot. */
141
+ export declare const COAT_CHECK_SLOT_OCCUPYING_STATUSES: CoatCheckEntitlementStatusName[];
115
142
  /** Which processor the door app uses for card capture (host preferred + ready). */
116
143
  export type DoorPaymentRail = "STRIPE" | "SQUARE";
117
144
  /** Public GET /public-event/:id/door-config payload. */
@@ -667,6 +694,12 @@ export interface StripeCreateBashEventTicketsCheckoutSessionArgs extends UtmFiel
667
694
  waiverAccepted?: boolean;
668
695
  /** EventGroup id when purchasing a group package for the crew */
669
696
  groupId?: string;
697
+ /** Optional coat/bag check units to buy with this ticket checkout (0 = none). */
698
+ coatCheckQuantity?: number;
699
+ /** When true, add oversized surcharge per coat unit (if host configured). */
700
+ coatCheckOversized?: boolean;
701
+ /** Optional tip cents for coat check (when host enables tips). */
702
+ coatCheckTipCents?: number;
670
703
  }
671
704
  export interface StripeCreateBashEventDonationCheckoutSessionArgs extends UtmFields {
672
705
  bashEventId: string;