@bash-app/bash-common 30.408.0 → 30.413.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 (78) hide show
  1. package/dist/__tests__/partnerDealflow.test.d.ts +2 -0
  2. package/dist/__tests__/partnerDealflow.test.d.ts.map +1 -0
  3. package/dist/__tests__/partnerDealflow.test.js +51 -0
  4. package/dist/__tests__/partnerDealflow.test.js.map +1 -0
  5. package/dist/__tests__/partnerRevenueShareOptIn.test.d.ts +2 -0
  6. package/dist/__tests__/partnerRevenueShareOptIn.test.d.ts.map +1 -0
  7. package/dist/__tests__/partnerRevenueShareOptIn.test.js +55 -0
  8. package/dist/__tests__/partnerRevenueShareOptIn.test.js.map +1 -0
  9. package/dist/__tests__/reservedCustomBashEventType.test.d.ts +2 -0
  10. package/dist/__tests__/reservedCustomBashEventType.test.d.ts.map +1 -0
  11. package/dist/__tests__/reservedCustomBashEventType.test.js +19 -0
  12. package/dist/__tests__/reservedCustomBashEventType.test.js.map +1 -0
  13. package/dist/__tests__/serviceListingDealPreferences.test.d.ts +2 -0
  14. package/dist/__tests__/serviceListingDealPreferences.test.d.ts.map +1 -0
  15. package/dist/__tests__/serviceListingDealPreferences.test.js +84 -0
  16. package/dist/__tests__/serviceListingDealPreferences.test.js.map +1 -0
  17. package/dist/__tests__/statusEnums.test.js +1 -0
  18. package/dist/__tests__/statusEnums.test.js.map +1 -1
  19. package/dist/definitions.d.ts +7 -0
  20. package/dist/definitions.d.ts.map +1 -1
  21. package/dist/definitions.js +42 -0
  22. package/dist/definitions.js.map +1 -1
  23. package/dist/extendedSchemas.d.ts +101 -1
  24. package/dist/extendedSchemas.d.ts.map +1 -1
  25. package/dist/extendedSchemas.js +31 -0
  26. package/dist/extendedSchemas.js.map +1 -1
  27. package/dist/homepageSyntheticRows.d.ts +9 -0
  28. package/dist/homepageSyntheticRows.d.ts.map +1 -0
  29. package/dist/homepageSyntheticRows.js +26 -0
  30. package/dist/homepageSyntheticRows.js.map +1 -0
  31. package/dist/index.d.ts +4 -0
  32. package/dist/index.d.ts.map +1 -1
  33. package/dist/index.js +4 -0
  34. package/dist/index.js.map +1 -1
  35. package/dist/membershipDefinitions.d.ts +2 -0
  36. package/dist/membershipDefinitions.d.ts.map +1 -1
  37. package/dist/membershipDefinitions.js +2 -0
  38. package/dist/membershipDefinitions.js.map +1 -1
  39. package/dist/mirroredPrismaEnums.d.ts +1 -0
  40. package/dist/mirroredPrismaEnums.d.ts.map +1 -1
  41. package/dist/mirroredPrismaEnums.js +1 -0
  42. package/dist/mirroredPrismaEnums.js.map +1 -1
  43. package/dist/utils/__tests__/slugUtils.test.js +4 -4
  44. package/dist/utils/__tests__/slugUtils.test.js.map +1 -1
  45. package/dist/utils/service/partnerDealflow.d.ts +12 -0
  46. package/dist/utils/service/partnerDealflow.d.ts.map +1 -0
  47. package/dist/utils/service/partnerDealflow.js +33 -0
  48. package/dist/utils/service/partnerDealflow.js.map +1 -0
  49. package/dist/utils/service/partnerRevenueShareOptIn.d.ts +18 -0
  50. package/dist/utils/service/partnerRevenueShareOptIn.d.ts.map +1 -0
  51. package/dist/utils/service/partnerRevenueShareOptIn.js +46 -0
  52. package/dist/utils/service/partnerRevenueShareOptIn.js.map +1 -0
  53. package/dist/utils/service/serviceListingDealPreferences.d.ts +28 -0
  54. package/dist/utils/service/serviceListingDealPreferences.d.ts.map +1 -0
  55. package/dist/utils/service/serviceListingDealPreferences.js +126 -0
  56. package/dist/utils/service/serviceListingDealPreferences.js.map +1 -0
  57. package/dist/utils/slugUtils.d.ts +4 -1
  58. package/dist/utils/slugUtils.d.ts.map +1 -1
  59. package/dist/utils/slugUtils.js +8 -2
  60. package/dist/utils/slugUtils.js.map +1 -1
  61. package/package.json +5 -2
  62. package/prisma/schema.prisma +69 -0
  63. package/src/__tests__/partnerDealflow.test.ts +62 -0
  64. package/src/__tests__/partnerRevenueShareOptIn.test.ts +68 -0
  65. package/src/__tests__/reservedCustomBashEventType.test.ts +27 -0
  66. package/src/__tests__/serviceListingDealPreferences.test.ts +112 -0
  67. package/src/__tests__/statusEnums.test.ts +1 -0
  68. package/src/definitions.ts +53 -0
  69. package/src/extendedSchemas.ts +60 -0
  70. package/src/homepageSyntheticRows.ts +32 -0
  71. package/src/index.ts +4 -0
  72. package/src/membershipDefinitions.ts +2 -0
  73. package/src/mirroredPrismaEnums.ts +1 -0
  74. package/src/utils/__tests__/slugUtils.test.ts +4 -3
  75. package/src/utils/service/partnerDealflow.ts +47 -0
  76. package/src/utils/service/partnerRevenueShareOptIn.ts +70 -0
  77. package/src/utils/service/serviceListingDealPreferences.ts +184 -0
  78. package/src/utils/slugUtils.ts +12 -1
@@ -0,0 +1,46 @@
1
+ /** Which sales count when a partner shares revenue with the host. */
2
+ export const REVENUE_SHARE_WITH_HOST_BASIS = {
3
+ ALL_SALES: "ALL_SALES",
4
+ REFERRAL_ATTRIBUTED: "REFERRAL_ATTRIBUTED",
5
+ };
6
+ export const REVENUE_SHARE_WITH_HOST_BASIS_LABEL = {
7
+ ALL_SALES: "All sales at the bash",
8
+ REFERRAL_ATTRIBUTED: "Sales from guests using my code only",
9
+ };
10
+ function partnerFieldsFromRecord(row) {
11
+ if (!row)
12
+ return null;
13
+ return row;
14
+ }
15
+ /** Reads partner rev-share opt-in from any service subtype payload. */
16
+ export function readPartnerRevenueShareFields(service) {
17
+ if (service.vendor?.preferences) {
18
+ return partnerFieldsFromRecord(service.vendor.preferences);
19
+ }
20
+ if (service.exhibitor) {
21
+ return partnerFieldsFromRecord(service.exhibitor);
22
+ }
23
+ if (service.sponsor) {
24
+ return partnerFieldsFromRecord(service.sponsor);
25
+ }
26
+ if (service.entertainmentService) {
27
+ return partnerFieldsFromRecord(service.entertainmentService);
28
+ }
29
+ if (service.eventService) {
30
+ return partnerFieldsFromRecord(service.eventService);
31
+ }
32
+ return null;
33
+ }
34
+ /** True when listing is open to a revenue-share deal (partner or venue ticket split). */
35
+ export function serviceListingOpenToRevenueShare(service) {
36
+ const venue = service.venue;
37
+ if (venue?.revenueShareEnabled === true &&
38
+ venue.revenueShareHostPercentage != null) {
39
+ return true;
40
+ }
41
+ const partner = readPartnerRevenueShareFields(service);
42
+ return (partner?.openToRevenueShareWithHost === true &&
43
+ partner.revenueShareWithHostPercentage != null &&
44
+ partner.revenueShareWithHostPercentage >= 0);
45
+ }
46
+ //# sourceMappingURL=partnerRevenueShareOptIn.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"partnerRevenueShareOptIn.js","sourceRoot":"","sources":["../../../src/utils/service/partnerRevenueShareOptIn.ts"],"names":[],"mappings":"AAEA,qEAAqE;AACrE,MAAM,CAAC,MAAM,6BAA6B,GAAG;IAC3C,SAAS,EAAE,WAAW;IACtB,mBAAmB,EAAE,qBAAqB;CAClC,CAAC;AAKX,MAAM,CAAC,MAAM,mCAAmC,GAG5C;IACF,SAAS,EAAE,uBAAuB;IAClC,mBAAmB,EAAE,sCAAsC;CAC5D,CAAC;AAQF,SAAS,uBAAuB,CAC9B,GAAiD;IAEjD,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IACtB,OAAO,GAAG,CAAC;AACb,CAAC;AAED,uEAAuE;AACvE,MAAM,UAAU,6BAA6B,CAC3C,OAAmB;IAEnB,IAAI,OAAO,CAAC,MAAM,EAAE,WAAW,EAAE,CAAC;QAChC,OAAO,uBAAuB,CAAC,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IAC7D,CAAC;IACD,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;QACtB,OAAO,uBAAuB,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACpD,CAAC;IACD,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACpB,OAAO,uBAAuB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAClD,CAAC;IACD,IAAI,OAAO,CAAC,oBAAoB,EAAE,CAAC;QACjC,OAAO,uBAAuB,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;IAC/D,CAAC;IACD,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;QACzB,OAAO,uBAAuB,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IACvD,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,yFAAyF;AACzF,MAAM,UAAU,gCAAgC,CAAC,OAAmB;IAClE,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;IAC5B,IACE,KAAK,EAAE,mBAAmB,KAAK,IAAI;QACnC,KAAK,CAAC,0BAA0B,IAAI,IAAI,EACxC,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,OAAO,GAAG,6BAA6B,CAAC,OAAO,CAAC,CAAC;IACvD,OAAO,CACL,OAAO,EAAE,0BAA0B,KAAK,IAAI;QAC5C,OAAO,CAAC,8BAA8B,IAAI,IAAI;QAC9C,OAAO,CAAC,8BAA8B,IAAI,CAAC,CAC5C,CAAC;AACJ,CAAC"}
@@ -0,0 +1,28 @@
1
+ import type { ServiceExt } from "../../extendedSchemas";
2
+ export type ServiceListingDealBadge = {
3
+ id: string;
4
+ label: string;
5
+ };
6
+ export type ServiceListingDealDetailRow = {
7
+ label: string;
8
+ value: string;
9
+ };
10
+ /** Compact chips for cards and list rows. */
11
+ export declare function getServiceListingDealBadges(service: ServiceExt): ServiceListingDealBadge[];
12
+ /** Longer copy for public detail pages. */
13
+ export declare function getServiceListingDealDetailRows(service: ServiceExt): ServiceListingDealDetailRow[];
14
+ /** Card preview line for in-kind (truncated). */
15
+ export declare function getServiceListingInKindPreview(service: ServiceExt, maxLen?: number): string | null;
16
+ export type PartnerDealflowBookingSnapshot = {
17
+ openToRevenueShareWithHostSnapshot?: boolean;
18
+ revenueShareWithHostPercentageSnapshot?: number | null;
19
+ revenueShareWithHostBasisSnapshot?: string | null;
20
+ openToInKindDealsSnapshot?: boolean;
21
+ inKindDealOfferTextSnapshot?: string | null;
22
+ inKindEstimatedValueCentsSnapshot?: number | null;
23
+ dealRequiresMinimumCashSnapshot?: boolean;
24
+ dealMinimumCashCentsSnapshot?: number | null;
25
+ };
26
+ /** Copy live listing deal prefs onto a booking at confirmation time. */
27
+ export declare function buildPartnerDealflowBookingSnapshot(service: ServiceExt): PartnerDealflowBookingSnapshot;
28
+ //# sourceMappingURL=serviceListingDealPreferences.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serviceListingDealPreferences.d.ts","sourceRoot":"","sources":["../../../src/utils/service/serviceListingDealPreferences.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAYxD,MAAM,MAAM,uBAAuB,GAAG;IACpC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,2BAA2B,GAAG;IACxC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAqBF,6CAA6C;AAC7C,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,UAAU,GAClB,uBAAuB,EAAE,CAyB3B;AAED,2CAA2C;AAC3C,wBAAgB,+BAA+B,CAC7C,OAAO,EAAE,UAAU,GAClB,2BAA2B,EAAE,CAgD/B;AAED,iDAAiD;AACjD,wBAAgB,8BAA8B,CAC5C,OAAO,EAAE,UAAU,EACnB,MAAM,SAAK,GACV,MAAM,GAAG,IAAI,CAMf;AAED,MAAM,MAAM,8BAA8B,GAAG;IAC3C,kCAAkC,CAAC,EAAE,OAAO,CAAC;IAC7C,sCAAsC,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvD,iCAAiC,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAClD,yBAAyB,CAAC,EAAE,OAAO,CAAC;IACpC,2BAA2B,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5C,iCAAiC,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAClD,+BAA+B,CAAC,EAAE,OAAO,CAAC;IAC1C,4BAA4B,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9C,CAAC;AAEF,wEAAwE;AACxE,wBAAgB,mCAAmC,CACjD,OAAO,EAAE,UAAU,GAClB,8BAA8B,CAiChC"}
@@ -0,0 +1,126 @@
1
+ import { readPartnerDealflowFields, serviceListingOpenToInKindDeal, } from "./partnerDealflow.js";
2
+ import { readPartnerRevenueShareFields, REVENUE_SHARE_WITH_HOST_BASIS_LABEL, serviceListingOpenToRevenueShare, } from "./partnerRevenueShareOptIn.js";
3
+ function formatUsdFromCents(cents) {
4
+ const dollars = cents / 100;
5
+ return dollars % 1 === 0 ? `$${dollars.toFixed(0)}` : `$${dollars.toFixed(2)}`;
6
+ }
7
+ function minimumCashLabel(deal) {
8
+ if (deal?.dealRequiresMinimumCash !== true)
9
+ return null;
10
+ if (typeof deal.dealMinimumCashCents !== "number" || deal.dealMinimumCashCents <= 0) {
11
+ return null;
12
+ }
13
+ return `${formatUsdFromCents(deal.dealMinimumCashCents)} min cash`;
14
+ }
15
+ function truncateOffer(text, maxLen) {
16
+ const t = text.trim();
17
+ if (t.length <= maxLen)
18
+ return t;
19
+ return `${t.slice(0, maxLen - 1).trim()}…`;
20
+ }
21
+ /** Compact chips for cards and list rows. */
22
+ export function getServiceListingDealBadges(service) {
23
+ const badges = [];
24
+ const deal = readPartnerDealflowFields(service);
25
+ if (serviceListingOpenToRevenueShare(service)) {
26
+ badges.push({ id: "rev-share", label: "Rev share" });
27
+ }
28
+ if (serviceListingOpenToInKindDeal(service)) {
29
+ badges.push({ id: "in-kind", label: "In-kind" });
30
+ }
31
+ const minCash = minimumCashLabel(deal);
32
+ if (minCash) {
33
+ badges.push({ id: "min-cash", label: minCash });
34
+ }
35
+ const hostBidOpen = service.vendor?.preferences?.openToHostBids === true ||
36
+ service.exhibitor?.openToHostBids === true ||
37
+ service.sponsor?.openToHostBids === true;
38
+ if (hostBidOpen) {
39
+ badges.push({ id: "host-bids", label: "Host bids" });
40
+ }
41
+ return badges;
42
+ }
43
+ /** Longer copy for public detail pages. */
44
+ export function getServiceListingDealDetailRows(service) {
45
+ const rows = [];
46
+ const deal = readPartnerDealflowFields(service);
47
+ const rev = readPartnerRevenueShareFields(service);
48
+ const venue = service.venue;
49
+ if (venue?.revenueShareEnabled === true && venue.revenueShareHostPercentage != null) {
50
+ rows.push({
51
+ label: "Venue revenue share",
52
+ value: `Host keeps ${venue.revenueShareHostPercentage}% of agreed ticket or bar revenue.`,
53
+ });
54
+ }
55
+ else if (rev?.openToRevenueShareWithHost === true) {
56
+ const pct = rev.revenueShareWithHostPercentage;
57
+ const basis = rev.revenueShareWithHostBasis;
58
+ const basisLabel = basis && basis in REVENUE_SHARE_WITH_HOST_BASIS_LABEL
59
+ ? REVENUE_SHARE_WITH_HOST_BASIS_LABEL[basis]
60
+ : null;
61
+ rows.push({
62
+ label: "Revenue share with host",
63
+ value: typeof pct === "number"
64
+ ? `Shares ${pct}% with the host${basisLabel ? ` (${basisLabel.toLowerCase()})` : ""}.`
65
+ : "Open to sharing revenue with the host (percentage not set).",
66
+ });
67
+ }
68
+ if (serviceListingOpenToInKindDeal(service) && deal?.inKindDealOfferText) {
69
+ const est = typeof deal.inKindEstimatedValueCents === "number" &&
70
+ deal.inKindEstimatedValueCents > 0
71
+ ? ` Approx. value ${formatUsdFromCents(deal.inKindEstimatedValueCents)}.`
72
+ : "";
73
+ rows.push({
74
+ label: "In-kind / trade offer",
75
+ value: `${deal.inKindDealOfferText.trim()}${est}`,
76
+ });
77
+ }
78
+ const minCash = minimumCashLabel(deal);
79
+ if (minCash) {
80
+ rows.push({
81
+ label: "Minimum cash on hybrid deals",
82
+ value: `Requires ${minCash.replace(" min cash", "")} minimum cash alongside rev-share or in-kind terms so hosts know you're serious.`,
83
+ });
84
+ }
85
+ return rows;
86
+ }
87
+ /** Card preview line for in-kind (truncated). */
88
+ export function getServiceListingInKindPreview(service, maxLen = 80) {
89
+ const deal = readPartnerDealflowFields(service);
90
+ if (!serviceListingOpenToInKindDeal(service) || !deal?.inKindDealOfferText) {
91
+ return null;
92
+ }
93
+ return truncateOffer(deal.inKindDealOfferText, maxLen);
94
+ }
95
+ /** Copy live listing deal prefs onto a booking at confirmation time. */
96
+ export function buildPartnerDealflowBookingSnapshot(service) {
97
+ const rev = readPartnerRevenueShareFields(service);
98
+ const deal = readPartnerDealflowFields(service);
99
+ const venue = service.venue;
100
+ const snap = {};
101
+ if (venue?.revenueShareEnabled === true) {
102
+ snap.openToRevenueShareWithHostSnapshot = true;
103
+ snap.revenueShareWithHostPercentageSnapshot =
104
+ venue.revenueShareHostPercentage ?? null;
105
+ snap.revenueShareWithHostBasisSnapshot = venue.revenueShareBasis ?? null;
106
+ }
107
+ else if (rev?.openToRevenueShareWithHost === true) {
108
+ snap.openToRevenueShareWithHostSnapshot = true;
109
+ snap.revenueShareWithHostPercentageSnapshot =
110
+ rev.revenueShareWithHostPercentage ?? null;
111
+ snap.revenueShareWithHostBasisSnapshot =
112
+ rev.revenueShareWithHostBasis ?? null;
113
+ }
114
+ if (deal?.openToInKindDeals === true) {
115
+ snap.openToInKindDealsSnapshot = true;
116
+ snap.inKindDealOfferTextSnapshot = deal.inKindDealOfferText?.trim() ?? null;
117
+ snap.inKindEstimatedValueCentsSnapshot =
118
+ deal.inKindEstimatedValueCents ?? null;
119
+ }
120
+ if (deal?.dealRequiresMinimumCash === true) {
121
+ snap.dealRequiresMinimumCashSnapshot = true;
122
+ snap.dealMinimumCashCentsSnapshot = deal.dealMinimumCashCents ?? null;
123
+ }
124
+ return snap;
125
+ }
126
+ //# sourceMappingURL=serviceListingDealPreferences.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serviceListingDealPreferences.js","sourceRoot":"","sources":["../../../src/utils/service/serviceListingDealPreferences.ts"],"names":[],"mappings":"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"}
@@ -16,7 +16,10 @@ export declare function getPublicBashMemoriesPath(bashEventId: string, slug: str
16
16
  export declare function getBashEventWizardStepPath(bashEventId: string, majorStep: number, subStep: number): string;
17
17
  /** Host redirect target: "How" → Payout (Stripe Connect / ticket proceeds). */
18
18
  export declare function getBashEventWizardPayoutStepPath(bashEventId: string): string;
19
- /** Create / resume at Getting Started (Templates). Defaults to the `new` draft. */
19
+ /**
20
+ * New drafts open on Generate (flyer upload + AI).
21
+ * An existing event id still opens Quick bash so resume does not dump hosts into the composer.
22
+ */
20
23
  export declare function getBashEventWizardStartPath(bashEventId?: string): string;
21
24
  export declare function parseBashUrlParams(param: string): {
22
25
  id: string;
@@ -1 +1 @@
1
- {"version":3,"file":"slugUtils.d.ts","sourceRoot":"","sources":["../../src/utils/slugUtils.ts"],"names":[],"mappings":"AAwCA,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAMlD;AAED,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,MAAM,EACb,eAAe,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,EACvE,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,MAAM,CAAC,CAajB;AAED,wBAAgB,qBAAqB,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAE/E;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAC9B,MAAM,CAMR;AAED;;;;GAIG;AACH,wBAAgB,yBAAyB,CACvC,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAC9B,MAAM,CAER;AAED,yFAAyF;AACzF,wBAAgB,0BAA0B,CACxC,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,GACd,MAAM,CAER;AAED,+EAA+E;AAC/E,wBAAgB,gCAAgC,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAM5E;AAED,mFAAmF;AACnF,wBAAgB,2BAA2B,CAAC,WAAW,SAAQ,GAAG,MAAM,CAMvE;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GAAG,IAAI,CAqB5F;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAGlD"}
1
+ {"version":3,"file":"slugUtils.d.ts","sourceRoot":"","sources":["../../src/utils/slugUtils.ts"],"names":[],"mappings":"AAyCA,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAMlD;AAED,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,MAAM,EACb,eAAe,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,EACvE,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,MAAM,CAAC,CAajB;AAED,wBAAgB,qBAAqB,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAE/E;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAC9B,MAAM,CAMR;AAED;;;;GAIG;AACH,wBAAgB,yBAAyB,CACvC,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAC9B,MAAM,CAER;AAED,yFAAyF;AACzF,wBAAgB,0BAA0B,CACxC,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,GACd,MAAM,CAER;AAED,+EAA+E;AAC/E,wBAAgB,gCAAgC,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAM5E;AAED;;;GAGG;AACH,wBAAgB,2BAA2B,CAAC,WAAW,SAAQ,GAAG,MAAM,CAavE;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GAAG,IAAI,CAqB5F;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAGlD"}
@@ -1,5 +1,5 @@
1
1
  import * as slugifyImport from "slugify";
2
- import { BASH_DETAIL_URL, BASH_EVENT_WIZARD_HOW_MAJOR_STEP, BASH_EVENT_WIZARD_HOW_SUBSTEP_PAYOUT, BASH_EVENT_WIZARD_MAJOR, BASH_EVENT_WIZARD_PATH_PREFIX, BASH_EVENT_WIZARD_TEMPLATES_SUBSTEP, } from '../definitions.js';
2
+ import { BASH_DETAIL_URL, BASH_EVENT_WIZARD_GENERATE_SUBSTEP, BASH_EVENT_WIZARD_HOW_MAJOR_STEP, BASH_EVENT_WIZARD_HOW_SUBSTEP_PAYOUT, BASH_EVENT_WIZARD_MAJOR, BASH_EVENT_WIZARD_PATH_PREFIX, BASH_EVENT_WIZARD_TEMPLATES_SUBSTEP, } from '../definitions.js';
3
3
  function isSlugifyFn(value) {
4
4
  return typeof value === "function";
5
5
  }
@@ -67,8 +67,14 @@ export function getBashEventWizardStepPath(bashEventId, majorStep, subStep) {
67
67
  export function getBashEventWizardPayoutStepPath(bashEventId) {
68
68
  return getBashEventWizardStepPath(bashEventId, BASH_EVENT_WIZARD_HOW_MAJOR_STEP, BASH_EVENT_WIZARD_HOW_SUBSTEP_PAYOUT);
69
69
  }
70
- /** Create / resume at Getting Started (Templates). Defaults to the `new` draft. */
70
+ /**
71
+ * New drafts open on Generate (flyer upload + AI).
72
+ * An existing event id still opens Quick bash so resume does not dump hosts into the composer.
73
+ */
71
74
  export function getBashEventWizardStartPath(bashEventId = "new") {
75
+ if (bashEventId === "new") {
76
+ return getBashEventWizardStepPath(bashEventId, BASH_EVENT_WIZARD_MAJOR.GENERATE, BASH_EVENT_WIZARD_GENERATE_SUBSTEP.START);
77
+ }
72
78
  return getBashEventWizardStepPath(bashEventId, BASH_EVENT_WIZARD_MAJOR.TEMPLATES, BASH_EVENT_WIZARD_TEMPLATES_SUBSTEP.START);
73
79
  }
74
80
  export function parseBashUrlParams(param) {
@@ -1 +1 @@
1
- {"version":3,"file":"slugUtils.js","sourceRoot":"","sources":["../../src/utils/slugUtils.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"slugUtils.js","sourceRoot":"","sources":["../../src/utils/slugUtils.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bash-app/bash-common",
3
- "version": "30.408.0",
3
+ "version": "30.413.0",
4
4
  "description": "Common data and scripts to use on the frontend and backend",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -37,7 +37,7 @@
37
37
  "@aws-sdk/client-textract": "^3.1004.0",
38
38
  "@aws-sdk/s3-request-presigner": "^3.1004.0",
39
39
  "@types/qrcode": "^1.5.5",
40
- "lodash-es": "^4.17.21",
40
+ "lodash-es": "4.18.1",
41
41
  "mixpanel-browser": "^2.75.0",
42
42
  "qrcode": "^1.5.3",
43
43
  "slugify": "^1.6.6"
@@ -76,5 +76,8 @@
76
76
  ],
77
77
  "publishConfig": {
78
78
  "access": "public"
79
+ },
80
+ "overrides": {
81
+ "lodash-es": "4.18.1"
79
82
  }
80
83
  }
@@ -913,6 +913,10 @@ model BashEvent {
913
913
  timezone String?
914
914
  startDateTime DateTime?
915
915
  endDateTime DateTime?
916
+ /// Wall clock kept when Duplicate clears the calendar day (hour/minute + overnight).
917
+ pendingScheduleClock Json?
918
+ /// When false, public pages and checkout hide sibling series dates and sell only this occurrence.
919
+ advertiseRecurrence Boolean @default(true)
916
920
  waiverUrl String?
917
921
  waiverRequired Boolean @default(false)
918
922
  waiverDisplayType String? @default("inline")
@@ -1122,6 +1126,12 @@ model BashEvent {
1122
1126
  fundingShowPledgesOnMeter Boolean @default(false)
1123
1127
  /// When true on Rsvp-mode events, affirmative RSVPs land in a host approval queue first.
1124
1128
  rsvpRequiresApproval Boolean @default(false)
1129
+ /// Host-set password that gates the public bash page. Null = off. Never returned to clients.
1130
+ eventAccessPasswordHash String?
1131
+ /// HMAC of the host-issued door staff code. Null = off. Never returned to clients.
1132
+ doorAccessCodeDigest String? @unique
1133
+ /// When false, guests cannot start a peer-to-peer ticket transfer. Default on.
1134
+ allowTicketTransfers Boolean @default(true)
1125
1135
  /// Hide when guests RSVP'd on host-facing attendee views.
1126
1136
  hideRsvpTimestamps Boolean @default(false)
1127
1137
  /// Only allow inviting people who share a mutual bash with the host.
@@ -5900,6 +5910,14 @@ model EventService {
5900
5910
  fulfillmentModes String[] @default([])
5901
5911
  /// Minimum advance-notice days required for F&B bookings (e.g. 7 = one week).
5902
5912
  leadTimeDays Int?
5913
+ openToRevenueShareWithHost Boolean @default(false)
5914
+ revenueShareWithHostPercentage Int?
5915
+ revenueShareWithHostBasis String?
5916
+ openToInKindDeals Boolean @default(false)
5917
+ inKindDealOfferText String?
5918
+ inKindEstimatedValueCents Int?
5919
+ dealRequiresMinimumCash Boolean @default(false)
5920
+ dealMinimumCashCents Int?
5903
5921
  crowdSize AmountOfGuests? @relation(fields: [crowdSizeId], references: [id], onDelete: Cascade)
5904
5922
  serviceRange ServiceRange? @relation(fields: [serviceRangeId], references: [id])
5905
5923
  service Service?
@@ -5958,6 +5976,14 @@ model EntertainmentService {
5958
5976
  minimumQuantity Int?
5959
5977
  tierPricing Json?
5960
5978
  pricingNotes String?
5979
+ openToRevenueShareWithHost Boolean @default(false)
5980
+ revenueShareWithHostPercentage Int?
5981
+ revenueShareWithHostBasis String?
5982
+ openToInKindDeals Boolean @default(false)
5983
+ inKindDealOfferText String?
5984
+ inKindEstimatedValueCents Int?
5985
+ dealRequiresMinimumCash Boolean @default(false)
5986
+ dealMinimumCashCents Int?
5961
5987
  crowdSize AmountOfGuests? @relation(fields: [crowdSizeId], references: [id], onDelete: Cascade)
5962
5988
  serviceRange ServiceRange? @relation(fields: [serviceRangeId], references: [id])
5963
5989
  service Service?
@@ -6072,6 +6098,18 @@ model VendorPreferences {
6072
6098
  bidMinLeadDays Int?
6073
6099
  /// small | medium | large — typical event size the vendor prefers.
6074
6100
  bidProjectSize String?
6101
+ /// Partner offers a revenue share with the host instead of (or in addition to) upfront fees.
6102
+ openToRevenueShareWithHost Boolean @default(false)
6103
+ /// 0..100 — share of the partner's relevant sales paid to the host.
6104
+ revenueShareWithHostPercentage Int?
6105
+ /// ALL_SALES | REFERRAL_ATTRIBUTED — which sales count toward the share.
6106
+ revenueShareWithHostBasis String?
6107
+ openToInKindDeals Boolean @default(false)
6108
+ inKindDealOfferText String?
6109
+ inKindEstimatedValueCents Int?
6110
+ /// Minimum cash (cents) required alongside rev-share or in-kind deals.
6111
+ dealRequiresMinimumCash Boolean @default(false)
6112
+ dealMinimumCashCents Int?
6075
6113
  createdAt DateTime @default(now())
6076
6114
  updatedAt DateTime @updatedAt
6077
6115
  vendor Vendor @relation(fields: [vendorId], references: [id], onDelete: Cascade)
@@ -6150,6 +6188,14 @@ model Exhibitor {
6150
6188
  bidMinLeadDays Int?
6151
6189
  /// small | medium | large — typical event size the exhibitor is comfortable with.
6152
6190
  bidProjectSize String?
6191
+ openToRevenueShareWithHost Boolean @default(false)
6192
+ revenueShareWithHostPercentage Int?
6193
+ revenueShareWithHostBasis String?
6194
+ openToInKindDeals Boolean @default(false)
6195
+ inKindDealOfferText String?
6196
+ inKindEstimatedValueCents Int?
6197
+ dealRequiresMinimumCash Boolean @default(false)
6198
+ dealMinimumCashCents Int?
6153
6199
 
6154
6200
  crowdSize AmountOfGuests? @relation(fields: [crowdSizeId], references: [id], onDelete: Cascade)
6155
6201
  serviceRange ServiceRange? @relation(fields: [serviceRangeId], references: [id])
@@ -6186,6 +6232,14 @@ model Sponsor {
6186
6232
  bidMinLeadDays Int?
6187
6233
  /// small | medium | large — typical event size the sponsor is comfortable with.
6188
6234
  bidProjectSize String?
6235
+ openToRevenueShareWithHost Boolean @default(false)
6236
+ revenueShareWithHostPercentage Int?
6237
+ revenueShareWithHostBasis String?
6238
+ openToInKindDeals Boolean @default(false)
6239
+ inKindDealOfferText String?
6240
+ inKindEstimatedValueCents Int?
6241
+ dealRequiresMinimumCash Boolean @default(false)
6242
+ dealMinimumCashCents Int?
6189
6243
 
6190
6244
  service Service?
6191
6245
  crowdSize AmountOfGuests? @relation(fields: [crowdSizeId], references: [id])
@@ -6277,6 +6331,11 @@ model Venue {
6277
6331
  revenueShareBasis String?
6278
6332
  /// Free-form notes shown next to the rev-share split.
6279
6333
  revenueShareNotes String?
6334
+ openToInKindDeals Boolean @default(false)
6335
+ inKindDealOfferText String?
6336
+ inKindEstimatedValueCents Int?
6337
+ dealRequiresMinimumCash Boolean @default(false)
6338
+ dealMinimumCashCents Int?
6280
6339
 
6281
6340
  fbCarryoverCredits VenueFBCarryoverCredit[]
6282
6341
  fbMinimumOverrides VenueFBMinimumOverride[]
@@ -8075,6 +8134,15 @@ model ServiceBooking {
8075
8134
  revenueShareHostPctSnapshot Int?
8076
8135
  /// Snapshot of `Venue.revenueShareBasis`.
8077
8136
  revenueShareBasisSnapshot String?
8137
+ /// Partner / venue deal prefs at confirmation (rev-share, in-kind, min cash).
8138
+ openToRevenueShareWithHostSnapshot Boolean?
8139
+ revenueShareWithHostPercentageSnapshot Int?
8140
+ revenueShareWithHostBasisSnapshot String?
8141
+ openToInKindDealsSnapshot Boolean?
8142
+ inKindDealOfferTextSnapshot String?
8143
+ inKindEstimatedValueCentsSnapshot Int?
8144
+ dealRequiresMinimumCashSnapshot Boolean?
8145
+ dealMinimumCashCentsSnapshot Int?
8078
8146
  /// Computed venue rev-share owed (cents) at settlement.
8079
8147
  revenueShareCalculatedCents Int?
8080
8148
  // Settlement lifecycle state (drives dunning, retries, dispute window).
@@ -11494,6 +11562,7 @@ enum CreditSourceType {
11494
11562
  BirthdayReward // Annual BashPoints boost on user's birthday
11495
11563
  EventReferralReward // Per-event: attendee referred X friends, earned reward
11496
11564
  RsvpBonus // First positive RSVP per user per event
11565
+ AvailabilitySignal // Once per user per availability window period (anti-farm)
11497
11566
  TicketCheckout // Completing a free or paid checkout per user per event
11498
11567
  AttendanceBonus // Checking in at the event (per ticket)
11499
11568
  PostBeforeEvent // First BashFeed post linked to event before it ends
@@ -0,0 +1,62 @@
1
+ import type { ServiceExt } from "../extendedSchemas";
2
+ import {
3
+ readPartnerDealflowFields,
4
+ serviceListingOpenToInKindDeal,
5
+ } from "../utils/service/partnerDealflow";
6
+
7
+ describe("partnerDealflow", () => {
8
+ it("detects in-kind listings with non-empty offer text", () => {
9
+ const service = {
10
+ sponsor: {
11
+ openToInKindDeals: true,
12
+ inKindDealOfferText: "100 free socks",
13
+ },
14
+ } as ServiceExt;
15
+
16
+ expect(readPartnerDealflowFields(service)?.openToInKindDeals).toBe(true);
17
+ expect(serviceListingOpenToInKindDeal(service)).toBe(true);
18
+ });
19
+
20
+ it("rejects in-kind when offer text is blank", () => {
21
+ const service = {
22
+ sponsor: {
23
+ openToInKindDeals: true,
24
+ inKindDealOfferText: " ",
25
+ },
26
+ } as ServiceExt;
27
+
28
+ expect(serviceListingOpenToInKindDeal(service)).toBe(false);
29
+ });
30
+
31
+ it("reads dealflow from vendor preferences before flat partner rows", () => {
32
+ const service = {
33
+ vendor: {
34
+ preferences: {
35
+ openToInKindDeals: true,
36
+ inKindDealOfferText: "Sample trays",
37
+ dealRequiresMinimumCash: true,
38
+ dealMinimumCashCents: 5000,
39
+ },
40
+ },
41
+ sponsor: {
42
+ openToInKindDeals: true,
43
+ inKindDealOfferText: "should not win",
44
+ },
45
+ } as ServiceExt;
46
+
47
+ const row = readPartnerDealflowFields(service);
48
+ expect(row?.inKindDealOfferText).toBe("Sample trays");
49
+ expect(row?.dealMinimumCashCents).toBe(5000);
50
+ });
51
+
52
+ it("does not treat in-kind flag alone as a listing when toggle is off", () => {
53
+ const service = {
54
+ venue: {
55
+ openToInKindDeals: false,
56
+ inKindDealOfferText: "Free room night",
57
+ },
58
+ } as ServiceExt;
59
+
60
+ expect(serviceListingOpenToInKindDeal(service)).toBe(false);
61
+ });
62
+ });
@@ -0,0 +1,68 @@
1
+ import type { ServiceExt } from "../extendedSchemas";
2
+ import {
3
+ readPartnerRevenueShareFields,
4
+ serviceListingOpenToRevenueShare,
5
+ } from "../utils/service/partnerRevenueShareOptIn";
6
+
7
+ describe("partnerRevenueShareOptIn", () => {
8
+ it("treats venue ticket/bar rev share as discoverable without partner opt-in", () => {
9
+ const service = {
10
+ venue: {
11
+ revenueShareEnabled: true,
12
+ revenueShareHostPercentage: 10,
13
+ },
14
+ } as ServiceExt;
15
+
16
+ expect(serviceListingOpenToRevenueShare(service)).toBe(true);
17
+ expect(readPartnerRevenueShareFields(service)).toBeNull();
18
+ });
19
+
20
+ it("requires partner opt-in plus a non-null percentage", () => {
21
+ const openNoPct = {
22
+ vendor: {
23
+ preferences: {
24
+ openToRevenueShareWithHost: true,
25
+ revenueShareWithHostPercentage: null,
26
+ },
27
+ },
28
+ } as ServiceExt;
29
+
30
+ expect(serviceListingOpenToRevenueShare(openNoPct)).toBe(false);
31
+
32
+ const closedWithPct = {
33
+ vendor: {
34
+ preferences: {
35
+ openToRevenueShareWithHost: false,
36
+ revenueShareWithHostPercentage: 20,
37
+ },
38
+ },
39
+ } as ServiceExt;
40
+
41
+ expect(serviceListingOpenToRevenueShare(closedWithPct)).toBe(false);
42
+
43
+ const openZero = {
44
+ exhibitor: {
45
+ openToRevenueShareWithHost: true,
46
+ revenueShareWithHostPercentage: 0,
47
+ },
48
+ } as ServiceExt;
49
+
50
+ expect(serviceListingOpenToRevenueShare(openZero)).toBe(true);
51
+ });
52
+
53
+ it("reads rev-share fields from the first matching partner subtype", () => {
54
+ const service = {
55
+ eventService: {
56
+ openToRevenueShareWithHost: true,
57
+ revenueShareWithHostPercentage: 12,
58
+ revenueShareWithHostBasis: "REFERRAL_ATTRIBUTED",
59
+ },
60
+ } as ServiceExt;
61
+
62
+ expect(readPartnerRevenueShareFields(service)).toEqual({
63
+ openToRevenueShareWithHost: true,
64
+ revenueShareWithHostPercentage: 12,
65
+ revenueShareWithHostBasis: "REFERRAL_ATTRIBUTED",
66
+ });
67
+ });
68
+ });
@@ -0,0 +1,27 @@
1
+ import {
2
+ isReservedCustomBashEventTypeDisplayName,
3
+ } from "../definitions.js";
4
+
5
+ describe("isReservedCustomBashEventTypeDisplayName", () => {
6
+ it("blocks homepage synthetic section titles", () => {
7
+ expect(isReservedCustomBashEventTypeDisplayName("Featured")).toBe(true);
8
+ expect(isReservedCustomBashEventTypeDisplayName("Popular")).toBe(true);
9
+ expect(isReservedCustomBashEventTypeDisplayName("Trending")).toBe(true);
10
+ expect(isReservedCustomBashEventTypeDisplayName("Ideas")).toBe(true);
11
+ expect(isReservedCustomBashEventTypeDisplayName("Pro Events")).toBe(true);
12
+ expect(isReservedCustomBashEventTypeDisplayName("The crew's going")).toBe(
13
+ true
14
+ );
15
+ });
16
+
17
+ it("blocks built-in bash type labels", () => {
18
+ expect(isReservedCustomBashEventTypeDisplayName("Birthday")).toBe(true);
19
+ expect(isReservedCustomBashEventTypeDisplayName("House Party")).toBe(true);
20
+ });
21
+
22
+ it("allows novel custom labels", () => {
23
+ expect(isReservedCustomBashEventTypeDisplayName("Rooftop Party")).toBe(
24
+ false
25
+ );
26
+ });
27
+ });