@bash-app/bash-common 30.400.0 → 30.406.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.
- package/dist/__tests__/audienceImport.test.d.ts +2 -0
- package/dist/__tests__/audienceImport.test.d.ts.map +1 -0
- package/dist/__tests__/audienceImport.test.js +39 -0
- package/dist/__tests__/audienceImport.test.js.map +1 -0
- package/dist/__tests__/definitionsHelpers.test.js +34 -1
- package/dist/__tests__/definitionsHelpers.test.js.map +1 -1
- package/dist/__tests__/eventStaffRoles.test.d.ts +2 -0
- package/dist/__tests__/eventStaffRoles.test.d.ts.map +1 -0
- package/dist/__tests__/eventStaffRoles.test.js +37 -0
- package/dist/__tests__/eventStaffRoles.test.js.map +1 -0
- package/dist/audienceImport.d.ts +71 -0
- package/dist/audienceImport.d.ts.map +1 -0
- package/dist/audienceImport.js +115 -0
- package/dist/audienceImport.js.map +1 -0
- package/dist/definitions.d.ts +51 -2
- package/dist/definitions.d.ts.map +1 -1
- package/dist/definitions.js +223 -150
- package/dist/definitions.js.map +1 -1
- package/dist/eventStaffRoles.d.ts +39 -0
- package/dist/eventStaffRoles.d.ts.map +1 -0
- package/dist/eventStaffRoles.js +125 -0
- package/dist/eventStaffRoles.js.map +1 -0
- package/dist/extendedSchemas.d.ts +22 -1
- package/dist/extendedSchemas.d.ts.map +1 -1
- package/dist/extendedSchemas.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/utils/__tests__/locationVisibility.test.js +27 -1
- package/dist/utils/__tests__/locationVisibility.test.js.map +1 -1
- package/dist/utils/locationVisibility.d.ts +9 -0
- package/dist/utils/locationVisibility.d.ts.map +1 -1
- package/dist/utils/locationVisibility.js +13 -0
- package/dist/utils/locationVisibility.js.map +1 -1
- package/package.json +1 -1
- package/prisma/schema.prisma +154 -3
- package/src/__tests__/audienceImport.test.ts +58 -0
- package/src/__tests__/definitionsHelpers.test.ts +50 -0
- package/src/__tests__/eventStaffRoles.test.ts +50 -0
- package/src/audienceImport.ts +181 -0
- package/src/definitions.ts +260 -151
- package/src/eventStaffRoles.ts +168 -0
- package/src/extendedSchemas.ts +22 -1
- package/src/index.ts +2 -0
- package/src/utils/__tests__/locationVisibility.test.ts +38 -0
- package/src/utils/locationVisibility.ts +16 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audienceImport.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/audienceImport.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { compareBashVsPartifulTicketFees, importGuestDedupeKey, isAudienceImportDestination, isAudienceImportSource, mapCsvHeaderToImportField, normalizeImportEmail, normalizeImportPhone, stripeProcessingFeeCents, } from "../audienceImport.js";
|
|
2
|
+
describe("audienceImport", () => {
|
|
3
|
+
it("maps competitor CSV headers", () => {
|
|
4
|
+
expect(mapCsvHeaderToImportField("Attendee Email")).toBe("email");
|
|
5
|
+
expect(mapCsvHeaderToImportField("Ticket Type")).toBe("tierLabel");
|
|
6
|
+
expect(mapCsvHeaderToImportField("unknown col")).toBeUndefined();
|
|
7
|
+
expect(mapCsvHeaderToImportField("source")).toBeUndefined();
|
|
8
|
+
});
|
|
9
|
+
it("normalizes email and phone", () => {
|
|
10
|
+
expect(normalizeImportEmail(" A@B.com ")).toBe("a@b.com");
|
|
11
|
+
expect(normalizeImportEmail("not-an-email")).toBeUndefined();
|
|
12
|
+
expect(normalizeImportPhone("(555) 123-4567")).toBe("5551234567");
|
|
13
|
+
expect(normalizeImportPhone("12")).toBeUndefined();
|
|
14
|
+
});
|
|
15
|
+
it("dedupes by email then phone then external id", () => {
|
|
16
|
+
expect(importGuestDedupeKey({ source: "Eventbrite", email: "A@b.com" })).toBe("email:a@b.com");
|
|
17
|
+
expect(importGuestDedupeKey({ source: "Luma", phone: "5551234567" })).toBe("phone:5551234567");
|
|
18
|
+
expect(importGuestDedupeKey({ source: "Posh", externalId: "ord-1" })).toBe("ext:Posh:ord-1");
|
|
19
|
+
expect(importGuestDedupeKey({ source: "GenericCsv" })).toBeUndefined();
|
|
20
|
+
});
|
|
21
|
+
it("compares Bash vs Partiful with guest-pays primary", () => {
|
|
22
|
+
const result = compareBashVsPartifulTicketFees({
|
|
23
|
+
ticketPriceCents: 10000,
|
|
24
|
+
quantity: 1,
|
|
25
|
+
});
|
|
26
|
+
expect(result.bash.guestPaysCents).toBe(10000);
|
|
27
|
+
expect(result.bash.hostNetsCents).toBe(10000 - stripeProcessingFeeCents(10000));
|
|
28
|
+
expect(result.partiful.guestPaysCents).toBe(11200);
|
|
29
|
+
expect(result.partiful.hostNetsCents).toBe(10000);
|
|
30
|
+
expect(result.citation).toMatch(/June 2026/);
|
|
31
|
+
});
|
|
32
|
+
it("guards source and destination unions", () => {
|
|
33
|
+
expect(isAudienceImportSource("Eventbrite")).toBe(true);
|
|
34
|
+
expect(isAudienceImportSource("Dice")).toBe(false);
|
|
35
|
+
expect(isAudienceImportDestination("crm")).toBe(true);
|
|
36
|
+
expect(isAudienceImportDestination("sms")).toBe(false);
|
|
37
|
+
});
|
|
38
|
+
});
|
|
39
|
+
//# sourceMappingURL=audienceImport.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audienceImport.test.js","sourceRoot":"","sources":["../../src/__tests__/audienceImport.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { describe, expect, test } from "@jest/globals";
|
|
2
|
-
import { createEmptyFilterFields, removeDataFromResult, canonicalBashEventRowKey, homepageBashEventRowKey, isUnsetBashEventType, 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";
|
|
2
|
+
import { createEmptyFilterFields, removeDataFromResult, canonicalBashEventRowKey, homepageBashEventRowKey, isUnsetBashEventType, 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, isIntroIntentId, INTRO_INTENT_OPTIONS, isLocusOfControlId, LOCUS_OF_CONTROL_OPTIONS, hasSensingIntuitionOverlap, personalityOverlapHint, normalizePersonalityType, isInterestExpressionMode, sharedIntroIntentHint, locusOfControlShortLabel, } from "../definitions.js";
|
|
3
3
|
describe("definitions helpers", () => {
|
|
4
4
|
describe("createEmptyFilterFields", () => {
|
|
5
5
|
test("returns fresh arrays not shared with EMPTY_FILTER_FIELDS", () => {
|
|
@@ -111,5 +111,38 @@ describe("definitions helpers", () => {
|
|
|
111
111
|
expect(complementaryServiceTypeFor(ServiceTypes.EntertainmentServices)).toBeUndefined();
|
|
112
112
|
});
|
|
113
113
|
});
|
|
114
|
+
describe("Intros intents", () => {
|
|
115
|
+
test("accepts the three platonic/professional intent ids", () => {
|
|
116
|
+
expect(INTRO_INTENT_OPTIONS.map((option) => option.id)).toEqual([
|
|
117
|
+
"friends",
|
|
118
|
+
"professional",
|
|
119
|
+
"mentorship",
|
|
120
|
+
]);
|
|
121
|
+
expect(isIntroIntentId("friends")).toBe(true);
|
|
122
|
+
expect(isIntroIntentId("dating")).toBe(false);
|
|
123
|
+
});
|
|
124
|
+
test("normalizes personality type and detects S/N overlap", () => {
|
|
125
|
+
expect(normalizePersonalityType("enfp!")).toBe("ENFP");
|
|
126
|
+
expect(normalizePersonalityType(" ")).toBeNull();
|
|
127
|
+
expect(hasSensingIntuitionOverlap("ENFP", "INTJ")).toBe(true);
|
|
128
|
+
expect(hasSensingIntuitionOverlap("ESFP", "INTJ")).toBe(false);
|
|
129
|
+
expect(personalityOverlapHint("ENFP", "INTJ")).toBe("You both picked N — good icebreaker.");
|
|
130
|
+
expect(isLocusOfControlId("internal")).toBe(true);
|
|
131
|
+
expect(isLocusOfControlId("random")).toBe(false);
|
|
132
|
+
expect(LOCUS_OF_CONTROL_OPTIONS.map((option) => option.id)).toEqual([
|
|
133
|
+
"internal",
|
|
134
|
+
"external",
|
|
135
|
+
"mixed",
|
|
136
|
+
]);
|
|
137
|
+
expect(isInterestExpressionMode("named")).toBe(true);
|
|
138
|
+
expect(isInterestExpressionMode("crush")).toBe(false);
|
|
139
|
+
});
|
|
140
|
+
test("shared intro intent and locus labels stay conversational", () => {
|
|
141
|
+
expect(sharedIntroIntentHint(["friends", "mentorship"], ["professional", "friends"])).toBe("You're both here for making friends.");
|
|
142
|
+
expect(sharedIntroIntentHint(["friends"], ["professional"])).toBeNull();
|
|
143
|
+
expect(locusOfControlShortLabel("internal")).toBe("Internal");
|
|
144
|
+
expect(locusOfControlShortLabel("nope")).toBeNull();
|
|
145
|
+
});
|
|
146
|
+
});
|
|
114
147
|
});
|
|
115
148
|
//# sourceMappingURL=definitionsHelpers.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"definitionsHelpers.test.js","sourceRoot":"","sources":["../../src/__tests__/definitionsHelpers.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,EACL,uBAAuB,EACvB,oBAAoB,EACpB,wBAAwB,EACxB,uBAAuB,EACvB,oBAAoB,EACpB,2BAA2B,EAC3B,mBAAmB,EACnB,mBAAmB,EACnB,6BAA6B,EAC7B,uBAAuB,EACvB,yBAAyB,EACzB,gCAAgC,EAChC,0BAA0B,EAC1B,2BAA2B,EAC3B,YAAY,
|
|
1
|
+
{"version":3,"file":"definitionsHelpers.test.js","sourceRoot":"","sources":["../../src/__tests__/definitionsHelpers.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eventStaffRoles.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/eventStaffRoles.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { associatedBashCanAccessDoor, associatedBashCanEditEvent, isEventStaffRole, roleFromLegacyFlags, writeThroughAssociatedBashFlags, } from "../eventStaffRoles.js";
|
|
2
|
+
describe("eventStaffRoles", () => {
|
|
3
|
+
it("write-through keeps organizer and door flags in sync", () => {
|
|
4
|
+
expect(writeThroughAssociatedBashFlags("Organizer", true)).toEqual({
|
|
5
|
+
isOrganizer: true,
|
|
6
|
+
isDoorStaff: false,
|
|
7
|
+
isCoHost: true,
|
|
8
|
+
});
|
|
9
|
+
expect(writeThroughAssociatedBashFlags("DoorStaff")).toEqual({
|
|
10
|
+
isOrganizer: false,
|
|
11
|
+
isDoorStaff: true,
|
|
12
|
+
isCoHost: false,
|
|
13
|
+
});
|
|
14
|
+
expect(writeThroughAssociatedBashFlags("Promoter").isOrganizer).toBe(false);
|
|
15
|
+
});
|
|
16
|
+
it("edit access honors role when set, else isOrganizer", () => {
|
|
17
|
+
expect(associatedBashCanEditEvent({ eventRole: "Organizer" })).toBe(true);
|
|
18
|
+
expect(associatedBashCanEditEvent({ eventRole: "DoorStaff" })).toBe(false);
|
|
19
|
+
expect(associatedBashCanEditEvent({ eventRole: "Admin", canEditEvent: false })).toBe(false);
|
|
20
|
+
expect(associatedBashCanEditEvent({ isOrganizer: true })).toBe(true);
|
|
21
|
+
expect(associatedBashCanEditEvent({ isOrganizer: false })).toBe(false);
|
|
22
|
+
});
|
|
23
|
+
it("door access honors role when set, else legacy flags", () => {
|
|
24
|
+
expect(associatedBashCanAccessDoor({ eventRole: "DoorStaff" })).toBe(true);
|
|
25
|
+
expect(associatedBashCanAccessDoor({ eventRole: "Volunteer" })).toBe(false);
|
|
26
|
+
expect(associatedBashCanAccessDoor({ isDoorStaff: true })).toBe(true);
|
|
27
|
+
expect(associatedBashCanAccessDoor({ isOrganizer: true })).toBe(true);
|
|
28
|
+
});
|
|
29
|
+
it("maps legacy flags and validates roles", () => {
|
|
30
|
+
expect(roleFromLegacyFlags({ isDoorStaff: true, isOrganizer: false })).toBe("DoorStaff");
|
|
31
|
+
expect(roleFromLegacyFlags({ isOrganizer: true })).toBe("Organizer");
|
|
32
|
+
expect(roleFromLegacyFlags({})).toBeNull();
|
|
33
|
+
expect(isEventStaffRole("Admin")).toBe(true);
|
|
34
|
+
expect(isEventStaffRole("Owner")).toBe(false);
|
|
35
|
+
});
|
|
36
|
+
});
|
|
37
|
+
//# sourceMappingURL=eventStaffRoles.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eventStaffRoles.test.js","sourceRoot":"","sources":["../../src/__tests__/eventStaffRoles.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Competitor audience import — shared types, CSV header maps, and fee comparison math.
|
|
3
|
+
* Adapters normalize Eventbrite / Luma / Partiful / Posh / generic CSVs into one row shape.
|
|
4
|
+
*/
|
|
5
|
+
export declare const AUDIENCE_IMPORT_SOURCES: readonly ["Eventbrite", "Luma", "Partiful", "Posh", "GenericCsv"];
|
|
6
|
+
export type AudienceImportSource = (typeof AUDIENCE_IMPORT_SOURCES)[number];
|
|
7
|
+
export declare const AUDIENCE_IMPORT_DESTINATIONS: readonly ["admission", "crm", "standingGuestlist"];
|
|
8
|
+
export type AudienceImportDestination = (typeof AUDIENCE_IMPORT_DESTINATIONS)[number];
|
|
9
|
+
export type NormalizedImportGuest = {
|
|
10
|
+
source: AudienceImportSource;
|
|
11
|
+
externalId?: string;
|
|
12
|
+
fullName?: string;
|
|
13
|
+
email?: string;
|
|
14
|
+
phone?: string;
|
|
15
|
+
rsvpOrOrderStatus?: string;
|
|
16
|
+
tierLabel?: string;
|
|
17
|
+
checkedInAt?: string;
|
|
18
|
+
isComp?: boolean;
|
|
19
|
+
plusOnes?: number;
|
|
20
|
+
importedExternalPaid?: boolean;
|
|
21
|
+
};
|
|
22
|
+
export type AudienceImportPreviewRow = NormalizedImportGuest & {
|
|
23
|
+
willImport: boolean;
|
|
24
|
+
skipReason?: string;
|
|
25
|
+
};
|
|
26
|
+
export type AudienceImportCommitResult = {
|
|
27
|
+
added: number;
|
|
28
|
+
skipped: number;
|
|
29
|
+
failed: number;
|
|
30
|
+
failures: Array<{
|
|
31
|
+
email?: string;
|
|
32
|
+
fullName?: string;
|
|
33
|
+
reason: string;
|
|
34
|
+
}>;
|
|
35
|
+
};
|
|
36
|
+
export declare const MAX_IMPORT_ROWS = 5000;
|
|
37
|
+
export declare const IMPORT_BATCH_SIZE = 500;
|
|
38
|
+
/** Partiful's published June 2026 example: guest pays $112 for a $100 organizer price. */
|
|
39
|
+
export declare const PARTIFUL_PUBLISHED_GUEST_MULTIPLIER: number;
|
|
40
|
+
export declare const PARTIFUL_FEE_EXAMPLE_CITATION = "Based on Partiful's published June 2026 example \u2014 their fee varies by event.";
|
|
41
|
+
export type TicketFeeCompareInput = {
|
|
42
|
+
ticketPriceCents: number;
|
|
43
|
+
quantity: number;
|
|
44
|
+
};
|
|
45
|
+
export type TicketFeeCompareSide = {
|
|
46
|
+
guestPaysCents: number;
|
|
47
|
+
hostNetsCents: number;
|
|
48
|
+
};
|
|
49
|
+
export type TicketFeeCompareResult = {
|
|
50
|
+
bash: TicketFeeCompareSide;
|
|
51
|
+
partiful: TicketFeeCompareSide;
|
|
52
|
+
citation: string;
|
|
53
|
+
};
|
|
54
|
+
export declare function stripeProcessingFeeCents(amountCents: number): number;
|
|
55
|
+
/**
|
|
56
|
+
* Guest-pays is the primary comparison. Host-nets is secondary.
|
|
57
|
+
* Bash HostAbsorbs: guest pays listed price; host nets listed minus Stripe.
|
|
58
|
+
* Partiful fee-inclusive: guest pays listed × published multiplier; host receives listed.
|
|
59
|
+
*/
|
|
60
|
+
export declare function compareBashVsPartifulTicketFees(input: TicketFeeCompareInput): TicketFeeCompareResult;
|
|
61
|
+
export declare function normalizeImportEmail(value: string | undefined | null): string | undefined;
|
|
62
|
+
export declare function normalizeImportPhone(value: string | undefined | null): string | undefined;
|
|
63
|
+
export declare function importGuestDedupeKey(guest: NormalizedImportGuest): string | undefined;
|
|
64
|
+
/** CSV columns never overwrite `source` (set by the importer) or `importedExternalPaid`. */
|
|
65
|
+
export type AudienceImportCsvMappedField = Exclude<keyof NormalizedImportGuest, "source" | "importedExternalPaid">;
|
|
66
|
+
/** Competitor + generic CSV headers → NormalizedImportGuest fields. */
|
|
67
|
+
export declare const AUDIENCE_IMPORT_CSV_HEADERS: Record<string, AudienceImportCsvMappedField>;
|
|
68
|
+
export declare function mapCsvHeaderToImportField(header: string): AudienceImportCsvMappedField | undefined;
|
|
69
|
+
export declare function isAudienceImportSource(value: string): value is AudienceImportSource;
|
|
70
|
+
export declare function isAudienceImportDestination(value: string): value is AudienceImportDestination;
|
|
71
|
+
//# sourceMappingURL=audienceImport.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audienceImport.d.ts","sourceRoot":"","sources":["../src/audienceImport.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Competitor audience import — shared types, CSV header maps, and fee comparison math.
|
|
3
|
+
* Adapters normalize Eventbrite / Luma / Partiful / Posh / generic CSVs into one row shape.
|
|
4
|
+
*/
|
|
5
|
+
import { calculateStripeProcessingFeeCents } from "./utils/paymentUtils.js";
|
|
6
|
+
export const AUDIENCE_IMPORT_SOURCES = [
|
|
7
|
+
"Eventbrite",
|
|
8
|
+
"Luma",
|
|
9
|
+
"Partiful",
|
|
10
|
+
"Posh",
|
|
11
|
+
"GenericCsv",
|
|
12
|
+
];
|
|
13
|
+
export const AUDIENCE_IMPORT_DESTINATIONS = [
|
|
14
|
+
"admission",
|
|
15
|
+
"crm",
|
|
16
|
+
"standingGuestlist",
|
|
17
|
+
];
|
|
18
|
+
export const MAX_IMPORT_ROWS = 5000;
|
|
19
|
+
export const IMPORT_BATCH_SIZE = 500;
|
|
20
|
+
/** Partiful's published June 2026 example: guest pays $112 for a $100 organizer price. */
|
|
21
|
+
export const PARTIFUL_PUBLISHED_GUEST_MULTIPLIER = 112 / 100;
|
|
22
|
+
export const PARTIFUL_FEE_EXAMPLE_CITATION = "Based on Partiful's published June 2026 example — their fee varies by event.";
|
|
23
|
+
export function stripeProcessingFeeCents(amountCents) {
|
|
24
|
+
return calculateStripeProcessingFeeCents(amountCents);
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Guest-pays is the primary comparison. Host-nets is secondary.
|
|
28
|
+
* Bash HostAbsorbs: guest pays listed price; host nets listed minus Stripe.
|
|
29
|
+
* Partiful fee-inclusive: guest pays listed × published multiplier; host receives listed.
|
|
30
|
+
*/
|
|
31
|
+
export function compareBashVsPartifulTicketFees(input) {
|
|
32
|
+
const qty = Math.max(1, Math.floor(input.quantity) || 1);
|
|
33
|
+
const listed = Math.max(0, Math.floor(input.ticketPriceCents)) * qty;
|
|
34
|
+
const bashStripe = stripeProcessingFeeCents(listed);
|
|
35
|
+
const partifulGuest = Math.round(listed * PARTIFUL_PUBLISHED_GUEST_MULTIPLIER);
|
|
36
|
+
return {
|
|
37
|
+
bash: {
|
|
38
|
+
guestPaysCents: listed,
|
|
39
|
+
hostNetsCents: Math.max(0, listed - bashStripe),
|
|
40
|
+
},
|
|
41
|
+
partiful: {
|
|
42
|
+
guestPaysCents: partifulGuest,
|
|
43
|
+
hostNetsCents: listed,
|
|
44
|
+
},
|
|
45
|
+
citation: PARTIFUL_FEE_EXAMPLE_CITATION,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
export function normalizeImportEmail(value) {
|
|
49
|
+
const trimmed = value?.trim().toLowerCase();
|
|
50
|
+
return trimmed && trimmed.includes("@") ? trimmed : undefined;
|
|
51
|
+
}
|
|
52
|
+
export function normalizeImportPhone(value) {
|
|
53
|
+
const digits = (value ?? "").replace(/\D/g, "");
|
|
54
|
+
if (digits.length < 7)
|
|
55
|
+
return undefined;
|
|
56
|
+
return digits;
|
|
57
|
+
}
|
|
58
|
+
export function importGuestDedupeKey(guest) {
|
|
59
|
+
const email = normalizeImportEmail(guest.email);
|
|
60
|
+
if (email)
|
|
61
|
+
return `email:${email}`;
|
|
62
|
+
const phone = normalizeImportPhone(guest.phone);
|
|
63
|
+
if (phone)
|
|
64
|
+
return `phone:${phone}`;
|
|
65
|
+
if (guest.externalId?.trim())
|
|
66
|
+
return `ext:${guest.source}:${guest.externalId.trim()}`;
|
|
67
|
+
return undefined;
|
|
68
|
+
}
|
|
69
|
+
/** Competitor + generic CSV headers → NormalizedImportGuest fields. */
|
|
70
|
+
export const AUDIENCE_IMPORT_CSV_HEADERS = {
|
|
71
|
+
"full name": "fullName",
|
|
72
|
+
name: "fullName",
|
|
73
|
+
"attendee name": "fullName",
|
|
74
|
+
"ticket buyer name": "fullName",
|
|
75
|
+
"first name last name": "fullName",
|
|
76
|
+
guest: "fullName",
|
|
77
|
+
"guest name": "fullName",
|
|
78
|
+
"first name": "fullName",
|
|
79
|
+
email: "email",
|
|
80
|
+
"e-mail": "email",
|
|
81
|
+
"email address": "email",
|
|
82
|
+
"attendee email": "email",
|
|
83
|
+
"ticket holder email": "email",
|
|
84
|
+
"buyer email": "email",
|
|
85
|
+
phone: "phone",
|
|
86
|
+
"phone number": "phone",
|
|
87
|
+
mobile: "phone",
|
|
88
|
+
cell: "phone",
|
|
89
|
+
status: "rsvpOrOrderStatus",
|
|
90
|
+
"rsvp status": "rsvpOrOrderStatus",
|
|
91
|
+
"order status": "rsvpOrOrderStatus",
|
|
92
|
+
"approval status": "rsvpOrOrderStatus",
|
|
93
|
+
"ticket type": "tierLabel",
|
|
94
|
+
"ticket class": "tierLabel",
|
|
95
|
+
tier: "tierLabel",
|
|
96
|
+
"order id": "externalId",
|
|
97
|
+
"attendee id": "externalId",
|
|
98
|
+
"guest id": "externalId",
|
|
99
|
+
"checked in": "checkedInAt",
|
|
100
|
+
"checked_in_at": "checkedInAt",
|
|
101
|
+
complimentary: "isComp",
|
|
102
|
+
comp: "isComp",
|
|
103
|
+
"plus ones": "plusOnes",
|
|
104
|
+
"plus ones count": "plusOnes",
|
|
105
|
+
};
|
|
106
|
+
export function mapCsvHeaderToImportField(header) {
|
|
107
|
+
return AUDIENCE_IMPORT_CSV_HEADERS[header.trim().toLowerCase()];
|
|
108
|
+
}
|
|
109
|
+
export function isAudienceImportSource(value) {
|
|
110
|
+
return AUDIENCE_IMPORT_SOURCES.includes(value);
|
|
111
|
+
}
|
|
112
|
+
export function isAudienceImportDestination(value) {
|
|
113
|
+
return AUDIENCE_IMPORT_DESTINATIONS.includes(value);
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=audienceImport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audienceImport.js","sourceRoot":"","sources":["../src/audienceImport.ts"],"names":[],"mappings":"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"}
|
package/dist/definitions.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { BashEventType, CompetitionType, Contact, DietaryOption, EntertainmentServiceType,
|
|
2
|
-
import type { AgePolicy as AgePolicyEnum, BashPassTier, BashEventDressTags, BashEventVibeTags, GovIdRetentionPolicy as GovIdRetentionPolicyEnum, ServiceBookingOfferStatus as ServiceBookingOfferStatusEnum, YearsOfExperience as YearsOfExperienceEnum } from "@prisma/client";
|
|
1
|
+
import { BashEventType, CompetitionType, Contact, DietaryOption, EntertainmentServiceType, JudgingType, MembershipTier, MusicGenreType, SchoolNameSource, ServiceTypes, Ticket, TicketTier, User } from "@prisma/client";
|
|
2
|
+
import type { AgePolicy as AgePolicyEnum, IncomeRange, BashPassTier, BashEventDressTags, BashEventVibeTags, GovIdRetentionPolicy as GovIdRetentionPolicyEnum, ServiceBookingOfferStatus as ServiceBookingOfferStatusEnum, YearsOfExperience as YearsOfExperienceEnum } from "@prisma/client";
|
|
3
3
|
import { CheckoutExt, PublicTeaserUser, PublicUser, ServiceBookingExt, type UserExt } from "./extendedSchemas.js";
|
|
4
4
|
import { LuxonDateRange } from "./utils/luxonUtils.js";
|
|
5
5
|
import { ApiServiceCantBookReason } from "./utils/service/apiServiceBookingApiUtils.js";
|
|
@@ -70,6 +70,48 @@ export declare const AgePolicy: {
|
|
|
70
70
|
readonly TwentyOnePlus: "TwentyOnePlus";
|
|
71
71
|
};
|
|
72
72
|
export type AgePolicy = AgePolicyEnum;
|
|
73
|
+
export declare const INTRO_INTENT_OPTIONS: readonly [{
|
|
74
|
+
readonly id: "friends";
|
|
75
|
+
readonly label: "Making friends";
|
|
76
|
+
}, {
|
|
77
|
+
readonly id: "professional";
|
|
78
|
+
readonly label: "Professional networking";
|
|
79
|
+
}, {
|
|
80
|
+
readonly id: "mentorship";
|
|
81
|
+
readonly label: "Finding a mentor or mentee";
|
|
82
|
+
}];
|
|
83
|
+
export type IntroIntentId = (typeof INTRO_INTENT_OPTIONS)[number]["id"];
|
|
84
|
+
export declare const INTRO_INTENT_IDS: readonly IntroIntentId[];
|
|
85
|
+
export declare function isIntroIntentId(value: string): value is IntroIntentId;
|
|
86
|
+
export declare const LOCUS_OF_CONTROL_OPTIONS: readonly [{
|
|
87
|
+
readonly id: "internal";
|
|
88
|
+
readonly label: "Internal — I shape my own outcomes";
|
|
89
|
+
}, {
|
|
90
|
+
readonly id: "external";
|
|
91
|
+
readonly label: "External — circumstances shape outcomes";
|
|
92
|
+
}, {
|
|
93
|
+
readonly id: "mixed";
|
|
94
|
+
readonly label: "Mixed — bit of both";
|
|
95
|
+
}];
|
|
96
|
+
export type LocusOfControlId = (typeof LOCUS_OF_CONTROL_OPTIONS)[number]["id"];
|
|
97
|
+
export declare const LOCUS_OF_CONTROL_IDS: readonly LocusOfControlId[];
|
|
98
|
+
export declare function isLocusOfControlId(value: string): value is LocusOfControlId;
|
|
99
|
+
export declare const PERSONALITY_TYPE_MAX_LENGTH = 4;
|
|
100
|
+
export declare function normalizePersonalityType(value: string | null | undefined): string | null;
|
|
101
|
+
/** True if two MBTI codes share the same second letter (S/N axis). */
|
|
102
|
+
export declare function hasSensingIntuitionOverlap(a: string, b: string): boolean;
|
|
103
|
+
export declare function personalityOverlapHint(a: string | null | undefined, b: string | null | undefined): string | null;
|
|
104
|
+
export declare function sharedIntroIntentHint(viewerIntents: readonly string[] | null | undefined, guestIntents: readonly string[] | null | undefined): string | null;
|
|
105
|
+
export declare function locusOfControlShortLabel(id: string | null | undefined): string | null;
|
|
106
|
+
export declare const INTEREST_EXPRESSION_MODES: readonly ["named", "anonymous"];
|
|
107
|
+
export type InterestExpressionMode = (typeof INTEREST_EXPRESSION_MODES)[number];
|
|
108
|
+
export declare function isInterestExpressionMode(value: string): value is InterestExpressionMode;
|
|
109
|
+
export declare const INTROS_DISCLAIMER = "Intros connects you only with people who have also explicitly opted in. Bash does not conduct background checks, verify identities beyond basic account registration, or screen users for any purpose. This feature supports platonic and professional connections only \u2014 romantic or sexual contact is a violation of our Community Guidelines. Always meet at the event, in public. Use the Report button if anyone makes you uncomfortable. By turning on Intros, you agree that Bash is not responsible for interactions between users.";
|
|
110
|
+
export declare const INTROS_DISCLAIMER_SHORT = "Bash does not background-check users. Meet at the event, in public. Romantic or sexual contact is prohibited. Bash is not responsible for interactions between users.";
|
|
111
|
+
/** @deprecated Use INTROS_DISCLAIMER */
|
|
112
|
+
export declare const SCENE_INTROS_DISCLAIMER = "Intros connects you only with people who have also explicitly opted in. Bash does not conduct background checks, verify identities beyond basic account registration, or screen users for any purpose. This feature supports platonic and professional connections only \u2014 romantic or sexual contact is a violation of our Community Guidelines. Always meet at the event, in public. Use the Report button if anyone makes you uncomfortable. By turning on Intros, you agree that Bash is not responsible for interactions between users.";
|
|
113
|
+
/** @deprecated Use INTROS_DISCLAIMER_SHORT */
|
|
114
|
+
export declare const SCENE_INTROS_DISCLAIMER_SHORT = "Bash does not background-check users. Meet at the event, in public. Romantic or sexual contact is prohibited. Bash is not responsible for interactions between users.";
|
|
73
115
|
export declare const PASSWORD_MIN_LENGTH: 8;
|
|
74
116
|
export declare const PASSWORD_REQUIREMENTS_REGEX: RegExp;
|
|
75
117
|
export declare const STRIPE_CHECKOUT_TIMEOUT_MS: 20000;
|
|
@@ -934,6 +976,8 @@ export interface StripeConfirmPaymentResult {
|
|
|
934
976
|
ticketsSubtotalCents?: number;
|
|
935
977
|
/** Actual amount charged to the guest (cents), including pass-through fees when applicable */
|
|
936
978
|
totalPaidCents?: number;
|
|
979
|
+
/** True when this is the buyer's first ticket purchase on Bash ever. */
|
|
980
|
+
isFirstTicketPurchase?: boolean;
|
|
937
981
|
}
|
|
938
982
|
export interface IMediaUploadArgs {
|
|
939
983
|
mimetype: string;
|
|
@@ -1079,6 +1123,11 @@ export type BashEventTypeToStringType = {
|
|
|
1079
1123
|
[key in BashEventType]: string;
|
|
1080
1124
|
};
|
|
1081
1125
|
export { BashEventType };
|
|
1126
|
+
/**
|
|
1127
|
+
* Keys are string literals (not `BashEventType.*`) so this module can load
|
|
1128
|
+
* when Jest's `@prisma/client` cache is briefly incomplete after resetModules
|
|
1129
|
+
* (see api/jest.setup.afterEnv.cjs). Same pattern as SERVICE_TYPE_LABELS.
|
|
1130
|
+
*/
|
|
1082
1131
|
export declare const BashEventTypeToString: BashEventTypeToStringType;
|
|
1083
1132
|
/**
|
|
1084
1133
|
* Positive-framed dietary accommodations a host can advertise on a bash and
|