@bash-app/bash-common 30.246.0 → 30.253.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/README.md +4 -0
- package/dist/__tests__/bashSectionTitleForBashType.test.js +32 -1
- package/dist/__tests__/bashSectionTitleForBashType.test.js.map +1 -1
- package/dist/__tests__/definitionsHelpers.test.d.ts +2 -0
- package/dist/__tests__/definitionsHelpers.test.d.ts.map +1 -0
- package/dist/__tests__/definitionsHelpers.test.js +85 -0
- package/dist/__tests__/definitionsHelpers.test.js.map +1 -0
- package/dist/__tests__/extendedSchemas.test.d.ts +2 -0
- package/dist/__tests__/extendedSchemas.test.d.ts.map +1 -0
- package/dist/__tests__/extendedSchemas.test.js +40 -0
- package/dist/__tests__/extendedSchemas.test.js.map +1 -0
- package/dist/__tests__/membershipDefinitions.test.d.ts +2 -0
- package/dist/__tests__/membershipDefinitions.test.d.ts.map +1 -0
- package/dist/__tests__/membershipDefinitions.test.js +95 -0
- package/dist/__tests__/membershipDefinitions.test.js.map +1 -0
- package/dist/__tests__/ticketAdmission.test.d.ts +5 -0
- package/dist/__tests__/ticketAdmission.test.d.ts.map +1 -0
- package/dist/__tests__/ticketAdmission.test.js +42 -0
- package/dist/__tests__/ticketAdmission.test.js.map +1 -0
- package/dist/__tests__/utmAttribution.test.d.ts +2 -0
- package/dist/__tests__/utmAttribution.test.d.ts.map +1 -0
- package/dist/__tests__/utmAttribution.test.js +92 -0
- package/dist/__tests__/utmAttribution.test.js.map +1 -0
- package/dist/definitions.d.ts +18 -5
- package/dist/definitions.d.ts.map +1 -1
- package/dist/definitions.js +84 -22
- package/dist/definitions.js.map +1 -1
- package/dist/extendedSchemas.d.ts +41 -1
- package/dist/extendedSchemas.d.ts.map +1 -1
- package/dist/extendedSchemas.js +27 -0
- package/dist/extendedSchemas.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/sms/smsTemplates.d.ts +27 -0
- package/dist/sms/smsTemplates.d.ts.map +1 -0
- package/dist/sms/smsTemplates.js +11 -0
- package/dist/sms/smsTemplates.js.map +1 -0
- package/dist/utils/__tests__/addressUtils.test.d.ts +2 -0
- package/dist/utils/__tests__/addressUtils.test.d.ts.map +1 -0
- package/dist/utils/__tests__/addressUtils.test.js +138 -0
- package/dist/utils/__tests__/addressUtils.test.js.map +1 -0
- package/dist/utils/__tests__/apiUtils.test.d.ts +5 -0
- package/dist/utils/__tests__/apiUtils.test.d.ts.map +1 -0
- package/dist/utils/__tests__/apiUtils.test.js +161 -0
- package/dist/utils/__tests__/apiUtils.test.js.map +1 -0
- package/dist/utils/__tests__/arrayUtils.test.d.ts +2 -0
- package/dist/utils/__tests__/arrayUtils.test.d.ts.map +1 -0
- package/dist/utils/__tests__/arrayUtils.test.js +23 -0
- package/dist/utils/__tests__/arrayUtils.test.js.map +1 -0
- package/dist/utils/__tests__/blogUtils.test.d.ts +2 -0
- package/dist/utils/__tests__/blogUtils.test.d.ts.map +1 -0
- package/dist/utils/__tests__/blogUtils.test.js +102 -0
- package/dist/utils/__tests__/blogUtils.test.js.map +1 -0
- package/dist/utils/__tests__/dateTimeUtils.test.d.ts +2 -0
- package/dist/utils/__tests__/dateTimeUtils.test.d.ts.map +1 -0
- package/dist/utils/__tests__/dateTimeUtils.test.js +180 -0
- package/dist/utils/__tests__/dateTimeUtils.test.js.map +1 -0
- package/dist/utils/__tests__/discountEngine/discountCalculator.test.d.ts +2 -0
- package/dist/utils/__tests__/discountEngine/discountCalculator.test.d.ts.map +1 -0
- package/dist/utils/__tests__/discountEngine/discountCalculator.test.js +356 -0
- package/dist/utils/__tests__/discountEngine/discountCalculator.test.js.map +1 -0
- package/dist/utils/__tests__/generalDateTimeUtils.test.d.ts +2 -0
- package/dist/utils/__tests__/generalDateTimeUtils.test.d.ts.map +1 -0
- package/dist/utils/__tests__/generalDateTimeUtils.test.js +26 -0
- package/dist/utils/__tests__/generalDateTimeUtils.test.js.map +1 -0
- package/dist/utils/__tests__/luxonUtils.test.d.ts +2 -0
- package/dist/utils/__tests__/luxonUtils.test.d.ts.map +1 -0
- package/dist/utils/__tests__/luxonUtils.test.js +139 -0
- package/dist/utils/__tests__/luxonUtils.test.js.map +1 -0
- package/dist/utils/__tests__/mathUtils.test.d.ts +5 -0
- package/dist/utils/__tests__/mathUtils.test.d.ts.map +1 -0
- package/dist/utils/__tests__/mathUtils.test.js +26 -0
- package/dist/utils/__tests__/mathUtils.test.js.map +1 -0
- package/dist/utils/__tests__/objUtils.test.d.ts +5 -0
- package/dist/utils/__tests__/objUtils.test.d.ts.map +1 -0
- package/dist/utils/__tests__/objUtils.test.js +41 -0
- package/dist/utils/__tests__/objUtils.test.js.map +1 -0
- package/dist/utils/__tests__/paymentUtils.test.js +48 -1
- package/dist/utils/__tests__/paymentUtils.test.js.map +1 -1
- package/dist/utils/__tests__/qrCodeUtils.test.js +16 -1
- package/dist/utils/__tests__/qrCodeUtils.test.js.map +1 -1
- package/dist/utils/__tests__/reviewUtils.test.d.ts +2 -0
- package/dist/utils/__tests__/reviewUtils.test.d.ts.map +1 -0
- package/dist/utils/__tests__/reviewUtils.test.js +49 -0
- package/dist/utils/__tests__/reviewUtils.test.js.map +1 -0
- package/dist/utils/__tests__/slugUtils.test.d.ts +2 -0
- package/dist/utils/__tests__/slugUtils.test.d.ts.map +1 -0
- package/dist/utils/__tests__/slugUtils.test.js +103 -0
- package/dist/utils/__tests__/slugUtils.test.js.map +1 -0
- package/dist/utils/__tests__/sortUtils.test.d.ts +5 -0
- package/dist/utils/__tests__/sortUtils.test.d.ts.map +1 -0
- package/dist/utils/__tests__/sortUtils.test.js +28 -0
- package/dist/utils/__tests__/sortUtils.test.js.map +1 -0
- package/dist/utils/__tests__/stringUtils.test.d.ts +2 -0
- package/dist/utils/__tests__/stringUtils.test.d.ts.map +1 -0
- package/dist/utils/__tests__/stringUtils.test.js +27 -0
- package/dist/utils/__tests__/stringUtils.test.js.map +1 -0
- package/dist/utils/__tests__/ticketListUtils.test.d.ts +2 -0
- package/dist/utils/__tests__/ticketListUtils.test.d.ts.map +1 -0
- package/dist/utils/__tests__/ticketListUtils.test.js +41 -0
- package/dist/utils/__tests__/ticketListUtils.test.js.map +1 -0
- package/dist/utils/__tests__/typeUtils.test.d.ts +2 -0
- package/dist/utils/__tests__/typeUtils.test.d.ts.map +1 -0
- package/dist/utils/__tests__/typeUtils.test.js +11 -0
- package/dist/utils/__tests__/typeUtils.test.js.map +1 -0
- package/dist/utils/__tests__/userSubscriptionUtils.test.d.ts +5 -0
- package/dist/utils/__tests__/userSubscriptionUtils.test.d.ts.map +1 -0
- package/dist/utils/__tests__/userSubscriptionUtils.test.js +66 -0
- package/dist/utils/__tests__/userSubscriptionUtils.test.js.map +1 -0
- package/dist/utils/__tests__/userUtils.test.d.ts +2 -0
- package/dist/utils/__tests__/userUtils.test.d.ts.map +1 -0
- package/dist/utils/__tests__/userUtils.test.js +34 -0
- package/dist/utils/__tests__/userUtils.test.js.map +1 -0
- package/dist/utils/__tests__/venueTypeFormatter.test.d.ts +2 -0
- package/dist/utils/__tests__/venueTypeFormatter.test.d.ts.map +1 -0
- package/dist/utils/__tests__/venueTypeFormatter.test.js +25 -0
- package/dist/utils/__tests__/venueTypeFormatter.test.js.map +1 -0
- package/dist/utils/service/__tests__/regexUtils.test.d.ts +2 -0
- package/dist/utils/service/__tests__/regexUtils.test.d.ts.map +1 -0
- package/dist/utils/service/__tests__/regexUtils.test.js +51 -0
- package/dist/utils/service/__tests__/regexUtils.test.js.map +1 -0
- package/dist/utils/service/__tests__/serviceDBUtils.test.d.ts +2 -0
- package/dist/utils/service/__tests__/serviceDBUtils.test.d.ts.map +1 -0
- package/dist/utils/service/__tests__/serviceDBUtils.test.js +17 -0
- package/dist/utils/service/__tests__/serviceDBUtils.test.js.map +1 -0
- package/dist/utils/service/__tests__/serviceFeaturedSortUtils.test.d.ts +2 -0
- package/dist/utils/service/__tests__/serviceFeaturedSortUtils.test.d.ts.map +1 -0
- package/dist/utils/service/__tests__/serviceFeaturedSortUtils.test.js +60 -0
- package/dist/utils/service/__tests__/serviceFeaturedSortUtils.test.js.map +1 -0
- package/dist/utils/service/__tests__/serviceUtils.test.d.ts +2 -0
- package/dist/utils/service/__tests__/serviceUtils.test.d.ts.map +1 -0
- package/dist/utils/service/__tests__/serviceUtils.test.js +135 -0
- package/dist/utils/service/__tests__/serviceUtils.test.js.map +1 -0
- package/dist/utils/service/serviceFeaturedSortUtils.d.ts.map +1 -1
- package/dist/utils/service/serviceFeaturedSortUtils.js +5 -1
- package/dist/utils/service/serviceFeaturedSortUtils.js.map +1 -1
- package/dist/utils/ticketListUtils.d.ts.map +1 -1
- package/dist/utils/ticketListUtils.js +11 -7
- package/dist/utils/ticketListUtils.js.map +1 -1
- package/package.json +1 -1
- package/prisma/schema.prisma +47 -0
- package/src/__tests__/bashSectionTitleForBashType.test.ts +48 -1
- package/src/__tests__/definitionsHelpers.test.ts +136 -0
- package/src/__tests__/extendedSchemas.test.ts +50 -0
- package/src/__tests__/membershipDefinitions.test.ts +144 -0
- package/src/__tests__/ticketAdmission.test.ts +73 -0
- package/src/__tests__/utmAttribution.test.ts +118 -0
- package/src/definitions.ts +86 -23
- package/src/extendedSchemas.ts +35 -1
- package/src/index.ts +1 -0
- package/src/sms/smsTemplates.ts +20 -0
- package/src/utils/__tests__/addressUtils.test.ts +176 -0
- package/src/utils/__tests__/apiUtils.test.ts +219 -0
- package/src/utils/__tests__/arrayUtils.test.ts +26 -0
- package/src/utils/__tests__/blogUtils.test.ts +145 -0
- package/src/utils/__tests__/dateTimeUtils.test.ts +233 -0
- package/src/utils/__tests__/discountEngine/discountCalculator.test.ts +410 -0
- package/src/utils/__tests__/generalDateTimeUtils.test.ts +34 -0
- package/src/utils/__tests__/luxonUtils.test.ts +171 -0
- package/src/utils/__tests__/mathUtils.test.ts +30 -0
- package/src/utils/__tests__/objUtils.test.ts +48 -0
- package/src/utils/__tests__/paymentUtils.test.ts +59 -0
- package/src/utils/__tests__/qrCodeUtils.test.ts +28 -1
- package/src/utils/__tests__/reviewUtils.test.ts +65 -0
- package/src/utils/__tests__/slugUtils.test.ts +143 -0
- package/src/utils/__tests__/sortUtils.test.ts +33 -0
- package/src/utils/__tests__/stringUtils.test.ts +37 -0
- package/src/utils/__tests__/ticketListUtils.test.ts +47 -0
- package/src/utils/__tests__/typeUtils.test.ts +12 -0
- package/src/utils/__tests__/userSubscriptionUtils.test.ts +87 -0
- package/src/utils/__tests__/userUtils.test.ts +41 -0
- package/src/utils/__tests__/venueTypeFormatter.test.ts +31 -0
- package/src/utils/service/__tests__/regexUtils.test.ts +66 -0
- package/src/utils/service/__tests__/serviceDBUtils.test.ts +19 -0
- package/src/utils/service/__tests__/serviceFeaturedSortUtils.test.ts +67 -0
- package/src/utils/service/__tests__/serviceUtils.test.ts +190 -0
- package/src/utils/service/serviceFeaturedSortUtils.ts +5 -1
- package/src/utils/ticketListUtils.ts +13 -6
package/README.md
CHANGED
|
@@ -6,3 +6,7 @@ If you have issues with a Prisma enum being undefined:
|
|
|
6
6
|
|
|
7
7
|
You can add an unused enum to the model `unusedModelButNeededForSomeTypesToBeDefinedForTypescript`
|
|
8
8
|
2. Delete node_modules directory and reinstall.
|
|
9
|
+
|
|
10
|
+
After **pulling** changes to `prisma/schema.prisma` (new fields, models), run **`npx prisma generate`** locally before **`npm run typecheck`**. Otherwise `satisfies Prisma.UserSelect` in `extendedSchemas.ts` may error until the generated client catches up (`npm run build` / CI does this).
|
|
11
|
+
|
|
12
|
+
<!-- housekeeping: README bump (cosmetic) -->
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
* a `" bashes"` suffix tacked on.
|
|
14
14
|
*/
|
|
15
15
|
import { BashEventType } from "@prisma/client";
|
|
16
|
-
import { bashSectionTitleForBashType } from "../definitions.js";
|
|
16
|
+
import { bashSectionTitleForBashType, canonicalBashEventRowKey, } from "../definitions.js";
|
|
17
17
|
describe("bashSectionTitleForBashType", () => {
|
|
18
18
|
describe("free-text scraper section keys (non-enum)", () => {
|
|
19
19
|
it("returns 'Raves' verbatim, not 'Raves bashes'", () => {
|
|
@@ -71,5 +71,36 @@ describe("bashSectionTitleForBashType", () => {
|
|
|
71
71
|
expect(bashSectionTitleForBashType("Party")).toBe("Parties");
|
|
72
72
|
});
|
|
73
73
|
});
|
|
74
|
+
describe("keys that diverge from Prisma enum literals (case or display labels)", () => {
|
|
75
|
+
it("lower-case prisma value 'party' → 'Parties'", () => {
|
|
76
|
+
expect(bashSectionTitleForBashType("party")).toBe("Parties");
|
|
77
|
+
});
|
|
78
|
+
it("lower-case 'fundraiser' → 'Fundraisers'", () => {
|
|
79
|
+
expect(bashSectionTitleForBashType("fundraiser")).toBe("Fundraisers");
|
|
80
|
+
});
|
|
81
|
+
it("singular display label row key 'House Party' → 'House Parties'", () => {
|
|
82
|
+
expect(bashSectionTitleForBashType("House Party")).toBe("House Parties");
|
|
83
|
+
});
|
|
84
|
+
it("trimmed stray whitespace still pluralizes", () => {
|
|
85
|
+
expect(bashSectionTitleForBashType(" Fundraiser ")).toBe("Fundraisers");
|
|
86
|
+
});
|
|
87
|
+
});
|
|
88
|
+
describe("already-plural enum headings", () => {
|
|
89
|
+
it("normalizes casing when the row key matches a pluralized enum title", () => {
|
|
90
|
+
expect(bashSectionTitleForBashType("House Parties")).toBe("House Parties");
|
|
91
|
+
expect(bashSectionTitleForBashType("house parties")).toBe("House Parties");
|
|
92
|
+
expect(bashSectionTitleForBashType("Comedy Shows")).toBe("Comedy Shows");
|
|
93
|
+
});
|
|
94
|
+
});
|
|
95
|
+
});
|
|
96
|
+
describe("canonicalBashEventRowKey", () => {
|
|
97
|
+
it("maps singular labels and enum literals to the Prisma enum string", () => {
|
|
98
|
+
expect(canonicalBashEventRowKey("House Party")).toBe(BashEventType.HouseParty);
|
|
99
|
+
expect(canonicalBashEventRowKey(BashEventType.HouseParty)).toBe(BashEventType.HouseParty);
|
|
100
|
+
expect(canonicalBashEventRowKey("houseparty")).toBe(BashEventType.HouseParty);
|
|
101
|
+
});
|
|
102
|
+
it("returns trimmed free-text when no enum matches", () => {
|
|
103
|
+
expect(canonicalBashEventRowKey("Graduation")).toBe("Graduation");
|
|
104
|
+
});
|
|
74
105
|
});
|
|
75
106
|
//# sourceMappingURL=bashSectionTitleForBashType.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bashSectionTitleForBashType.test.js","sourceRoot":"","sources":["../../src/__tests__/bashSectionTitleForBashType.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAE/C,OAAO,
|
|
1
|
+
{"version":3,"file":"bashSectionTitleForBashType.test.js","sourceRoot":"","sources":["../../src/__tests__/bashSectionTitleForBashType.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"definitionsHelpers.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/definitionsHelpers.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,85 @@
|
|
|
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, } from "../definitions.js";
|
|
3
|
+
describe("definitions helpers", () => {
|
|
4
|
+
describe("createEmptyFilterFields", () => {
|
|
5
|
+
test("returns fresh arrays not shared with EMPTY_FILTER_FIELDS", () => {
|
|
6
|
+
const a = createEmptyFilterFields();
|
|
7
|
+
const b = createEmptyFilterFields();
|
|
8
|
+
a.price.push("free");
|
|
9
|
+
expect(b.price).toEqual([]);
|
|
10
|
+
expect(EMPTY_FILTER_FIELDS.price).toEqual([]);
|
|
11
|
+
});
|
|
12
|
+
test("includes default boolean flags", () => {
|
|
13
|
+
expect(createEmptyFilterFields()).toMatchObject({
|
|
14
|
+
hasOpenTasks: false,
|
|
15
|
+
acceptsBashPoints: false,
|
|
16
|
+
ambashadorOnly: false,
|
|
17
|
+
});
|
|
18
|
+
});
|
|
19
|
+
});
|
|
20
|
+
describe("removeDataFromResult", () => {
|
|
21
|
+
test("strips data while preserving error metadata", () => {
|
|
22
|
+
const result = {
|
|
23
|
+
data: { id: "1" },
|
|
24
|
+
error: true,
|
|
25
|
+
code: "ERR",
|
|
26
|
+
};
|
|
27
|
+
expect(removeDataFromResult(result)).toEqual({ error: true, code: "ERR" });
|
|
28
|
+
});
|
|
29
|
+
test("returns undefined for nullish input", () => {
|
|
30
|
+
expect(removeDataFromResult(null)).toBeUndefined();
|
|
31
|
+
expect(removeDataFromResult(undefined)).toBeUndefined();
|
|
32
|
+
});
|
|
33
|
+
});
|
|
34
|
+
describe("canonicalBashEventRowKey", () => {
|
|
35
|
+
test("normalizes singular labels to enum keys", () => {
|
|
36
|
+
expect(canonicalBashEventRowKey("House Party")).toBe("HouseParty");
|
|
37
|
+
});
|
|
38
|
+
test("passes through unknown trimmed values", () => {
|
|
39
|
+
expect(canonicalBashEventRowKey(" Custom Row ")).toBe("Custom Row");
|
|
40
|
+
});
|
|
41
|
+
test("returns empty string for blank input", () => {
|
|
42
|
+
expect(canonicalBashEventRowKey(" ")).toBe("");
|
|
43
|
+
});
|
|
44
|
+
});
|
|
45
|
+
describe("PASSWORD_REQUIREMENTS_REGEX", () => {
|
|
46
|
+
test("requires min length and mixed character classes", () => {
|
|
47
|
+
expect(PASSWORD_MIN_LENGTH).toBe(8);
|
|
48
|
+
expect(PASSWORD_REQUIREMENTS_REGEX.test("Abcd1234!")).toBe(true);
|
|
49
|
+
expect(PASSWORD_REQUIREMENTS_REGEX.test("Sh0rt!")).toBe(false);
|
|
50
|
+
expect(PASSWORD_REQUIREMENTS_REGEX.test("alllowercase1!")).toBe(false);
|
|
51
|
+
});
|
|
52
|
+
});
|
|
53
|
+
describe("ticketIsPaidForEventAdmission", () => {
|
|
54
|
+
test("free tiers always admit without payment", () => {
|
|
55
|
+
expect(ticketIsPaidForEventAdmission({ purchaseType: "USD", paidOn: null }, 0)).toBe(true);
|
|
56
|
+
});
|
|
57
|
+
test("comp tickets admit without paidOn", () => {
|
|
58
|
+
expect(ticketIsPaidForEventAdmission({ purchaseType: TICKET_PURCHASE_TYPE_COMP, paidOn: null }, 2500)).toBe(true);
|
|
59
|
+
});
|
|
60
|
+
test("pay-at-door requires paidOn when tier has price", () => {
|
|
61
|
+
expect(ticketIsPaidForEventAdmission({ purchaseType: TICKET_PURCHASE_TYPE_PAY_AT_DOOR, paidOn: null }, 1000)).toBe(false);
|
|
62
|
+
expect(ticketIsPaidForEventAdmission({ purchaseType: TICKET_PURCHASE_TYPE_PAY_AT_DOOR, paidOn: new Date() }, 1000)).toBe(true);
|
|
63
|
+
});
|
|
64
|
+
test("standard paid tickets require paidOn", () => {
|
|
65
|
+
expect(ticketIsPaidForEventAdmission({ purchaseType: "USD", paidOn: null }, 500)).toBe(false);
|
|
66
|
+
expect(ticketIsPaidForEventAdmission({ purchaseType: "USD", paidOn: new Date() }, 500)).toBe(true);
|
|
67
|
+
});
|
|
68
|
+
});
|
|
69
|
+
describe("isUnpaidPayAtDoorTicket", () => {
|
|
70
|
+
test("true only for pay-at-door without paidOn", () => {
|
|
71
|
+
expect(isUnpaidPayAtDoorTicket({
|
|
72
|
+
purchaseType: TICKET_PURCHASE_TYPE_PAY_AT_DOOR,
|
|
73
|
+
paidOn: null,
|
|
74
|
+
})).toBe(true);
|
|
75
|
+
});
|
|
76
|
+
test("false once paid or for other purchase types", () => {
|
|
77
|
+
expect(isUnpaidPayAtDoorTicket({
|
|
78
|
+
purchaseType: TICKET_PURCHASE_TYPE_PAY_AT_DOOR,
|
|
79
|
+
paidOn: new Date(),
|
|
80
|
+
})).toBe(false);
|
|
81
|
+
expect(isUnpaidPayAtDoorTicket({ purchaseType: "USD", paidOn: null })).toBe(false);
|
|
82
|
+
});
|
|
83
|
+
});
|
|
84
|
+
});
|
|
85
|
+
//# sourceMappingURL=definitionsHelpers.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
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":"extendedSchemas.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/extendedSchemas.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { describe, expect, test } from "@jest/globals";
|
|
2
|
+
import { BASH_EVENT_DATA_TO_CLONE, BASH_EVENT_DATA_TO_REMOVE, FRONT_END_USER_DATA_TO_SELECT, PUBLIC_USER_SUBSCRIPTION_DATA_TO_SELECT, TICKET_TIER_DATA_TO_INCLUDE, } from "../extendedSchemas.js";
|
|
3
|
+
describe("extendedSchemas exports", () => {
|
|
4
|
+
test("PUBLIC_USER_SUBSCRIPTION_DATA_TO_SELECT includes subscription counters", () => {
|
|
5
|
+
expect(PUBLIC_USER_SUBSCRIPTION_DATA_TO_SELECT).toMatchObject({
|
|
6
|
+
type: true,
|
|
7
|
+
status: true,
|
|
8
|
+
ownerId: true,
|
|
9
|
+
subscriptionCount: true,
|
|
10
|
+
listedCount: true,
|
|
11
|
+
});
|
|
12
|
+
});
|
|
13
|
+
test("FRONT_END_USER_DATA_TO_SELECT exposes public profile fields", () => {
|
|
14
|
+
expect(FRONT_END_USER_DATA_TO_SELECT).toMatchObject({
|
|
15
|
+
id: true,
|
|
16
|
+
username: true,
|
|
17
|
+
email: true,
|
|
18
|
+
givenName: true,
|
|
19
|
+
familyName: true,
|
|
20
|
+
});
|
|
21
|
+
});
|
|
22
|
+
test("TICKET_TIER_DATA_TO_INCLUDE nests tickets and promoCodes", () => {
|
|
23
|
+
expect(TICKET_TIER_DATA_TO_INCLUDE.tickets).toBeDefined();
|
|
24
|
+
expect(TICKET_TIER_DATA_TO_INCLUDE.promoCodes).toBe(true);
|
|
25
|
+
});
|
|
26
|
+
test("BASH_EVENT_DATA_TO_CLONE lists cloneable relations", () => {
|
|
27
|
+
expect(BASH_EVENT_DATA_TO_CLONE).toEqual([
|
|
28
|
+
"ticketTiers",
|
|
29
|
+
"media",
|
|
30
|
+
"recurrence",
|
|
31
|
+
"invitations",
|
|
32
|
+
]);
|
|
33
|
+
});
|
|
34
|
+
test("BASH_EVENT_DATA_TO_REMOVE strips nested creator and tasks", () => {
|
|
35
|
+
expect(BASH_EVENT_DATA_TO_REMOVE).toContain("creator");
|
|
36
|
+
expect(BASH_EVENT_DATA_TO_REMOVE).toContain("eventTasks");
|
|
37
|
+
expect(BASH_EVENT_DATA_TO_REMOVE).toContain("tickets");
|
|
38
|
+
});
|
|
39
|
+
});
|
|
40
|
+
//# sourceMappingURL=extendedSchemas.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extendedSchemas.test.js","sourceRoot":"","sources":["../../src/__tests__/extendedSchemas.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,EACL,wBAAwB,EACxB,yBAAyB,EACzB,6BAA6B,EAC7B,uCAAuC,EACvC,2BAA2B,GAC5B,MAAM,uBAAuB,CAAC;AAE/B,QAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE;IACvC,IAAI,CAAC,wEAAwE,EAAE,GAAG,EAAE;QAClF,MAAM,CAAC,uCAAuC,CAAC,CAAC,aAAa,CAAC;YAC5D,IAAI,EAAE,IAAI;YACV,MAAM,EAAE,IAAI;YACZ,OAAO,EAAE,IAAI;YACb,iBAAiB,EAAE,IAAI;YACvB,WAAW,EAAE,IAAI;SAClB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,6DAA6D,EAAE,GAAG,EAAE;QACvE,MAAM,CAAC,6BAA6B,CAAC,CAAC,aAAa,CAAC;YAClD,EAAE,EAAE,IAAI;YACR,QAAQ,EAAE,IAAI;YACd,KAAK,EAAE,IAAI;YACX,SAAS,EAAE,IAAI;YACf,UAAU,EAAE,IAAI;SACjB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,0DAA0D,EAAE,GAAG,EAAE;QACpE,MAAM,CAAC,2BAA2B,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;QAC1D,MAAM,CAAC,2BAA2B,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,oDAAoD,EAAE,GAAG,EAAE;QAC9D,MAAM,CAAC,wBAAwB,CAAC,CAAC,OAAO,CAAC;YACvC,aAAa;YACb,OAAO;YACP,YAAY;YACZ,aAAa;SACd,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,2DAA2D,EAAE,GAAG,EAAE;QACrE,MAAM,CAAC,yBAAyB,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QACvD,MAAM,CAAC,yBAAyB,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;QAC1D,MAAM,CAAC,yBAAyB,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"membershipDefinitions.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/membershipDefinitions.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { describe, expect, test } from "@jest/globals";
|
|
2
|
+
import { MembershipTier } from "@prisma/client";
|
|
3
|
+
import { BashPassTier } from "@prisma/client";
|
|
4
|
+
import { calculateBashEventFee, calculateServiceBookingFee, calculatePartnerPaymentFee, isTrustedHostMembershipTier, hasFeatureAccess, getRequiredTierForFeature, hasFeatureLimit, getFeatureLimit, hasReachedFeatureLimit, MEMBERSHIP_FEATURES, BASIC_TIER_MAX_PROMO_CODES_PER_EVENT, MEMBERSHIP_BASH_PASS_TIER, MEMBERSHIP_TIER_ORDER, MEMBERSHIP_TIER_HIERARCHY, } from "../membershipDefinitions.js";
|
|
5
|
+
describe("membershipDefinitions helpers", () => {
|
|
6
|
+
describe("fee calculators", () => {
|
|
7
|
+
test("calculateBashEventFee applies percent, minimum, and cap", () => {
|
|
8
|
+
expect(calculateBashEventFee(10000, MembershipTier.Basic)).toBeGreaterThanOrEqual(0);
|
|
9
|
+
expect(calculateBashEventFee(0, MembershipTier.Premium)).toBe(calculateBashEventFee(1, MembershipTier.Premium));
|
|
10
|
+
});
|
|
11
|
+
test("calculateServiceBookingFee includes Stripe fixed fee", () => {
|
|
12
|
+
const fee = calculateServiceBookingFee(10000, MembershipTier.Basic);
|
|
13
|
+
expect(fee).toBeGreaterThan(0);
|
|
14
|
+
});
|
|
15
|
+
test("calculatePartnerPaymentFee scales with amount", () => {
|
|
16
|
+
const small = calculatePartnerPaymentFee(1000, MembershipTier.Pro);
|
|
17
|
+
const large = calculatePartnerPaymentFee(100000, MembershipTier.Pro);
|
|
18
|
+
expect(large).toBeGreaterThan(small);
|
|
19
|
+
});
|
|
20
|
+
});
|
|
21
|
+
describe("isTrustedHostMembershipTier", () => {
|
|
22
|
+
test("Premium and above are trusted", () => {
|
|
23
|
+
expect(isTrustedHostMembershipTier(MembershipTier.Premium)).toBe(true);
|
|
24
|
+
expect(isTrustedHostMembershipTier(MembershipTier.Legend)).toBe(true);
|
|
25
|
+
});
|
|
26
|
+
test("Basic and missing tier are not trusted", () => {
|
|
27
|
+
expect(isTrustedHostMembershipTier(MembershipTier.Basic)).toBe(false);
|
|
28
|
+
expect(isTrustedHostMembershipTier(null)).toBe(false);
|
|
29
|
+
});
|
|
30
|
+
});
|
|
31
|
+
describe("hasFeatureAccess", () => {
|
|
32
|
+
test("Basic gets promo codes", () => {
|
|
33
|
+
expect(hasFeatureAccess(MembershipTier.Basic, MEMBERSHIP_FEATURES.PROMO_CODES)).toBe(true);
|
|
34
|
+
});
|
|
35
|
+
test("Pro unlocks vendor directory", () => {
|
|
36
|
+
expect(hasFeatureAccess(MembershipTier.Pro, MEMBERSHIP_FEATURES.VENDOR_DIRECTORY)).toBe(true);
|
|
37
|
+
expect(hasFeatureAccess(MembershipTier.Premium, MEMBERSHIP_FEATURES.VENDOR_DIRECTORY)).toBe(false);
|
|
38
|
+
});
|
|
39
|
+
test("unknown feature returns false", () => {
|
|
40
|
+
expect(hasFeatureAccess(MembershipTier.Legend, "not_a_feature")).toBe(false);
|
|
41
|
+
});
|
|
42
|
+
});
|
|
43
|
+
describe("getRequiredTierForFeature", () => {
|
|
44
|
+
test("returns minimum tier that unlocks feature", () => {
|
|
45
|
+
expect(getRequiredTierForFeature(MEMBERSHIP_FEATURES.PROMO_CODES)).toBe(MembershipTier.Basic);
|
|
46
|
+
expect(getRequiredTierForFeature(MEMBERSHIP_FEATURES.VENDOR_DIRECTORY)).toBe(MembershipTier.Pro);
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
describe("hasFeatureLimit / getFeatureLimit", () => {
|
|
50
|
+
test("reads boolean limits from MEMBERSHIP_LIMITS", () => {
|
|
51
|
+
expect(hasFeatureLimit(MembershipTier.Basic, "canCreateEvents")).toBe(true);
|
|
52
|
+
expect(hasFeatureLimit(MembershipTier.Basic, "analyticsAccess")).toBe(false);
|
|
53
|
+
expect(getFeatureLimit(MembershipTier.Pro, "maxServiceListings")).toBe(3);
|
|
54
|
+
});
|
|
55
|
+
});
|
|
56
|
+
describe("hasReachedFeatureLimit", () => {
|
|
57
|
+
test("blocks when featured event quota is exhausted", () => {
|
|
58
|
+
expect(hasReachedFeatureLimit(MembershipTier.Pro, "featuredEvents", 1)).toBe(true);
|
|
59
|
+
expect(hasReachedFeatureLimit(MembershipTier.Pro, "featuredEvents", 0)).toBe(false);
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
test("Basic tier promo code cap constant", () => {
|
|
63
|
+
expect(BASIC_TIER_MAX_PROMO_CODES_PER_EVENT).toBe(3);
|
|
64
|
+
});
|
|
65
|
+
describe("tier ordering constants", () => {
|
|
66
|
+
test("MEMBERSHIP_TIER_HIERARCHY starts at Basic and ends at Legend", () => {
|
|
67
|
+
expect(MEMBERSHIP_TIER_HIERARCHY[0]).toBe(MembershipTier.Basic);
|
|
68
|
+
expect(MEMBERSHIP_TIER_HIERARCHY.at(-1)).toBe(MembershipTier.Legend);
|
|
69
|
+
});
|
|
70
|
+
test("MEMBERSHIP_TIER_ORDER increases with tier level", () => {
|
|
71
|
+
expect(MEMBERSHIP_TIER_ORDER[MembershipTier.Basic]).toBeLessThan(MEMBERSHIP_TIER_ORDER[MembershipTier.Premium]);
|
|
72
|
+
expect(MEMBERSHIP_TIER_ORDER[MembershipTier.Pro]).toBeLessThan(MEMBERSHIP_TIER_ORDER[MembershipTier.Legend]);
|
|
73
|
+
});
|
|
74
|
+
});
|
|
75
|
+
describe("MEMBERSHIP_BASH_PASS_TIER", () => {
|
|
76
|
+
test("maps paid membership tiers to bundled BashPass levels", () => {
|
|
77
|
+
expect(MEMBERSHIP_BASH_PASS_TIER[MembershipTier.Premium]).toBe(BashPassTier.LITE);
|
|
78
|
+
expect(MEMBERSHIP_BASH_PASS_TIER[MembershipTier.Pro]).toBe(BashPassTier.STANDARD);
|
|
79
|
+
expect(MEMBERSHIP_BASH_PASS_TIER[MembershipTier.Elite]).toBe(BashPassTier.UNLIMITED);
|
|
80
|
+
expect(MEMBERSHIP_BASH_PASS_TIER[MembershipTier.Basic]).toBeUndefined();
|
|
81
|
+
});
|
|
82
|
+
});
|
|
83
|
+
describe("getRequiredTierForFeature edge cases", () => {
|
|
84
|
+
test("returns null for unknown feature", () => {
|
|
85
|
+
expect(getRequiredTierForFeature("__not_a_real_feature__")).toBeNull();
|
|
86
|
+
});
|
|
87
|
+
});
|
|
88
|
+
describe("hasReachedFeatureLimit default branch", () => {
|
|
89
|
+
test("returns false for unsupported feature keys", () => {
|
|
90
|
+
expect(hasReachedFeatureLimit(MembershipTier.Pro, "featuredEvents", 999)).toBe(true);
|
|
91
|
+
expect(hasReachedFeatureLimit(MembershipTier.Pro, "unknownFeature", 0)).toBe(false);
|
|
92
|
+
});
|
|
93
|
+
});
|
|
94
|
+
});
|
|
95
|
+
//# sourceMappingURL=membershipDefinitions.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"membershipDefinitions.test.js","sourceRoot":"","sources":["../../src/__tests__/membershipDefinitions.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ticketAdmission.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/ticketAdmission.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ticket admission helpers — paid vs pay-at-door state.
|
|
3
|
+
*/
|
|
4
|
+
import { describe, expect, test } from "@jest/globals";
|
|
5
|
+
import { ticketIsPaidForEventAdmission, isUnpaidPayAtDoorTicket, TICKET_PURCHASE_TYPE_COMP, TICKET_PURCHASE_TYPE_PAY_AT_DOOR, TICKET_PURCHASE_TYPE_USD, } from "../definitions.js";
|
|
6
|
+
describe("ticketIsPaidForEventAdmission", () => {
|
|
7
|
+
test("free tiers always admit without payment", () => {
|
|
8
|
+
expect(ticketIsPaidForEventAdmission({ purchaseType: TICKET_PURCHASE_TYPE_USD, paidOn: null }, 0)).toBe(true);
|
|
9
|
+
expect(ticketIsPaidForEventAdmission({ purchaseType: TICKET_PURCHASE_TYPE_PAY_AT_DOOR, paidOn: null }, 0)).toBe(true);
|
|
10
|
+
});
|
|
11
|
+
test("comp tickets admit regardless of paidOn", () => {
|
|
12
|
+
expect(ticketIsPaidForEventAdmission({ purchaseType: TICKET_PURCHASE_TYPE_COMP, paidOn: null }, 2500)).toBe(true);
|
|
13
|
+
});
|
|
14
|
+
test("paid USD tickets admit when paidOn is set", () => {
|
|
15
|
+
expect(ticketIsPaidForEventAdmission({ purchaseType: TICKET_PURCHASE_TYPE_USD, paidOn: new Date("2024-01-01") }, 2500)).toBe(true);
|
|
16
|
+
});
|
|
17
|
+
test("unpaid USD tickets do not admit", () => {
|
|
18
|
+
expect(ticketIsPaidForEventAdmission({ purchaseType: TICKET_PURCHASE_TYPE_USD, paidOn: null }, 2500)).toBe(false);
|
|
19
|
+
});
|
|
20
|
+
test("pay-at-door tickets admit only after paidOn is set", () => {
|
|
21
|
+
const unpaid = { purchaseType: TICKET_PURCHASE_TYPE_PAY_AT_DOOR, paidOn: null };
|
|
22
|
+
const paid = { purchaseType: TICKET_PURCHASE_TYPE_PAY_AT_DOOR, paidOn: "2024-06-01T12:00:00Z" };
|
|
23
|
+
expect(ticketIsPaidForEventAdmission(unpaid, 1500)).toBe(false);
|
|
24
|
+
expect(ticketIsPaidForEventAdmission(paid, 1500)).toBe(true);
|
|
25
|
+
});
|
|
26
|
+
});
|
|
27
|
+
describe("isUnpaidPayAtDoorTicket", () => {
|
|
28
|
+
test("returns true only for pay-at-door without paidOn", () => {
|
|
29
|
+
expect(isUnpaidPayAtDoorTicket({ purchaseType: TICKET_PURCHASE_TYPE_PAY_AT_DOOR, paidOn: null })).toBe(true);
|
|
30
|
+
});
|
|
31
|
+
test("returns false once pay-at-door ticket is marked paid", () => {
|
|
32
|
+
expect(isUnpaidPayAtDoorTicket({
|
|
33
|
+
purchaseType: TICKET_PURCHASE_TYPE_PAY_AT_DOOR,
|
|
34
|
+
paidOn: new Date(),
|
|
35
|
+
})).toBe(false);
|
|
36
|
+
});
|
|
37
|
+
test("returns false for other purchase types even when unpaid", () => {
|
|
38
|
+
expect(isUnpaidPayAtDoorTicket({ purchaseType: TICKET_PURCHASE_TYPE_USD, paidOn: null })).toBe(false);
|
|
39
|
+
expect(isUnpaidPayAtDoorTicket({ purchaseType: TICKET_PURCHASE_TYPE_COMP, paidOn: null })).toBe(false);
|
|
40
|
+
});
|
|
41
|
+
});
|
|
42
|
+
//# sourceMappingURL=ticketAdmission.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ticketAdmission.test.js","sourceRoot":"","sources":["../../src/__tests__/ticketAdmission.test.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,EACL,6BAA6B,EAC7B,uBAAuB,EACvB,yBAAyB,EACzB,gCAAgC,EAChC,wBAAwB,GACzB,MAAM,mBAAmB,CAAC;AAE3B,QAAQ,CAAC,+BAA+B,EAAE,GAAG,EAAE;IAC7C,IAAI,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACnD,MAAM,CAAC,6BAA6B,CAAC,EAAE,YAAY,EAAE,wBAAwB,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CACrG,IAAI,CACL,CAAC;QACF,MAAM,CACJ,6BAA6B,CAAC,EAAE,YAAY,EAAE,gCAAgC,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,CACnG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACf,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACnD,MAAM,CACJ,6BAA6B,CAAC,EAAE,YAAY,EAAE,yBAAyB,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,IAAI,CAAC,CAC/F,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACf,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACrD,MAAM,CACJ,6BAA6B,CAC3B,EAAE,YAAY,EAAE,wBAAwB,EAAE,MAAM,EAAE,IAAI,IAAI,CAAC,YAAY,CAAC,EAAE,EAC1E,IAAI,CACL,CACF,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACf,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,iCAAiC,EAAE,GAAG,EAAE;QAC3C,MAAM,CACJ,6BAA6B,CAAC,EAAE,YAAY,EAAE,wBAAwB,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,IAAI,CAAC,CAC9F,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAChB,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,oDAAoD,EAAE,GAAG,EAAE;QAC9D,MAAM,MAAM,GAAG,EAAE,YAAY,EAAE,gCAAgC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;QAChF,MAAM,IAAI,GAAG,EAAE,YAAY,EAAE,gCAAgC,EAAE,MAAM,EAAE,sBAAsB,EAAE,CAAC;QAChG,MAAM,CAAC,6BAA6B,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAChE,MAAM,CAAC,6BAA6B,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE;IACvC,IAAI,CAAC,kDAAkD,EAAE,GAAG,EAAE;QAC5D,MAAM,CAAC,uBAAuB,CAAC,EAAE,YAAY,EAAE,gCAAgC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CACpG,IAAI,CACL,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,sDAAsD,EAAE,GAAG,EAAE;QAChE,MAAM,CACJ,uBAAuB,CAAC;YACtB,YAAY,EAAE,gCAAgC;YAC9C,MAAM,EAAE,IAAI,IAAI,EAAE;SACnB,CAAC,CACH,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAChB,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,yDAAyD,EAAE,GAAG,EAAE;QACnE,MAAM,CAAC,uBAAuB,CAAC,EAAE,YAAY,EAAE,wBAAwB,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACtG,MAAM,CAAC,uBAAuB,CAAC,EAAE,YAAY,EAAE,yBAAyB,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACzG,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utmAttribution.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/utmAttribution.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { describe, expect, test, beforeEach, afterEach } from "@jest/globals";
|
|
2
|
+
import { getStoredUtmFields, utmFieldsFromCheckoutArgs, utmFieldsFromStripeMetadata, utmFieldsToStripeMetadata, utmFieldsToTicketColumns, } from "../utmAttribution.js";
|
|
3
|
+
describe("utmAttribution", () => {
|
|
4
|
+
describe("utmFieldsFromCheckoutArgs", () => {
|
|
5
|
+
test("returns undefined when all fields blank", () => {
|
|
6
|
+
expect(utmFieldsFromCheckoutArgs({ utmSource: " ", utmMedium: "", utmCampaign: undefined })).toBeUndefined();
|
|
7
|
+
});
|
|
8
|
+
test("trims and includes only non-empty fields", () => {
|
|
9
|
+
expect(utmFieldsFromCheckoutArgs({
|
|
10
|
+
utmSource: " newsletter ",
|
|
11
|
+
utmMedium: "email",
|
|
12
|
+
})).toEqual({ utmSource: "newsletter", utmMedium: "email" });
|
|
13
|
+
});
|
|
14
|
+
test("caps field length at 500 characters", () => {
|
|
15
|
+
const long = "a".repeat(600);
|
|
16
|
+
const result = utmFieldsFromCheckoutArgs({ utmSource: long });
|
|
17
|
+
expect(result?.utmSource?.length).toBe(500);
|
|
18
|
+
});
|
|
19
|
+
});
|
|
20
|
+
describe("utmFieldsToStripeMetadata", () => {
|
|
21
|
+
test("maps to snake_case Stripe keys", () => {
|
|
22
|
+
expect(utmFieldsToStripeMetadata({
|
|
23
|
+
utmSource: "google",
|
|
24
|
+
utmCampaign: "spring",
|
|
25
|
+
})).toEqual({ utm_source: "google", utm_campaign: "spring" });
|
|
26
|
+
});
|
|
27
|
+
test("returns empty object for undefined input", () => {
|
|
28
|
+
expect(utmFieldsToStripeMetadata(undefined)).toEqual({});
|
|
29
|
+
});
|
|
30
|
+
});
|
|
31
|
+
describe("utmFieldsToTicketColumns", () => {
|
|
32
|
+
test("maps to Prisma Ticket column names", () => {
|
|
33
|
+
expect(utmFieldsToTicketColumns({
|
|
34
|
+
utmSource: "fb",
|
|
35
|
+
utmMedium: "cpc",
|
|
36
|
+
utmCampaign: "launch",
|
|
37
|
+
})).toEqual({
|
|
38
|
+
utmSource: "fb",
|
|
39
|
+
utmMedium: "cpc",
|
|
40
|
+
utmCampaign: "launch",
|
|
41
|
+
});
|
|
42
|
+
});
|
|
43
|
+
test("omits empty fields", () => {
|
|
44
|
+
expect(utmFieldsToTicketColumns({ utmSource: "x" })).toEqual({ utmSource: "x" });
|
|
45
|
+
});
|
|
46
|
+
});
|
|
47
|
+
describe("utmFieldsFromStripeMetadata", () => {
|
|
48
|
+
test("reads snake_case metadata into camelCase fields", () => {
|
|
49
|
+
expect(utmFieldsFromStripeMetadata({
|
|
50
|
+
utm_source: " twitter ",
|
|
51
|
+
utm_medium: "social",
|
|
52
|
+
})).toEqual({ utmSource: "twitter", utmMedium: "social" });
|
|
53
|
+
});
|
|
54
|
+
test("returns empty object for null metadata", () => {
|
|
55
|
+
expect(utmFieldsFromStripeMetadata(null)).toEqual({});
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
describe("getStoredUtmFields", () => {
|
|
59
|
+
const originalSessionStorage = global.sessionStorage;
|
|
60
|
+
beforeEach(() => {
|
|
61
|
+
const store = new Map();
|
|
62
|
+
Object.defineProperty(global, "sessionStorage", {
|
|
63
|
+
configurable: true,
|
|
64
|
+
value: {
|
|
65
|
+
getItem: (key) => store.get(key) ?? null,
|
|
66
|
+
setItem: (key, value) => {
|
|
67
|
+
store.set(key, value);
|
|
68
|
+
},
|
|
69
|
+
removeItem: (key) => {
|
|
70
|
+
store.delete(key);
|
|
71
|
+
},
|
|
72
|
+
clear: () => store.clear(),
|
|
73
|
+
},
|
|
74
|
+
});
|
|
75
|
+
});
|
|
76
|
+
afterEach(() => {
|
|
77
|
+
Object.defineProperty(global, "sessionStorage", {
|
|
78
|
+
configurable: true,
|
|
79
|
+
value: originalSessionStorage,
|
|
80
|
+
});
|
|
81
|
+
});
|
|
82
|
+
test("reads previously stored session values", () => {
|
|
83
|
+
sessionStorage.setItem("bash_utm_source", "newsletter");
|
|
84
|
+
sessionStorage.setItem("bash_utm_campaign", "june");
|
|
85
|
+
expect(getStoredUtmFields()).toEqual({
|
|
86
|
+
utmSource: "newsletter",
|
|
87
|
+
utmCampaign: "june",
|
|
88
|
+
});
|
|
89
|
+
});
|
|
90
|
+
});
|
|
91
|
+
});
|
|
92
|
+
//# sourceMappingURL=utmAttribution.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utmAttribution.test.js","sourceRoot":"","sources":["../../src/__tests__/utmAttribution.test.ts"],"names":[],"mappings":"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"}
|
package/dist/definitions.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import type { BashPassTier, BashEventDressTags, BashEventVibeTags, GovIdRetentionPolicy as GovIdRetentionPolicyEnum, ServiceBookingOfferStatus as ServiceBookingOfferStatusEnum, YearsOfExperience as YearsOfExperienceEnum } from "@prisma/client";
|
|
3
|
-
import { CheckoutExt, PublicUser, ServiceBookingExt, type UserExt } from "./extendedSchemas.js";
|
|
1
|
+
import { BashEventType, BracketType, CompetitionType, Contact, DietaryOption, EntertainmentServiceType, IncomeRange, JudgingType, MembershipTier, MusicGenreType, SchoolNameSource, ServiceTypes, Ticket, TicketTier, User } from "@prisma/client";
|
|
2
|
+
import type { AgePolicy as AgePolicyEnum, BashPassTier, BashEventDressTags, BashEventVibeTags, GovIdRetentionPolicy as GovIdRetentionPolicyEnum, ServiceBookingOfferStatus as ServiceBookingOfferStatusEnum, YearsOfExperience as YearsOfExperienceEnum } from "@prisma/client";
|
|
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";
|
|
6
6
|
import { ServiceAttendeeOption } from "./utils/service/attendeeOptionUtils.js";
|
|
@@ -38,6 +38,13 @@ export declare const GovIdRetentionPolicy: {
|
|
|
38
38
|
readonly Indefinite: "Indefinite";
|
|
39
39
|
};
|
|
40
40
|
export type GovIdRetentionPolicy = GovIdRetentionPolicyEnum;
|
|
41
|
+
/** Mirrors Prisma `AgePolicy` — `@prisma/client` browser bundle omits runtime enum exports. */
|
|
42
|
+
export declare const AgePolicy: {
|
|
43
|
+
readonly AllAges: "AllAges";
|
|
44
|
+
readonly EighteenPlus: "EighteenPlus";
|
|
45
|
+
readonly TwentyOnePlus: "TwentyOnePlus";
|
|
46
|
+
};
|
|
47
|
+
export type AgePolicy = AgePolicyEnum;
|
|
41
48
|
export declare const PASSWORD_MIN_LENGTH: 8;
|
|
42
49
|
export declare const PASSWORD_REQUIREMENTS_REGEX: RegExp;
|
|
43
50
|
export declare const STRIPE_CHECKOUT_TIMEOUT_MS: 20000;
|
|
@@ -425,7 +432,7 @@ export interface LoginSession {
|
|
|
425
432
|
token: string;
|
|
426
433
|
}
|
|
427
434
|
export interface AttendeeOfBashEvent {
|
|
428
|
-
user: PublicUser;
|
|
435
|
+
user: PublicUser | PublicTeaserUser;
|
|
429
436
|
tickets: Ticket[];
|
|
430
437
|
}
|
|
431
438
|
export interface FirstFewAttendingBashEvent {
|
|
@@ -733,7 +740,7 @@ export declare const DressTagsToString: {
|
|
|
733
740
|
export declare const YearsOfExperienceToString: {
|
|
734
741
|
[key in YearsOfExperienceEnum]: string;
|
|
735
742
|
};
|
|
736
|
-
export {
|
|
743
|
+
export { BracketType, CompetitionType, EntertainmentServiceType, JudgingType, MusicGenreType, SchoolNameSource, ServiceTypes, };
|
|
737
744
|
/**
|
|
738
745
|
* Display labels for `User.govIdRetentionPolicy` (settings UI, ID verification gate).
|
|
739
746
|
*
|
|
@@ -803,6 +810,12 @@ export declare const IncomeRangeShortLabel: IncomeRangeToStringType;
|
|
|
803
810
|
* Audience-targeting only — never use to gate ticket purchase or entry.
|
|
804
811
|
*/
|
|
805
812
|
export declare const INCOME_RANGE_VALUES: ReadonlyArray<IncomeRange>;
|
|
813
|
+
/**
|
|
814
|
+
* Stable row key for homepage/category grouping when `eventType` may be stored
|
|
815
|
+
* as a Prisma enum literal (e.g. `HouseParty`) or as the singular UI label
|
|
816
|
+
* (`House Party`).
|
|
817
|
+
*/
|
|
818
|
+
export declare function canonicalBashEventRowKey(raw: string): string;
|
|
806
819
|
/**
|
|
807
820
|
* Heading shown on the home page row and the `/category/...` page for a bash
|
|
808
821
|
* `eventType` / section key. Uses plural-friendly copy for Prisma
|