@bash-app/bash-common 30.383.0 → 30.385.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 (91) hide show
  1. package/dist/__tests__/accessScreening.test.js +39 -1
  2. package/dist/__tests__/accessScreening.test.js.map +1 -1
  3. package/dist/__tests__/applicationFunnel.test.d.ts +2 -0
  4. package/dist/__tests__/applicationFunnel.test.d.ts.map +1 -0
  5. package/dist/__tests__/applicationFunnel.test.js +126 -0
  6. package/dist/__tests__/applicationFunnel.test.js.map +1 -0
  7. package/dist/__tests__/definitionsHelpers.test.js +20 -1
  8. package/dist/__tests__/definitionsHelpers.test.js.map +1 -1
  9. package/dist/__tests__/fundingMeter.test.d.ts +2 -0
  10. package/dist/__tests__/fundingMeter.test.d.ts.map +1 -0
  11. package/dist/__tests__/fundingMeter.test.js +129 -0
  12. package/dist/__tests__/fundingMeter.test.js.map +1 -0
  13. package/dist/__tests__/giveaway.test.d.ts +2 -0
  14. package/dist/__tests__/giveaway.test.d.ts.map +1 -0
  15. package/dist/__tests__/giveaway.test.js +65 -0
  16. package/dist/__tests__/giveaway.test.js.map +1 -0
  17. package/dist/__tests__/promoterCompetitionUtils.test.d.ts +2 -0
  18. package/dist/__tests__/promoterCompetitionUtils.test.d.ts.map +1 -0
  19. package/dist/__tests__/promoterCompetitionUtils.test.js +262 -0
  20. package/dist/__tests__/promoterCompetitionUtils.test.js.map +1 -0
  21. package/dist/accessScreening.d.ts +18 -3
  22. package/dist/accessScreening.d.ts.map +1 -1
  23. package/dist/accessScreening.js +26 -0
  24. package/dist/accessScreening.js.map +1 -1
  25. package/dist/applicationFunnel.d.ts +58 -0
  26. package/dist/applicationFunnel.d.ts.map +1 -0
  27. package/dist/applicationFunnel.js +147 -0
  28. package/dist/applicationFunnel.js.map +1 -0
  29. package/dist/definitions.d.ts +145 -5
  30. package/dist/definitions.d.ts.map +1 -1
  31. package/dist/definitions.js +137 -5
  32. package/dist/definitions.js.map +1 -1
  33. package/dist/extendedSchemas.d.ts +159 -0
  34. package/dist/extendedSchemas.d.ts.map +1 -1
  35. package/dist/extendedSchemas.js +6 -0
  36. package/dist/extendedSchemas.js.map +1 -1
  37. package/dist/fundingMeter.d.ts +66 -0
  38. package/dist/fundingMeter.d.ts.map +1 -0
  39. package/dist/fundingMeter.js +99 -0
  40. package/dist/fundingMeter.js.map +1 -0
  41. package/dist/giveaway.d.ts +71 -0
  42. package/dist/giveaway.d.ts.map +1 -0
  43. package/dist/giveaway.js +117 -0
  44. package/dist/giveaway.js.map +1 -0
  45. package/dist/index.d.ts +5 -0
  46. package/dist/index.d.ts.map +1 -1
  47. package/dist/index.js +6 -0
  48. package/dist/index.js.map +1 -1
  49. package/dist/utils/__tests__/bashHostIdentity.test.d.ts +2 -0
  50. package/dist/utils/__tests__/bashHostIdentity.test.d.ts.map +1 -0
  51. package/dist/utils/__tests__/bashHostIdentity.test.js +39 -0
  52. package/dist/utils/__tests__/bashHostIdentity.test.js.map +1 -0
  53. package/dist/utils/__tests__/promoterCompetitionUtils.test.d.ts +2 -0
  54. package/dist/utils/__tests__/promoterCompetitionUtils.test.d.ts.map +1 -0
  55. package/dist/utils/__tests__/promoterCompetitionUtils.test.js +104 -0
  56. package/dist/utils/__tests__/promoterCompetitionUtils.test.js.map +1 -0
  57. package/dist/utils/__tests__/slugUtils.test.js +29 -2
  58. package/dist/utils/__tests__/slugUtils.test.js.map +1 -1
  59. package/dist/utils/bashHostIdentity.d.ts +18 -0
  60. package/dist/utils/bashHostIdentity.d.ts.map +1 -0
  61. package/dist/utils/bashHostIdentity.js +17 -0
  62. package/dist/utils/bashHostIdentity.js.map +1 -0
  63. package/dist/utils/promoterCompetitionUtils.d.ts +89 -0
  64. package/dist/utils/promoterCompetitionUtils.d.ts.map +1 -0
  65. package/dist/utils/promoterCompetitionUtils.js +158 -0
  66. package/dist/utils/promoterCompetitionUtils.js.map +1 -0
  67. package/dist/utils/slugUtils.d.ts +2 -0
  68. package/dist/utils/slugUtils.d.ts.map +1 -1
  69. package/dist/utils/slugUtils.js +5 -1
  70. package/dist/utils/slugUtils.js.map +1 -1
  71. package/package.json +1 -1
  72. package/prisma/schema.prisma +415 -25
  73. package/src/__tests__/accessScreening.test.ts +69 -1
  74. package/src/__tests__/applicationFunnel.test.ts +197 -0
  75. package/src/__tests__/definitionsHelpers.test.ts +24 -0
  76. package/src/__tests__/fundingMeter.test.ts +143 -0
  77. package/src/__tests__/giveaway.test.ts +111 -0
  78. package/src/__tests__/promoterCompetitionUtils.test.ts +334 -0
  79. package/src/accessScreening.ts +49 -0
  80. package/src/applicationFunnel.ts +225 -0
  81. package/src/definitions.ts +181 -5
  82. package/src/extendedSchemas.ts +116 -0
  83. package/src/fundingMeter.ts +188 -0
  84. package/src/giveaway.ts +182 -0
  85. package/src/index.ts +14 -0
  86. package/src/utils/__tests__/bashHostIdentity.test.ts +57 -0
  87. package/src/utils/__tests__/promoterCompetitionUtils.test.ts +128 -0
  88. package/src/utils/__tests__/slugUtils.test.ts +44 -0
  89. package/src/utils/bashHostIdentity.ts +30 -0
  90. package/src/utils/promoterCompetitionUtils.ts +235 -0
  91. package/src/utils/slugUtils.ts +11 -0
@@ -1,4 +1,36 @@
1
- import { accessScreeningBlocksAttendeeActions } from "../accessScreening.js";
1
+ import { accessScreeningApplies, accessScreeningBlocksAttendeeActions, accessScreeningBlocksAttendeeActionsForEvent, eventNeedsAccessRequestQueue, } from "../accessScreening.js";
2
+ describe("accessScreeningApplies", () => {
3
+ it("is on only when screening is on and Application is not", () => {
4
+ expect(accessScreeningApplies({ accessScreeningEnabled: true })).toBe(true);
5
+ expect(accessScreeningApplies({
6
+ accessScreeningEnabled: true,
7
+ applicationEnabled: true,
8
+ })).toBe(false);
9
+ expect(accessScreeningApplies({
10
+ accessScreeningEnabled: true,
11
+ ticketTiers: [{ requiresApplication: true }],
12
+ })).toBe(false);
13
+ expect(accessScreeningApplies({ accessScreeningEnabled: false })).toBe(false);
14
+ });
15
+ });
16
+ describe("eventNeedsAccessRequestQueue", () => {
17
+ it("shows the ticketed queue for screening or Application, not RSVP Application", () => {
18
+ expect(eventNeedsAccessRequestQueue({ accessScreeningEnabled: true })).toBe(true);
19
+ expect(eventNeedsAccessRequestQueue({
20
+ entryMode: "Ticketed",
21
+ applicationEnabled: true,
22
+ })).toBe(true);
23
+ expect(eventNeedsAccessRequestQueue({
24
+ entryMode: "Rsvp",
25
+ applicationEnabled: true,
26
+ accessScreeningEnabled: true,
27
+ })).toBe(false);
28
+ expect(eventNeedsAccessRequestQueue({
29
+ entryMode: "Rsvp",
30
+ accessScreeningEnabled: true,
31
+ })).toBe(true);
32
+ });
33
+ });
2
34
  describe("accessScreeningBlocksAttendeeActions", () => {
3
35
  it("does not block when screening is off", () => {
4
36
  expect(accessScreeningBlocksAttendeeActions(false, null, false)).toBe(false);
@@ -15,5 +47,11 @@ describe("accessScreeningBlocksAttendeeActions", () => {
15
47
  it("does not block ticket holders", () => {
16
48
  expect(accessScreeningBlocksAttendeeActions(true, "None", true)).toBe(false);
17
49
  });
50
+ it("does not block guests when Application supersedes leftover screening", () => {
51
+ expect(accessScreeningBlocksAttendeeActionsForEvent({
52
+ accessScreeningEnabled: true,
53
+ applicationEnabled: true,
54
+ }, "None", false)).toBe(false);
55
+ });
18
56
  });
19
57
  //# sourceMappingURL=accessScreening.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"accessScreening.test.js","sourceRoot":"","sources":["../../src/__tests__/accessScreening.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oCAAoC,EAAE,MAAM,uBAAuB,CAAC;AAE7E,QAAQ,CAAC,sCAAsC,EAAE,GAAG,EAAE;IACpD,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,MAAM,CAAC,oCAAoC,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC/E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACtC,MAAM,CAAC,oCAAoC,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,CACxE,KAAK,CACN,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qBAAqB,EAAE,GAAG,EAAE;QAC7B,MAAM,CAAC,oCAAoC,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,CACvE,IAAI,CACL,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oBAAoB,EAAE,GAAG,EAAE;QAC5B,MAAM,CAAC,oCAAoC,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,CACtE,IAAI,CACL,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACvC,MAAM,CAAC,oCAAoC,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC/E,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"accessScreening.test.js","sourceRoot":"","sources":["../../src/__tests__/accessScreening.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=applicationFunnel.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"applicationFunnel.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/applicationFunnel.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,126 @@
1
+ import { applicationBlocksTierPurchase, applicationsAreClosed, evaluateApplicationFunnel, eventHasApplication, missingRequiredQuestionIds, questionsForApplicationSurface, rsvpApplicationEnabled, selectedTiersRequireApplication, visibleApplicationQuestions, } from "../applicationFunnel.js";
2
+ const yesNo = {
3
+ id: "age",
4
+ type: "YesNo",
5
+ required: true,
6
+ mismatchAction: "AutoDeny",
7
+ acceptableOptions: ["Yes"],
8
+ };
9
+ describe("applicationFunnel", () => {
10
+ it("auto-denies a disallowed Yes/No answer", () => {
11
+ const result = evaluateApplicationFunnel([yesNo], [{ questionId: "age", answer: "No" }]);
12
+ expect(result.outcome).toBe("auto_deny");
13
+ expect(result.autoDenyQuestionIds).toEqual(["age"]);
14
+ });
15
+ it("flags a mismatch without auto-deny", () => {
16
+ const result = evaluateApplicationFunnel([
17
+ {
18
+ id: "single",
19
+ type: "SingleChoice",
20
+ mismatchAction: "FlagForReview",
21
+ acceptableOptions: ["Friend"],
22
+ },
23
+ ], [{ questionId: "single", answer: "Other" }]);
24
+ expect(result.outcome).toBe("flag");
25
+ expect(result.flaggedQuestionIds).toEqual(["single"]);
26
+ });
27
+ it("passes when the choice is acceptable", () => {
28
+ const result = evaluateApplicationFunnel([yesNo], [{ questionId: "age", answer: "Yes" }]);
29
+ expect(result.outcome).toBe("pass");
30
+ });
31
+ it("ignores free text for auto-deny", () => {
32
+ const result = evaluateApplicationFunnel([
33
+ {
34
+ id: "why",
35
+ type: "LongText",
36
+ mismatchAction: "AutoDeny",
37
+ acceptableOptions: ["never"],
38
+ },
39
+ ], [{ questionId: "why", answer: "because" }]);
40
+ expect(result.outcome).toBe("pass");
41
+ });
42
+ it("treats multi-choice as a mismatch when any selected option is not acceptable", () => {
43
+ const result = evaluateApplicationFunnel([
44
+ {
45
+ id: "dates",
46
+ type: "MultiChoice",
47
+ mismatchAction: "AutoDeny",
48
+ acceptableOptions: ["Women", "Men"],
49
+ },
50
+ ], [{ questionId: "dates", answer: "Women, Aliens" }]);
51
+ expect(result.outcome).toBe("auto_deny");
52
+ });
53
+ it("does not funnel when mismatchAction is None", () => {
54
+ const result = evaluateApplicationFunnel([
55
+ {
56
+ id: "song",
57
+ type: "SingleChoice",
58
+ mismatchAction: "None",
59
+ acceptableOptions: ["A"],
60
+ },
61
+ ], [{ questionId: "song", answer: "B" }]);
62
+ expect(result.outcome).toBe("pass");
63
+ });
64
+ it("lists missing required answers", () => {
65
+ expect(missingRequiredQuestionIds([yesNo, { id: "opt", type: "ShortText", required: false }], [])).toEqual(["age"]);
66
+ });
67
+ it("filters questions to a ticket tier plus event-wide rows", () => {
68
+ const rows = [
69
+ { id: "all", ticketTierId: null },
70
+ { id: "ga", ticketTierId: "tier-ga" },
71
+ { id: "vip", ticketTierId: "tier-vip" },
72
+ ];
73
+ expect(questionsForApplicationSurface(rows, "tier-ga").map((q) => q.id)).toEqual(["all", "ga"]);
74
+ expect(questionsForApplicationSurface(rows, null).map((q) => q.id)).toEqual([
75
+ "all",
76
+ ]);
77
+ });
78
+ it("detects event and RSVP application flags", () => {
79
+ expect(eventHasApplication({ applicationEnabled: false, ticketTiers: [] })).toBe(false);
80
+ expect(eventHasApplication({
81
+ applicationEnabled: false,
82
+ ticketTiers: [{ requiresApplication: true }],
83
+ })).toBe(true);
84
+ expect(rsvpApplicationEnabled({ entryMode: "Rsvp", applicationEnabled: true })).toBe(true);
85
+ expect(rsvpApplicationEnabled({ entryMode: "Ticketed", applicationEnabled: true })).toBe(false);
86
+ });
87
+ it("blocks purchase on application tiers until approved", () => {
88
+ expect(applicationBlocksTierPurchase({ requiresApplication: true }, "Pending", false)).toBe(true);
89
+ expect(applicationBlocksTierPurchase({ requiresApplication: true }, "Approved", false)).toBe(false);
90
+ expect(applicationBlocksTierPurchase({ requiresApplication: true }, "Pending", true)).toBe(false);
91
+ expect(applicationBlocksTierPurchase({ requiresApplication: false }, null, false)).toBe(false);
92
+ expect(selectedTiersRequireApplication([
93
+ { requiresApplication: false },
94
+ { requiresApplication: true },
95
+ ])).toBe(true);
96
+ });
97
+ it("treats a past deadline as closed", () => {
98
+ expect(applicationsAreClosed("2020-01-01T00:00:00.000Z")).toBe(true);
99
+ expect(applicationsAreClosed(null)).toBe(false);
100
+ expect(applicationsAreClosed("not-a-date")).toBe(false);
101
+ });
102
+ it("hides conditional follow-ups until the parent matches", () => {
103
+ const parent = {
104
+ id: "plus",
105
+ type: "YesNo",
106
+ required: true,
107
+ };
108
+ const child = {
109
+ id: "who",
110
+ type: "ShortText",
111
+ required: true,
112
+ parentQuestionId: "plus",
113
+ showWhenAnswer: "Yes",
114
+ };
115
+ expect(visibleApplicationQuestions([parent, child], [
116
+ { questionId: "plus", answer: "No" },
117
+ ]).map((q) => q.id)).toEqual(["plus"]);
118
+ expect(missingRequiredQuestionIds([parent, child], [
119
+ { questionId: "plus", answer: "No" },
120
+ ])).toEqual([]);
121
+ expect(visibleApplicationQuestions([parent, child], [
122
+ { questionId: "plus", answer: "Yes" },
123
+ ]).map((q) => q.id)).toEqual(["plus", "who"]);
124
+ });
125
+ });
126
+ //# sourceMappingURL=applicationFunnel.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"applicationFunnel.test.js","sourceRoot":"","sources":["../../src/__tests__/applicationFunnel.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, 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, } from "../definitions.js";
3
3
  describe("definitions helpers", () => {
4
4
  describe("createEmptyFilterFields", () => {
5
5
  test("returns fresh arrays not shared with EMPTY_FILTER_FIELDS", () => {
@@ -42,6 +42,25 @@ describe("definitions helpers", () => {
42
42
  expect(canonicalBashEventRowKey(" ")).toBe("");
43
43
  });
44
44
  });
45
+ describe("homepageBashEventRowKey", () => {
46
+ test("maps blank and unset types to Other", () => {
47
+ expect(homepageBashEventRowKey("")).toBe("Other");
48
+ expect(homepageBashEventRowKey(" ")).toBe("Other");
49
+ expect(homepageBashEventRowKey(null)).toBe("Other");
50
+ expect(homepageBashEventRowKey(undefined)).toBe("Other");
51
+ });
52
+ test("keeps known types canonical", () => {
53
+ expect(homepageBashEventRowKey("House Party")).toBe("HouseParty");
54
+ expect(homepageBashEventRowKey("Other")).toBe("Other");
55
+ });
56
+ });
57
+ describe("isUnsetBashEventType", () => {
58
+ test("treats blank and Other as unset", () => {
59
+ expect(isUnsetBashEventType("")).toBe(true);
60
+ expect(isUnsetBashEventType("Other")).toBe(true);
61
+ expect(isUnsetBashEventType("Party")).toBe(false);
62
+ });
63
+ });
45
64
  describe("PASSWORD_REQUIREMENTS_REGEX", () => {
46
65
  test("requires min length and mixed character classes", () => {
47
66
  expect(PASSWORD_MIN_LENGTH).toBe(8);
@@ -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,2BAA2B,EAC3B,mBAAmB,EACnB,mBAAmB,EACnB,6BAA6B,EAC7B,uBAAuB,EACvB,yBAAyB,EACzB,gCAAgC,EAChC,0BAA0B,EAC1B,2BAA2B,EAC3B,YAAY,GACb,MAAM,mBAAmB,CAAC;AAE3B,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,QAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE;QACvC,IAAI,CAAC,0DAA0D,EAAE,GAAG,EAAE;YACpE,MAAM,CAAC,GAAG,uBAAuB,EAAE,CAAC;YACpC,MAAM,CAAC,GAAG,uBAAuB,EAAE,CAAC;YACpC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACrB,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YAC5B,MAAM,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAChD,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,gCAAgC,EAAE,GAAG,EAAE;YAC1C,MAAM,CAAC,uBAAuB,EAAE,CAAC,CAAC,aAAa,CAAC;gBAC9C,YAAY,EAAE,KAAK;gBACnB,iBAAiB,EAAE,KAAK;gBACxB,cAAc,EAAE,KAAK;aACtB,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;QACpC,IAAI,CAAC,6CAA6C,EAAE,GAAG,EAAE;YACvD,MAAM,MAAM,GAAG;gBACb,IAAI,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE;gBACjB,KAAK,EAAE,IAAI;gBACX,IAAI,EAAE,KAAK;aACL,CAAC;YACT,MAAM,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QAC7E,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,qCAAqC,EAAE,GAAG,EAAE;YAC/C,MAAM,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;YACnD,MAAM,CAAC,oBAAoB,CAAC,SAAS,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;QAC1D,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;QACxC,IAAI,CAAC,yCAAyC,EAAE,GAAG,EAAE;YACnD,MAAM,CAAC,wBAAwB,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACrE,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,uCAAuC,EAAE,GAAG,EAAE;YACjD,MAAM,CAAC,wBAAwB,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACxE,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,sCAAsC,EAAE,GAAG,EAAE;YAChD,MAAM,CAAC,wBAAwB,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACnD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,6BAA6B,EAAE,GAAG,EAAE;QAC3C,IAAI,CAAC,iDAAiD,EAAE,GAAG,EAAE;YAC3D,MAAM,CAAC,mBAAmB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACpC,MAAM,CAAC,2BAA2B,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACjE,MAAM,CAAC,2BAA2B,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC/D,MAAM,CAAC,2BAA2B,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACzE,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,+BAA+B,EAAE,GAAG,EAAE;QAC7C,IAAI,CAAC,yCAAyC,EAAE,GAAG,EAAE;YACnD,MAAM,CACJ,6BAA6B,CAAC,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,CACxE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACf,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,mCAAmC,EAAE,GAAG,EAAE;YAC7C,MAAM,CACJ,6BAA6B,CAC3B,EAAE,YAAY,EAAE,yBAAyB,EAAE,MAAM,EAAE,IAAI,EAAE,EACzD,IAAI,CACL,CACF,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACf,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,iDAAiD,EAAE,GAAG,EAAE;YAC3D,MAAM,CACJ,6BAA6B,CAC3B,EAAE,YAAY,EAAE,gCAAgC,EAAE,MAAM,EAAE,IAAI,EAAE,EAChE,IAAI,CACL,CACF,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACd,MAAM,CACJ,6BAA6B,CAC3B,EAAE,YAAY,EAAE,gCAAgC,EAAE,MAAM,EAAE,IAAI,IAAI,EAAE,EAAE,EACtE,IAAI,CACL,CACF,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACf,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,sCAAsC,EAAE,GAAG,EAAE;YAChD,MAAM,CACJ,6BAA6B,CAAC,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,GAAG,CAAC,CAC1E,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACd,MAAM,CACJ,6BAA6B,CAAC,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,IAAI,EAAE,EAAE,EAAE,GAAG,CAAC,CAChF,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACf,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE;QACvC,IAAI,CAAC,0CAA0C,EAAE,GAAG,EAAE;YACpD,MAAM,CACJ,uBAAuB,CAAC;gBACtB,YAAY,EAAE,gCAAgC;gBAC9C,MAAM,EAAE,IAAI;aACb,CAAC,CACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACf,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,6CAA6C,EAAE,GAAG,EAAE;YACvD,MAAM,CACJ,uBAAuB,CAAC;gBACtB,YAAY,EAAE,gCAAgC;gBAC9C,MAAM,EAAE,IAAI,IAAI,EAAE;aACnB,CAAC,CACH,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACd,MAAM,CACJ,uBAAuB,CAAC,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAC/D,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAChB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,4BAA4B,EAAE,GAAG,EAAE;QAC1C,IAAI,CAAC,2CAA2C,EAAE,GAAG,EAAE;YACrD,MAAM,CAAC,0BAA0B,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAC3D,YAAY,CAAC,aAAa,CAC3B,CAAC;YACF,MAAM,CAAC,0BAA0B,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CACjE,YAAY,CAAC,OAAO,CACrB,CAAC;YACF,MAAM,CACJ,YAAY,CAAC,qBAAqB,IAAI,0BAA0B,CACjE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAChB,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,qEAAqE,EAAE,GAAG,EAAE;YAC/E,MAAM,CAAC,2BAA2B,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAC5D,YAAY,CAAC,aAAa,CAC3B,CAAC;YACF,MAAM,CACJ,2BAA2B,CAAC,YAAY,CAAC,qBAAqB,CAAC,CAChE,CAAC,aAAa,EAAE,CAAC;QACpB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"definitionsHelpers.test.js","sourceRoot":"","sources":["../../src/__tests__/definitionsHelpers.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=fundingMeter.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fundingMeter.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/fundingMeter.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,129 @@
1
+ import { computeFundingMeterProgress, contributionCountsAsCollected, contributionCountsAsOpenPledge, } from "../fundingMeter.js";
2
+ describe("fundingMeter progress math", () => {
3
+ const line = {
4
+ id: "ins",
5
+ name: "Insurance",
6
+ category: "Other",
7
+ totalAllocatedCents: 50000,
8
+ includeOnFundingMeter: true,
9
+ };
10
+ it("counts host-entered and Stripe Paid toward collected, not pledges", () => {
11
+ const progress = computeFundingMeterProgress({
12
+ showFundingMeter: true,
13
+ fundingAllowCommitments: true,
14
+ fundingShowPledgesOnMeter: false,
15
+ hostStripeConnected: true,
16
+ lines: [line],
17
+ contributions: [
18
+ {
19
+ budgetId: "ins",
20
+ amountCents: 10000,
21
+ kind: "Cash",
22
+ status: "Paid",
23
+ source: "Stripe",
24
+ displayName: "Alex",
25
+ note: null,
26
+ },
27
+ {
28
+ budgetId: "ins",
29
+ amountCents: 5000,
30
+ kind: "InKind",
31
+ status: "Fulfilled",
32
+ source: "HostEntered",
33
+ displayName: "Pearl Milk Tea",
34
+ note: "gift cards",
35
+ },
36
+ {
37
+ budgetId: "ins",
38
+ amountCents: 20000,
39
+ kind: "Cash",
40
+ status: "Pledged",
41
+ source: "PublicPledge",
42
+ displayName: "Sam",
43
+ note: null,
44
+ },
45
+ ],
46
+ });
47
+ expect(progress.collectedCents).toBe(15000);
48
+ expect(progress.pledgedCents).toBe(20000);
49
+ expect(progress.percentFunded).toBe(30);
50
+ expect(progress.lines[0].remainingCents).toBe(35000);
51
+ expect(progress.unallocatedCents).toBe(0);
52
+ });
53
+ it("keeps unallocated gifts out of percent funded and line remaining", () => {
54
+ const progress = computeFundingMeterProgress({
55
+ showFundingMeter: true,
56
+ fundingAllowCommitments: true,
57
+ fundingShowPledgesOnMeter: false,
58
+ hostStripeConnected: false,
59
+ lines: [line],
60
+ contributions: [
61
+ {
62
+ budgetId: null,
63
+ amountCents: 40000,
64
+ kind: "Cash",
65
+ status: "Paid",
66
+ source: "Stripe",
67
+ displayName: "Mystery",
68
+ note: null,
69
+ },
70
+ ],
71
+ });
72
+ expect(progress.collectedCents).toBe(0);
73
+ expect(progress.percentFunded).toBe(0);
74
+ expect(progress.unallocatedCents).toBe(40000);
75
+ expect(progress.lines[0].remainingCents).toBe(50000);
76
+ });
77
+ it("ignores declined and cancelled rows", () => {
78
+ expect(contributionCountsAsCollected({
79
+ budgetId: "ins",
80
+ amountCents: 1000,
81
+ kind: "Cash",
82
+ status: "Cancelled",
83
+ source: "HostEntered",
84
+ displayName: "x",
85
+ note: null,
86
+ })).toBe(false);
87
+ expect(contributionCountsAsOpenPledge({
88
+ budgetId: "ins",
89
+ amountCents: 1000,
90
+ kind: "Cash",
91
+ status: "Declined",
92
+ source: "PublicPledge",
93
+ displayName: "x",
94
+ note: null,
95
+ })).toBe(false);
96
+ });
97
+ it("excludes lines with includeOnFundingMeter false from the goal", () => {
98
+ const progress = computeFundingMeterProgress({
99
+ showFundingMeter: true,
100
+ fundingAllowCommitments: true,
101
+ fundingShowPledgesOnMeter: true,
102
+ hostStripeConnected: true,
103
+ lines: [
104
+ line,
105
+ {
106
+ id: "hidden",
107
+ name: "Internal",
108
+ category: null,
109
+ totalAllocatedCents: 99999,
110
+ includeOnFundingMeter: false,
111
+ },
112
+ ],
113
+ contributions: [
114
+ {
115
+ budgetId: "hidden",
116
+ amountCents: 99999,
117
+ kind: "Cash",
118
+ status: "Paid",
119
+ source: "HostEntered",
120
+ displayName: "Host",
121
+ note: null,
122
+ },
123
+ ],
124
+ });
125
+ expect(progress.goalCents).toBe(50000);
126
+ expect(progress.collectedCents).toBe(0);
127
+ });
128
+ });
129
+ //# sourceMappingURL=fundingMeter.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fundingMeter.test.js","sourceRoot":"","sources":["../../src/__tests__/fundingMeter.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=giveaway.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"giveaway.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/giveaway.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,65 @@
1
+ import { buildGiveawayAttendeeIdFromTicket, giveawayActiveDistributedCount, giveawayQualifyCopy, giveawayRemainingCopy, matchesCompetitionParticipant, resolveGiveawayAttendeeFromScan, ticketCountsAsCheckedIn, ticketCountsAsGiveawayTicket, } from "../giveaway.js";
2
+ describe("giveaway attendee identity", () => {
3
+ it("resolves ticket QR to ticket:{ticketId} for this event", () => {
4
+ const resolved = resolveGiveawayAttendeeFromScan("evt-1", JSON.stringify({ eventId: "evt-1", ticketId: "t-9", userId: "u-2" }));
5
+ expect(resolved).toEqual({
6
+ attendeeId: buildGiveawayAttendeeIdFromTicket("t-9"),
7
+ ticketId: "t-9",
8
+ userId: "u-2",
9
+ });
10
+ });
11
+ it("rejects a scan for a different event", () => {
12
+ expect(resolveGiveawayAttendeeFromScan("evt-1", JSON.stringify({ eventId: "evt-other", ticketId: "t-9" }))).toBeNull();
13
+ });
14
+ });
15
+ describe("giveaway copy", () => {
16
+ it("uses Enter the contest wording for CompetitionParticipants", () => {
17
+ expect(giveawayQualifyCopy({
18
+ eligibility: "CompetitionParticipants",
19
+ competitionName: "5K",
20
+ })).toBe("Enter 5K to qualify");
21
+ expect(giveawayQualifyCopy({ eligibility: "CompetitionParticipants" })).toBe("Enter the contest to qualify");
22
+ });
23
+ it("covers the rest of the eligibility matrix", () => {
24
+ expect(giveawayQualifyCopy({ eligibility: "AnyoneGoing" })).toBe("Anyone going to this bash can qualify");
25
+ expect(giveawayQualifyCopy({ eligibility: "TicketHolders" })).toBe("Ticket holders qualify");
26
+ expect(giveawayQualifyCopy({ eligibility: "CheckedIn" })).toBe("Checked-in attendees qualify");
27
+ expect(giveawayQualifyCopy({
28
+ eligibility: "SideQuestCompleters",
29
+ sideQuestTitle: "Find the booth",
30
+ })).toBe("Complete Find the booth to qualify");
31
+ expect(giveawayQualifyCopy({ eligibility: "SideQuestCompleters" })).toBe("Complete the side quest to qualify");
32
+ });
33
+ it("shows All distributed when remaining is 0", () => {
34
+ expect(giveawayRemainingCopy(0)).toBe("All distributed");
35
+ expect(giveawayRemainingCopy(43)).toBe("43 remaining");
36
+ });
37
+ });
38
+ describe("eligibility helpers", () => {
39
+ it("treats Pending tickets as ticket holders but not checked in", () => {
40
+ expect(ticketCountsAsGiveawayTicket("Pending")).toBe(true);
41
+ expect(ticketCountsAsCheckedIn({ status: "Pending", checkedInAt: null })).toBe(false);
42
+ expect(ticketCountsAsCheckedIn({ status: "Pending", checkedInAt: new Date() })).toBe(true);
43
+ });
44
+ it("matches email-only competition participants", () => {
45
+ expect(matchesCompetitionParticipant({
46
+ userId: "acct-1",
47
+ email: "Sam@Example.com",
48
+ participants: [
49
+ { status: "ACCEPTED", userId: null, email: "sam@example.com" },
50
+ ],
51
+ })).toBe(true);
52
+ expect(matchesCompetitionParticipant({
53
+ userId: "acct-1",
54
+ email: "other@example.com",
55
+ participants: [
56
+ { status: "ACCEPTED", userId: null, email: "sam@example.com" },
57
+ ],
58
+ })).toBe(false);
59
+ });
60
+ it("treats quantityTotal - remaining as active inventory, not history", () => {
61
+ expect(giveawayActiveDistributedCount(100, 43)).toBe(57);
62
+ expect(giveawayActiveDistributedCount(100, 100)).toBe(0);
63
+ });
64
+ });
65
+ //# sourceMappingURL=giveaway.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"giveaway.test.js","sourceRoot":"","sources":["../../src/__tests__/giveaway.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=promoterCompetitionUtils.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"promoterCompetitionUtils.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/promoterCompetitionUtils.test.ts"],"names":[],"mappings":""}