@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.
- package/dist/__tests__/accessScreening.test.js +39 -1
- package/dist/__tests__/accessScreening.test.js.map +1 -1
- package/dist/__tests__/applicationFunnel.test.d.ts +2 -0
- package/dist/__tests__/applicationFunnel.test.d.ts.map +1 -0
- package/dist/__tests__/applicationFunnel.test.js +126 -0
- package/dist/__tests__/applicationFunnel.test.js.map +1 -0
- package/dist/__tests__/definitionsHelpers.test.js +20 -1
- package/dist/__tests__/definitionsHelpers.test.js.map +1 -1
- package/dist/__tests__/fundingMeter.test.d.ts +2 -0
- package/dist/__tests__/fundingMeter.test.d.ts.map +1 -0
- package/dist/__tests__/fundingMeter.test.js +129 -0
- package/dist/__tests__/fundingMeter.test.js.map +1 -0
- package/dist/__tests__/giveaway.test.d.ts +2 -0
- package/dist/__tests__/giveaway.test.d.ts.map +1 -0
- package/dist/__tests__/giveaway.test.js +65 -0
- package/dist/__tests__/giveaway.test.js.map +1 -0
- package/dist/__tests__/promoterCompetitionUtils.test.d.ts +2 -0
- package/dist/__tests__/promoterCompetitionUtils.test.d.ts.map +1 -0
- package/dist/__tests__/promoterCompetitionUtils.test.js +262 -0
- package/dist/__tests__/promoterCompetitionUtils.test.js.map +1 -0
- package/dist/accessScreening.d.ts +18 -3
- package/dist/accessScreening.d.ts.map +1 -1
- package/dist/accessScreening.js +26 -0
- package/dist/accessScreening.js.map +1 -1
- package/dist/applicationFunnel.d.ts +58 -0
- package/dist/applicationFunnel.d.ts.map +1 -0
- package/dist/applicationFunnel.js +147 -0
- package/dist/applicationFunnel.js.map +1 -0
- package/dist/definitions.d.ts +145 -5
- package/dist/definitions.d.ts.map +1 -1
- package/dist/definitions.js +137 -5
- package/dist/definitions.js.map +1 -1
- package/dist/extendedSchemas.d.ts +159 -0
- package/dist/extendedSchemas.d.ts.map +1 -1
- package/dist/extendedSchemas.js +6 -0
- package/dist/extendedSchemas.js.map +1 -1
- package/dist/fundingMeter.d.ts +66 -0
- package/dist/fundingMeter.d.ts.map +1 -0
- package/dist/fundingMeter.js +99 -0
- package/dist/fundingMeter.js.map +1 -0
- package/dist/giveaway.d.ts +71 -0
- package/dist/giveaway.d.ts.map +1 -0
- package/dist/giveaway.js +117 -0
- package/dist/giveaway.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- package/dist/utils/__tests__/bashHostIdentity.test.d.ts +2 -0
- package/dist/utils/__tests__/bashHostIdentity.test.d.ts.map +1 -0
- package/dist/utils/__tests__/bashHostIdentity.test.js +39 -0
- package/dist/utils/__tests__/bashHostIdentity.test.js.map +1 -0
- package/dist/utils/__tests__/promoterCompetitionUtils.test.d.ts +2 -0
- package/dist/utils/__tests__/promoterCompetitionUtils.test.d.ts.map +1 -0
- package/dist/utils/__tests__/promoterCompetitionUtils.test.js +104 -0
- package/dist/utils/__tests__/promoterCompetitionUtils.test.js.map +1 -0
- package/dist/utils/__tests__/slugUtils.test.js +29 -2
- package/dist/utils/__tests__/slugUtils.test.js.map +1 -1
- package/dist/utils/bashHostIdentity.d.ts +18 -0
- package/dist/utils/bashHostIdentity.d.ts.map +1 -0
- package/dist/utils/bashHostIdentity.js +17 -0
- package/dist/utils/bashHostIdentity.js.map +1 -0
- package/dist/utils/promoterCompetitionUtils.d.ts +89 -0
- package/dist/utils/promoterCompetitionUtils.d.ts.map +1 -0
- package/dist/utils/promoterCompetitionUtils.js +158 -0
- package/dist/utils/promoterCompetitionUtils.js.map +1 -0
- package/dist/utils/slugUtils.d.ts +2 -0
- package/dist/utils/slugUtils.d.ts.map +1 -1
- package/dist/utils/slugUtils.js +5 -1
- package/dist/utils/slugUtils.js.map +1 -1
- package/package.json +1 -1
- package/prisma/schema.prisma +415 -25
- package/src/__tests__/accessScreening.test.ts +69 -1
- package/src/__tests__/applicationFunnel.test.ts +197 -0
- package/src/__tests__/definitionsHelpers.test.ts +24 -0
- package/src/__tests__/fundingMeter.test.ts +143 -0
- package/src/__tests__/giveaway.test.ts +111 -0
- package/src/__tests__/promoterCompetitionUtils.test.ts +334 -0
- package/src/accessScreening.ts +49 -0
- package/src/applicationFunnel.ts +225 -0
- package/src/definitions.ts +181 -5
- package/src/extendedSchemas.ts +116 -0
- package/src/fundingMeter.ts +188 -0
- package/src/giveaway.ts +182 -0
- package/src/index.ts +14 -0
- package/src/utils/__tests__/bashHostIdentity.test.ts +57 -0
- package/src/utils/__tests__/promoterCompetitionUtils.test.ts +128 -0
- package/src/utils/__tests__/slugUtils.test.ts +44 -0
- package/src/utils/bashHostIdentity.ts +30 -0
- package/src/utils/promoterCompetitionUtils.ts +235 -0
- package/src/utils/slugUtils.ts +11 -0
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* bash-common promoterCompetitionUtils — pure function tests.
|
|
3
|
+
*
|
|
4
|
+
* Covers: formatPromoterRewardLabel, computePromoterCompetitionEconomics,
|
|
5
|
+
* suggestPromoterSalesGoal, getPromoterReputationLabel.
|
|
6
|
+
*
|
|
7
|
+
* No mocks needed — all functions are side-effect free.
|
|
8
|
+
*/
|
|
9
|
+
import { formatPromoterRewardLabel, computePromoterCompetitionEconomics, suggestPromoterSalesGoal, getPromoterReputationLabel, } from "../utils/promoterCompetitionUtils.js";
|
|
10
|
+
import { PromoterRewardMode, PromoterRewardType } from "../definitions.js";
|
|
11
|
+
// ─── formatPromoterRewardLabel ────────────────────────────────────────────────
|
|
12
|
+
describe("formatPromoterRewardLabel", () => {
|
|
13
|
+
it("formats a threshold CASH milestone as 'N sales → $X'", () => {
|
|
14
|
+
expect(formatPromoterRewardLabel({
|
|
15
|
+
threshold: 5,
|
|
16
|
+
rank: null,
|
|
17
|
+
rewardType: PromoterRewardType.CASH,
|
|
18
|
+
rewardAmountCents: 1500,
|
|
19
|
+
rewardDescription: null,
|
|
20
|
+
})).toBe("5 sales → $15");
|
|
21
|
+
});
|
|
22
|
+
it("formats a threshold CASH milestone with triple-digit amount", () => {
|
|
23
|
+
expect(formatPromoterRewardLabel({
|
|
24
|
+
threshold: 35,
|
|
25
|
+
rank: null,
|
|
26
|
+
rewardType: PromoterRewardType.CASH,
|
|
27
|
+
rewardAmountCents: 25000,
|
|
28
|
+
rewardDescription: null,
|
|
29
|
+
})).toBe("35 sales → $250");
|
|
30
|
+
});
|
|
31
|
+
it("formats a threshold ACCESS milestone using rewardDescription", () => {
|
|
32
|
+
expect(formatPromoterRewardLabel({
|
|
33
|
+
threshold: 10,
|
|
34
|
+
rank: null,
|
|
35
|
+
rewardType: PromoterRewardType.ACCESS,
|
|
36
|
+
rewardAmountCents: null,
|
|
37
|
+
rewardDescription: "Backstage access",
|
|
38
|
+
})).toBe("10 sales → Backstage access");
|
|
39
|
+
});
|
|
40
|
+
it("falls back to rewardType when description is missing and reward is non-cash", () => {
|
|
41
|
+
expect(formatPromoterRewardLabel({
|
|
42
|
+
threshold: 10,
|
|
43
|
+
rank: null,
|
|
44
|
+
rewardType: PromoterRewardType.TICKET,
|
|
45
|
+
rewardAmountCents: null,
|
|
46
|
+
rewardDescription: null,
|
|
47
|
+
})).toBe("10 sales → TICKET");
|
|
48
|
+
});
|
|
49
|
+
it("formats rank=1 as 'Top promoter → ...'", () => {
|
|
50
|
+
expect(formatPromoterRewardLabel({
|
|
51
|
+
threshold: null,
|
|
52
|
+
rank: 1,
|
|
53
|
+
rewardType: PromoterRewardType.CASH,
|
|
54
|
+
rewardAmountCents: 25000,
|
|
55
|
+
rewardDescription: null,
|
|
56
|
+
})).toBe("Top promoter → $250");
|
|
57
|
+
});
|
|
58
|
+
it("formats rank > 1 as 'Top N promoter → ...'", () => {
|
|
59
|
+
expect(formatPromoterRewardLabel({
|
|
60
|
+
threshold: null,
|
|
61
|
+
rank: 3,
|
|
62
|
+
rewardType: PromoterRewardType.CASH,
|
|
63
|
+
rewardAmountCents: 10000,
|
|
64
|
+
rewardDescription: null,
|
|
65
|
+
})).toBe("Top 3 promoter → $100");
|
|
66
|
+
});
|
|
67
|
+
it("formats a CREDIT milestone the same as CASH (dollar sign, no cents when round)", () => {
|
|
68
|
+
expect(formatPromoterRewardLabel({
|
|
69
|
+
threshold: 20,
|
|
70
|
+
rank: null,
|
|
71
|
+
rewardType: PromoterRewardType.CREDIT,
|
|
72
|
+
rewardAmountCents: 5000,
|
|
73
|
+
rewardDescription: null,
|
|
74
|
+
})).toBe("20 sales → $50");
|
|
75
|
+
});
|
|
76
|
+
});
|
|
77
|
+
// ─── computePromoterCompetitionEconomics (bash-common version) ────────────────
|
|
78
|
+
describe("computePromoterCompetitionEconomics (bash-common)", () => {
|
|
79
|
+
const baseMilestones = [
|
|
80
|
+
{ threshold: 5, rank: null, rewardType: PromoterRewardType.CASH, rewardAmountCents: 1500, rewardDescription: null },
|
|
81
|
+
{ threshold: 10, rank: null, rewardType: PromoterRewardType.CASH, rewardAmountCents: 4000, rewardDescription: null },
|
|
82
|
+
{ threshold: 20, rank: null, rewardType: PromoterRewardType.ACCESS, rewardAmountCents: null, rewardDescription: "VIP access" },
|
|
83
|
+
{ threshold: 35, rank: null, rewardType: PromoterRewardType.CASH, rewardAmountCents: 10000, rewardDescription: null },
|
|
84
|
+
];
|
|
85
|
+
it("computes correct gross potential revenue (100 tickets × $40)", () => {
|
|
86
|
+
const result = computePromoterCompetitionEconomics({
|
|
87
|
+
ticketPriceCents: 4000,
|
|
88
|
+
salesGoal: 100,
|
|
89
|
+
milestones: baseMilestones,
|
|
90
|
+
rewardMode: PromoterRewardMode.TOTAL_AT_MILESTONE,
|
|
91
|
+
});
|
|
92
|
+
expect(result.grossPotentialRevenueCents).toBe(400000); // 4000 × 100
|
|
93
|
+
});
|
|
94
|
+
it("TOTAL_AT_MILESTONE: max cash exposure is the highest threshold CASH reward ($100)", () => {
|
|
95
|
+
const result = computePromoterCompetitionEconomics({
|
|
96
|
+
ticketPriceCents: 4000,
|
|
97
|
+
salesGoal: 100,
|
|
98
|
+
milestones: baseMilestones,
|
|
99
|
+
rewardMode: PromoterRewardMode.TOTAL_AT_MILESTONE,
|
|
100
|
+
});
|
|
101
|
+
expect(result.maxCashRewardExposureCents).toBe(10000); // $100 (not $15+$40+$100)
|
|
102
|
+
});
|
|
103
|
+
it("ADDITIVE: max cash exposure sums all threshold CASH rewards ($15 + $40 + $100 = $155)", () => {
|
|
104
|
+
const result = computePromoterCompetitionEconomics({
|
|
105
|
+
ticketPriceCents: 4000,
|
|
106
|
+
salesGoal: 100,
|
|
107
|
+
milestones: baseMilestones,
|
|
108
|
+
rewardMode: PromoterRewardMode.ADDITIVE,
|
|
109
|
+
});
|
|
110
|
+
expect(result.maxCashRewardExposureCents).toBe(15500); // 1500 + 4000 + 10000
|
|
111
|
+
});
|
|
112
|
+
it("rank=1 CASH reward adds to exposure on top of threshold rewards regardless of mode", () => {
|
|
113
|
+
const milestonesWithRank = [
|
|
114
|
+
...baseMilestones,
|
|
115
|
+
{ threshold: null, rank: 1, rewardType: PromoterRewardType.CASH, rewardAmountCents: 20000, rewardDescription: null },
|
|
116
|
+
];
|
|
117
|
+
const totalAt = computePromoterCompetitionEconomics({
|
|
118
|
+
ticketPriceCents: 4000,
|
|
119
|
+
salesGoal: 100,
|
|
120
|
+
milestones: milestonesWithRank,
|
|
121
|
+
rewardMode: PromoterRewardMode.TOTAL_AT_MILESTONE,
|
|
122
|
+
});
|
|
123
|
+
// TOTAL_AT_MILESTONE: max threshold cash = $100 (10000) + rank cash = $200 (20000)
|
|
124
|
+
expect(totalAt.maxCashRewardExposureCents).toBe(10000 + 20000);
|
|
125
|
+
const additive = computePromoterCompetitionEconomics({
|
|
126
|
+
ticketPriceCents: 4000,
|
|
127
|
+
salesGoal: 100,
|
|
128
|
+
milestones: milestonesWithRank,
|
|
129
|
+
rewardMode: PromoterRewardMode.ADDITIVE,
|
|
130
|
+
});
|
|
131
|
+
// ADDITIVE: sum of threshold cash + rank cash
|
|
132
|
+
expect(additive.maxCashRewardExposureCents).toBe(15500 + 20000);
|
|
133
|
+
});
|
|
134
|
+
it("effectiveAcquisitionCostPct is expressed as a 0–100 percentage rounded to 1 decimal", () => {
|
|
135
|
+
// 10000 / 400000 = 0.025 → × 1000 = 25 → round → 25 → /10 = 2.5
|
|
136
|
+
const result = computePromoterCompetitionEconomics({
|
|
137
|
+
ticketPriceCents: 4000,
|
|
138
|
+
salesGoal: 100,
|
|
139
|
+
milestones: baseMilestones,
|
|
140
|
+
rewardMode: PromoterRewardMode.TOTAL_AT_MILESTONE,
|
|
141
|
+
});
|
|
142
|
+
expect(result.effectiveAcquisitionCostPct).toBe(2.5);
|
|
143
|
+
});
|
|
144
|
+
it("returns 0 for effectiveAcquisitionCostPct when salesGoal is 0 (no division-by-zero)", () => {
|
|
145
|
+
const result = computePromoterCompetitionEconomics({
|
|
146
|
+
ticketPriceCents: 4000,
|
|
147
|
+
salesGoal: 0,
|
|
148
|
+
milestones: baseMilestones,
|
|
149
|
+
rewardMode: PromoterRewardMode.ADDITIVE,
|
|
150
|
+
});
|
|
151
|
+
expect(result.effectiveAcquisitionCostPct).toBe(0);
|
|
152
|
+
expect(result.grossPotentialRevenueCents).toBe(0);
|
|
153
|
+
});
|
|
154
|
+
it("includes a rewardBreakdown array with threshold milestones sorted ascending before rank", () => {
|
|
155
|
+
const result = computePromoterCompetitionEconomics({
|
|
156
|
+
ticketPriceCents: 4000,
|
|
157
|
+
salesGoal: 100,
|
|
158
|
+
milestones: [
|
|
159
|
+
{ threshold: 10, rank: null, rewardType: PromoterRewardType.CASH, rewardAmountCents: 4000, rewardDescription: null },
|
|
160
|
+
{ threshold: null, rank: 1, rewardType: PromoterRewardType.CASH, rewardAmountCents: 20000, rewardDescription: null },
|
|
161
|
+
{ threshold: 5, rank: null, rewardType: PromoterRewardType.CASH, rewardAmountCents: 1500, rewardDescription: null },
|
|
162
|
+
],
|
|
163
|
+
rewardMode: PromoterRewardMode.ADDITIVE,
|
|
164
|
+
});
|
|
165
|
+
expect(result.rewardBreakdown).toHaveLength(3);
|
|
166
|
+
// threshold 5 first, threshold 10 second, rank 1 last
|
|
167
|
+
expect(result.rewardBreakdown[0].label).toBe("5 sales → $15");
|
|
168
|
+
expect(result.rewardBreakdown[1].label).toBe("10 sales → $40");
|
|
169
|
+
expect(result.rewardBreakdown[2].label).toBe("Top promoter → $200");
|
|
170
|
+
});
|
|
171
|
+
});
|
|
172
|
+
// ─── suggestPromoterSalesGoal ─────────────────────────────────────────────────
|
|
173
|
+
describe("suggestPromoterSalesGoal", () => {
|
|
174
|
+
it("returns null when capacity is null", () => {
|
|
175
|
+
expect(suggestPromoterSalesGoal({ capacity: null, ticketsSold: 50 })).toBeNull();
|
|
176
|
+
});
|
|
177
|
+
it("returns null when capacity is 0 or negative", () => {
|
|
178
|
+
expect(suggestPromoterSalesGoal({ capacity: 0, ticketsSold: 0 })).toBeNull();
|
|
179
|
+
expect(suggestPromoterSalesGoal({ capacity: -1, ticketsSold: 0 })).toBeNull();
|
|
180
|
+
});
|
|
181
|
+
it("returns null when venue is full (remaining = 0)", () => {
|
|
182
|
+
expect(suggestPromoterSalesGoal({ capacity: 200, ticketsSold: 200 })).toBeNull();
|
|
183
|
+
});
|
|
184
|
+
it("snaps to nearest benchmark: capacity=200, sold=27 → remaining=173 → target≈86 → 75", () => {
|
|
185
|
+
// target = 173 × 0.5 = 86.5
|
|
186
|
+
// distances: |86.5-75|=11.5, |86.5-100|=13.5 → 75 wins
|
|
187
|
+
const result = suggestPromoterSalesGoal({ capacity: 200, ticketsSold: 27 });
|
|
188
|
+
expect(result).toBe(75);
|
|
189
|
+
});
|
|
190
|
+
it("treats null ticketsSold as 0", () => {
|
|
191
|
+
// capacity=100, sold=null → remaining=100 → target=50 → snap to 50
|
|
192
|
+
const result = suggestPromoterSalesGoal({ capacity: 100, ticketsSold: null });
|
|
193
|
+
expect(result).toBe(50);
|
|
194
|
+
});
|
|
195
|
+
it("snaps to lowest benchmark (25) for very small remaining capacity", () => {
|
|
196
|
+
// capacity=50, sold=45 → remaining=5 → target=2.5 → nearest to 25 (all benchmarks > 5, so 25 wins)
|
|
197
|
+
const result = suggestPromoterSalesGoal({ capacity: 50, ticketsSold: 45 });
|
|
198
|
+
expect(result).toBe(25);
|
|
199
|
+
});
|
|
200
|
+
});
|
|
201
|
+
// ─── getPromoterReputationLabel ───────────────────────────────────────────────
|
|
202
|
+
describe("getPromoterReputationLabel", () => {
|
|
203
|
+
const base = {
|
|
204
|
+
lifetimeQualifiedTickets: 0,
|
|
205
|
+
totalCompetitionsWon: 0,
|
|
206
|
+
totalEventsPromoted: 0,
|
|
207
|
+
repeatOrganizerCount: 0,
|
|
208
|
+
totalMilestonesReached: 0,
|
|
209
|
+
};
|
|
210
|
+
it("returns null when totalEventsPromoted is 0 (no promoter track record yet)", () => {
|
|
211
|
+
expect(getPromoterReputationLabel({ ...base, totalEventsPromoted: 0 })).toBeNull();
|
|
212
|
+
});
|
|
213
|
+
it("returns 'Competition Winner' when at least one competition was won", () => {
|
|
214
|
+
expect(getPromoterReputationLabel({
|
|
215
|
+
...base,
|
|
216
|
+
totalEventsPromoted: 1,
|
|
217
|
+
totalCompetitionsWon: 1,
|
|
218
|
+
})).toBe("Competition Winner");
|
|
219
|
+
});
|
|
220
|
+
it("returns '100+ Tickets Sold' when lifetimeQualifiedTickets >= 100 (and no competition win)", () => {
|
|
221
|
+
expect(getPromoterReputationLabel({
|
|
222
|
+
...base,
|
|
223
|
+
totalEventsPromoted: 2,
|
|
224
|
+
lifetimeQualifiedTickets: 100,
|
|
225
|
+
})).toBe("100+ Tickets Sold");
|
|
226
|
+
});
|
|
227
|
+
it("returns 'Repeat Collaborator' when worked with 2+ organizers (and lower-priority conditions unmet)", () => {
|
|
228
|
+
expect(getPromoterReputationLabel({
|
|
229
|
+
...base,
|
|
230
|
+
totalEventsPromoted: 2,
|
|
231
|
+
repeatOrganizerCount: 2,
|
|
232
|
+
})).toBe("Repeat Collaborator");
|
|
233
|
+
});
|
|
234
|
+
it("returns 'Experienced Promoter' when 3+ events promoted and no higher-priority label applies", () => {
|
|
235
|
+
expect(getPromoterReputationLabel({
|
|
236
|
+
...base,
|
|
237
|
+
totalEventsPromoted: 3,
|
|
238
|
+
})).toBe("Experienced Promoter");
|
|
239
|
+
});
|
|
240
|
+
it("returns 'Top Seller' when at least one milestone was reached and no higher-priority label applies", () => {
|
|
241
|
+
expect(getPromoterReputationLabel({
|
|
242
|
+
...base,
|
|
243
|
+
totalEventsPromoted: 1,
|
|
244
|
+
totalMilestonesReached: 1,
|
|
245
|
+
})).toBe("Top Seller");
|
|
246
|
+
});
|
|
247
|
+
it("returns null when promoted 1 event but no notable achievements", () => {
|
|
248
|
+
expect(getPromoterReputationLabel({
|
|
249
|
+
...base,
|
|
250
|
+
totalEventsPromoted: 1,
|
|
251
|
+
})).toBeNull();
|
|
252
|
+
});
|
|
253
|
+
it("respects priority order: Competition Winner beats 100+ Tickets Sold", () => {
|
|
254
|
+
expect(getPromoterReputationLabel({
|
|
255
|
+
...base,
|
|
256
|
+
totalEventsPromoted: 5,
|
|
257
|
+
totalCompetitionsWon: 1,
|
|
258
|
+
lifetimeQualifiedTickets: 500,
|
|
259
|
+
})).toBe("Competition Winner");
|
|
260
|
+
});
|
|
261
|
+
});
|
|
262
|
+
//# sourceMappingURL=promoterCompetitionUtils.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"promoterCompetitionUtils.test.js","sourceRoot":"","sources":["../../src/__tests__/promoterCompetitionUtils.test.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EACL,yBAAyB,EACzB,mCAAmC,EACnC,wBAAwB,EACxB,0BAA0B,GAC3B,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAE3E,iFAAiF;AAEjF,QAAQ,CAAC,2BAA2B,EAAE,GAAG,EAAE;IACzC,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;QAC9D,MAAM,CACJ,yBAAyB,CAAC;YACxB,SAAS,EAAE,CAAC;YACZ,IAAI,EAAE,IAAI;YACV,UAAU,EAAE,kBAAkB,CAAC,IAAI;YACnC,iBAAiB,EAAE,IAAI;YACvB,iBAAiB,EAAE,IAAI;SACxB,CAAC,CACH,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IAC1B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6DAA6D,EAAE,GAAG,EAAE;QACrE,MAAM,CACJ,yBAAyB,CAAC;YACxB,SAAS,EAAE,EAAE;YACb,IAAI,EAAE,IAAI;YACV,UAAU,EAAE,kBAAkB,CAAC,IAAI;YACnC,iBAAiB,EAAE,KAAK;YACxB,iBAAiB,EAAE,IAAI;SACxB,CAAC,CACH,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IAC5B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8DAA8D,EAAE,GAAG,EAAE;QACtE,MAAM,CACJ,yBAAyB,CAAC;YACxB,SAAS,EAAE,EAAE;YACb,IAAI,EAAE,IAAI;YACV,UAAU,EAAE,kBAAkB,CAAC,MAAM;YACrC,iBAAiB,EAAE,IAAI;YACvB,iBAAiB,EAAE,kBAAkB;SACtC,CAAC,CACH,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6EAA6E,EAAE,GAAG,EAAE;QACrF,MAAM,CACJ,yBAAyB,CAAC;YACxB,SAAS,EAAE,EAAE;YACb,IAAI,EAAE,IAAI;YACV,UAAU,EAAE,kBAAkB,CAAC,MAAM;YACrC,iBAAiB,EAAE,IAAI;YACvB,iBAAiB,EAAE,IAAI;SACxB,CAAC,CACH,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;IAC9B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,MAAM,CACJ,yBAAyB,CAAC;YACxB,SAAS,EAAE,IAAI;YACf,IAAI,EAAE,CAAC;YACP,UAAU,EAAE,kBAAkB,CAAC,IAAI;YACnC,iBAAiB,EAAE,KAAK;YACxB,iBAAiB,EAAE,IAAI;SACxB,CAAC,CACH,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;IAChC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,MAAM,CACJ,yBAAyB,CAAC;YACxB,SAAS,EAAE,IAAI;YACf,IAAI,EAAE,CAAC;YACP,UAAU,EAAE,kBAAkB,CAAC,IAAI;YACnC,iBAAiB,EAAE,KAAK;YACxB,iBAAiB,EAAE,IAAI;SACxB,CAAC,CACH,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gFAAgF,EAAE,GAAG,EAAE;QACxF,MAAM,CACJ,yBAAyB,CAAC;YACxB,SAAS,EAAE,EAAE;YACb,IAAI,EAAE,IAAI;YACV,UAAU,EAAE,kBAAkB,CAAC,MAAM;YACrC,iBAAiB,EAAE,IAAI;YACvB,iBAAiB,EAAE,IAAI;SACxB,CAAC,CACH,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IAC3B,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,iFAAiF;AAEjF,QAAQ,CAAC,mDAAmD,EAAE,GAAG,EAAE;IACjE,MAAM,cAAc,GAAG;QACrB,EAAE,SAAS,EAAE,CAAC,EAAG,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,kBAAkB,CAAC,IAAI,EAAI,iBAAiB,EAAE,IAAI,EAAG,iBAAiB,EAAE,IAAI,EAAE;QACvH,EAAE,SAAS,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,kBAAkB,CAAC,IAAI,EAAI,iBAAiB,EAAE,IAAI,EAAG,iBAAiB,EAAE,IAAI,EAAE;QACvH,EAAE,SAAS,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,kBAAkB,CAAC,MAAM,EAAG,iBAAiB,EAAE,IAAI,EAAG,iBAAiB,EAAE,YAAY,EAAE;QAChI,EAAE,SAAS,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,kBAAkB,CAAC,IAAI,EAAI,iBAAiB,EAAE,KAAK,EAAE,iBAAiB,EAAE,IAAI,EAAE;KACxH,CAAC;IAEF,EAAE,CAAC,8DAA8D,EAAE,GAAG,EAAE;QACtE,MAAM,MAAM,GAAG,mCAAmC,CAAC;YACjD,gBAAgB,EAAE,IAAI;YACtB,SAAS,EAAE,GAAG;YACd,UAAU,EAAE,cAAc;YAC1B,UAAU,EAAE,kBAAkB,CAAC,kBAAkB;SAClD,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,0BAA0B,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,aAAa;IACvE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mFAAmF,EAAE,GAAG,EAAE;QAC3F,MAAM,MAAM,GAAG,mCAAmC,CAAC;YACjD,gBAAgB,EAAE,IAAI;YACtB,SAAS,EAAE,GAAG;YACd,UAAU,EAAE,cAAc;YAC1B,UAAU,EAAE,kBAAkB,CAAC,kBAAkB;SAClD,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,0BAA0B,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,0BAA0B;IACnF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uFAAuF,EAAE,GAAG,EAAE;QAC/F,MAAM,MAAM,GAAG,mCAAmC,CAAC;YACjD,gBAAgB,EAAE,IAAI;YACtB,SAAS,EAAE,GAAG;YACd,UAAU,EAAE,cAAc;YAC1B,UAAU,EAAE,kBAAkB,CAAC,QAAQ;SACxC,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,0BAA0B,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,sBAAsB;IAC/E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oFAAoF,EAAE,GAAG,EAAE;QAC5F,MAAM,kBAAkB,GAAG;YACzB,GAAG,cAAc;YACjB,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,UAAU,EAAE,kBAAkB,CAAC,IAAI,EAAE,iBAAiB,EAAE,KAAK,EAAE,iBAAiB,EAAE,IAAI,EAAE;SACrH,CAAC;QAEF,MAAM,OAAO,GAAG,mCAAmC,CAAC;YAClD,gBAAgB,EAAE,IAAI;YACtB,SAAS,EAAE,GAAG;YACd,UAAU,EAAE,kBAAkB;YAC9B,UAAU,EAAE,kBAAkB,CAAC,kBAAkB;SAClD,CAAC,CAAC;QACH,mFAAmF;QACnF,MAAM,CAAC,OAAO,CAAC,0BAA0B,CAAC,CAAC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC;QAE/D,MAAM,QAAQ,GAAG,mCAAmC,CAAC;YACnD,gBAAgB,EAAE,IAAI;YACtB,SAAS,EAAE,GAAG;YACd,UAAU,EAAE,kBAAkB;YAC9B,UAAU,EAAE,kBAAkB,CAAC,QAAQ;SACxC,CAAC,CAAC;QACH,8CAA8C;QAC9C,MAAM,CAAC,QAAQ,CAAC,0BAA0B,CAAC,CAAC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qFAAqF,EAAE,GAAG,EAAE;QAC7F,gEAAgE;QAChE,MAAM,MAAM,GAAG,mCAAmC,CAAC;YACjD,gBAAgB,EAAE,IAAI;YACtB,SAAS,EAAE,GAAG;YACd,UAAU,EAAE,cAAc;YAC1B,UAAU,EAAE,kBAAkB,CAAC,kBAAkB;SAClD,CAAC,CAAC;QACH,MAAM,CAAC,MAAM,CAAC,2BAA2B,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qFAAqF,EAAE,GAAG,EAAE;QAC7F,MAAM,MAAM,GAAG,mCAAmC,CAAC;YACjD,gBAAgB,EAAE,IAAI;YACtB,SAAS,EAAE,CAAC;YACZ,UAAU,EAAE,cAAc;YAC1B,UAAU,EAAE,kBAAkB,CAAC,QAAQ;SACxC,CAAC,CAAC;QACH,MAAM,CAAC,MAAM,CAAC,2BAA2B,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACnD,MAAM,CAAC,MAAM,CAAC,0BAA0B,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yFAAyF,EAAE,GAAG,EAAE;QACjG,MAAM,MAAM,GAAG,mCAAmC,CAAC;YACjD,gBAAgB,EAAE,IAAI;YACtB,SAAS,EAAE,GAAG;YACd,UAAU,EAAE;gBACV,EAAE,SAAS,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,kBAAkB,CAAC,IAAI,EAAE,iBAAiB,EAAE,IAAI,EAAE,iBAAiB,EAAE,IAAI,EAAE;gBACpH,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,UAAU,EAAE,kBAAkB,CAAC,IAAI,EAAE,iBAAiB,EAAE,KAAK,EAAE,iBAAiB,EAAE,IAAI,EAAE;gBACpH,EAAE,SAAS,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,kBAAkB,CAAC,IAAI,EAAE,iBAAiB,EAAE,IAAI,EAAE,iBAAiB,EAAE,IAAI,EAAE;aACpH;YACD,UAAU,EAAE,kBAAkB,CAAC,QAAQ;SACxC,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAC/C,sDAAsD;QACtD,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAC9D,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAC/D,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;IACtE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,iFAAiF;AAEjF,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;IACxC,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC5C,MAAM,CAAC,wBAAwB,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IACnF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,MAAM,CAAC,wBAAwB,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAG,WAAW,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;QAC9E,MAAM,CAAC,wBAAwB,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IAChF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,MAAM,CAAC,wBAAwB,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IACnF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oFAAoF,EAAE,GAAG,EAAE;QAC5F,4BAA4B;QAC5B,uDAAuD;QACvD,MAAM,MAAM,GAAG,wBAAwB,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC,CAAC;QAC5E,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC1B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACtC,mEAAmE;QACnE,MAAM,MAAM,GAAG,wBAAwB,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9E,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC1B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kEAAkE,EAAE,GAAG,EAAE;QAC1E,mGAAmG;QACnG,MAAM,MAAM,GAAG,wBAAwB,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC,CAAC;QAC3E,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC1B,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,iFAAiF;AAEjF,QAAQ,CAAC,4BAA4B,EAAE,GAAG,EAAE;IAC1C,MAAM,IAAI,GAAG;QACX,wBAAwB,EAAE,CAAC;QAC3B,oBAAoB,EAAE,CAAC;QACvB,mBAAmB,EAAE,CAAC;QACtB,oBAAoB,EAAE,CAAC;QACvB,sBAAsB,EAAE,CAAC;KAC1B,CAAC;IAEF,EAAE,CAAC,2EAA2E,EAAE,GAAG,EAAE;QACnF,MAAM,CAAC,0BAA0B,CAAC,EAAE,GAAG,IAAI,EAAE,mBAAmB,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IACrF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oEAAoE,EAAE,GAAG,EAAE;QAC5E,MAAM,CACJ,0BAA0B,CAAC;YACzB,GAAG,IAAI;YACP,mBAAmB,EAAE,CAAC;YACtB,oBAAoB,EAAE,CAAC;SACxB,CAAC,CACH,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;IAC/B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2FAA2F,EAAE,GAAG,EAAE;QACnG,MAAM,CACJ,0BAA0B,CAAC;YACzB,GAAG,IAAI;YACP,mBAAmB,EAAE,CAAC;YACtB,wBAAwB,EAAE,GAAG;SAC9B,CAAC,CACH,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;IAC9B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oGAAoG,EAAE,GAAG,EAAE;QAC5G,MAAM,CACJ,0BAA0B,CAAC;YACzB,GAAG,IAAI;YACP,mBAAmB,EAAE,CAAC;YACtB,oBAAoB,EAAE,CAAC;SACxB,CAAC,CACH,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;IAChC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6FAA6F,EAAE,GAAG,EAAE;QACrG,MAAM,CACJ,0BAA0B,CAAC;YACzB,GAAG,IAAI;YACP,mBAAmB,EAAE,CAAC;SACvB,CAAC,CACH,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;IACjC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mGAAmG,EAAE,GAAG,EAAE;QAC3G,MAAM,CACJ,0BAA0B,CAAC;YACzB,GAAG,IAAI;YACP,mBAAmB,EAAE,CAAC;YACtB,sBAAsB,EAAE,CAAC;SAC1B,CAAC,CACH,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gEAAgE,EAAE,GAAG,EAAE;QACxE,MAAM,CACJ,0BAA0B,CAAC;YACzB,GAAG,IAAI;YACP,mBAAmB,EAAE,CAAC;SACvB,CAAC,CACH,CAAC,QAAQ,EAAE,CAAC;IACf,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qEAAqE,EAAE,GAAG,EAAE;QAC7E,MAAM,CACJ,0BAA0B,CAAC;YACzB,GAAG,IAAI;YACP,mBAAmB,EAAE,CAAC;YACtB,oBAAoB,EAAE,CAAC;YACvB,wBAAwB,EAAE,GAAG;SAC9B,CAAC,CACH,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;IAC/B,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -1,8 +1,23 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Event access screening — shared status values for API + app.
|
|
3
|
-
*/
|
|
4
1
|
export declare const ACCESS_REQUEST_STATUSES: readonly ["None", "Pending", "Approved", "Denied"];
|
|
5
2
|
export type AccessRequestStatus = (typeof ACCESS_REQUEST_STATUSES)[number];
|
|
3
|
+
export type AccessScreeningEventFlags = {
|
|
4
|
+
accessScreeningEnabled?: boolean | null;
|
|
5
|
+
applicationEnabled?: boolean | null;
|
|
6
|
+
entryMode?: string | null;
|
|
7
|
+
ticketTiers?: Array<{
|
|
8
|
+
requiresApplication?: boolean | null;
|
|
9
|
+
}> | null;
|
|
10
|
+
};
|
|
11
|
+
/**
|
|
12
|
+
* Event-wide note-only screening. False when Application is on so guests
|
|
13
|
+
* apply once instead of requesting access and then filling a form.
|
|
14
|
+
*/
|
|
15
|
+
export declare function accessScreeningApplies(event: AccessScreeningEventFlags): boolean;
|
|
16
|
+
/**
|
|
17
|
+
* Host Access requests queue (ticketed). RSVP applications use Pending RSVPs.
|
|
18
|
+
*/
|
|
19
|
+
export declare function eventNeedsAccessRequestQueue(event: AccessScreeningEventFlags): boolean;
|
|
6
20
|
/** True when the viewer must complete access screening before tickets / affirmative RSVP. */
|
|
7
21
|
export declare function accessScreeningBlocksAttendeeActions(enabled: boolean | undefined, status: AccessRequestStatus | null | undefined, hasTicket: boolean): boolean;
|
|
22
|
+
export declare function accessScreeningBlocksAttendeeActionsForEvent(event: AccessScreeningEventFlags, status: AccessRequestStatus | null | undefined, hasTicket: boolean): boolean;
|
|
8
23
|
//# sourceMappingURL=accessScreening.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"accessScreening.d.ts","sourceRoot":"","sources":["../src/accessScreening.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"accessScreening.d.ts","sourceRoot":"","sources":["../src/accessScreening.ts"],"names":[],"mappings":"AAWA,eAAO,MAAM,uBAAuB,oDAK1B,CAAC;AAEX,MAAM,MAAM,mBAAmB,GAC7B,CAAC,OAAO,uBAAuB,CAAC,CAAC,MAAM,CAAC,CAAC;AAE3C,MAAM,MAAM,yBAAyB,GAAG;IACtC,sBAAsB,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IACxC,kBAAkB,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IACpC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,WAAW,CAAC,EAAE,KAAK,CAAC;QAAE,mBAAmB,CAAC,EAAE,OAAO,GAAG,IAAI,CAAA;KAAE,CAAC,GAAG,IAAI,CAAC;CACtE,CAAC;AAEF;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,yBAAyB,GAC/B,OAAO,CAET;AAED;;GAEG;AACH,wBAAgB,4BAA4B,CAC1C,KAAK,EAAE,yBAAyB,GAC/B,OAAO,CAKT;AAED,6FAA6F;AAC7F,wBAAgB,oCAAoC,CAClD,OAAO,EAAE,OAAO,GAAG,SAAS,EAC5B,MAAM,EAAE,mBAAmB,GAAG,IAAI,GAAG,SAAS,EAC9C,SAAS,EAAE,OAAO,GACjB,OAAO,CAIT;AAED,wBAAgB,4CAA4C,CAC1D,KAAK,EAAE,yBAAyB,EAChC,MAAM,EAAE,mBAAmB,GAAG,IAAI,GAAG,SAAS,EAC9C,SAAS,EAAE,OAAO,GACjB,OAAO,CAMT"}
|
package/dist/accessScreening.js
CHANGED
|
@@ -1,12 +1,35 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Event access screening — shared status values for API + app.
|
|
3
|
+
*
|
|
4
|
+
* Simple "Request access" (a note + host approve) is only for events that
|
|
5
|
+
* are not using the Application funnel. Application is the richer gate.
|
|
3
6
|
*/
|
|
7
|
+
import { eventHasApplication, rsvpApplicationEnabled, } from "./applicationFunnel.js";
|
|
4
8
|
export const ACCESS_REQUEST_STATUSES = [
|
|
5
9
|
"None",
|
|
6
10
|
"Pending",
|
|
7
11
|
"Approved",
|
|
8
12
|
"Denied",
|
|
9
13
|
];
|
|
14
|
+
/**
|
|
15
|
+
* Event-wide note-only screening. False when Application is on so guests
|
|
16
|
+
* apply once instead of requesting access and then filling a form.
|
|
17
|
+
*/
|
|
18
|
+
export function accessScreeningApplies(event) {
|
|
19
|
+
return Boolean(event.accessScreeningEnabled) && !eventHasApplication(event);
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Host Access requests queue (ticketed). RSVP applications use Pending RSVPs.
|
|
23
|
+
*/
|
|
24
|
+
export function eventNeedsAccessRequestQueue(event) {
|
|
25
|
+
if (rsvpApplicationEnabled(event))
|
|
26
|
+
return false;
|
|
27
|
+
if (accessScreeningApplies(event))
|
|
28
|
+
return true;
|
|
29
|
+
if (event.entryMode === "Rsvp")
|
|
30
|
+
return false;
|
|
31
|
+
return eventHasApplication(event);
|
|
32
|
+
}
|
|
10
33
|
/** True when the viewer must complete access screening before tickets / affirmative RSVP. */
|
|
11
34
|
export function accessScreeningBlocksAttendeeActions(enabled, status, hasTicket) {
|
|
12
35
|
if (!enabled)
|
|
@@ -15,4 +38,7 @@ export function accessScreeningBlocksAttendeeActions(enabled, status, hasTicket)
|
|
|
15
38
|
return false;
|
|
16
39
|
return status !== "Approved";
|
|
17
40
|
}
|
|
41
|
+
export function accessScreeningBlocksAttendeeActionsForEvent(event, status, hasTicket) {
|
|
42
|
+
return accessScreeningBlocksAttendeeActions(accessScreeningApplies(event), status, hasTicket);
|
|
43
|
+
}
|
|
18
44
|
//# sourceMappingURL=accessScreening.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"accessScreening.js","sourceRoot":"","sources":["../src/accessScreening.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"accessScreening.js","sourceRoot":"","sources":["../src/accessScreening.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EACL,mBAAmB,EACnB,sBAAsB,GACvB,MAAM,wBAAwB,CAAC;AAEhC,MAAM,CAAC,MAAM,uBAAuB,GAAG;IACrC,MAAM;IACN,SAAS;IACT,UAAU;IACV,QAAQ;CACA,CAAC;AAYX;;;GAGG;AACH,MAAM,UAAU,sBAAsB,CACpC,KAAgC;IAEhC,OAAO,OAAO,CAAC,KAAK,CAAC,sBAAsB,CAAC,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,4BAA4B,CAC1C,KAAgC;IAEhC,IAAI,sBAAsB,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAChD,IAAI,sBAAsB,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAC/C,IAAI,KAAK,CAAC,SAAS,KAAK,MAAM;QAAE,OAAO,KAAK,CAAC;IAC7C,OAAO,mBAAmB,CAAC,KAAK,CAAC,CAAC;AACpC,CAAC;AAED,6FAA6F;AAC7F,MAAM,UAAU,oCAAoC,CAClD,OAA4B,EAC5B,MAA8C,EAC9C,SAAkB;IAElB,IAAI,CAAC,OAAO;QAAE,OAAO,KAAK,CAAC;IAC3B,IAAI,SAAS;QAAE,OAAO,KAAK,CAAC;IAC5B,OAAO,MAAM,KAAK,UAAU,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,4CAA4C,CAC1D,KAAgC,EAChC,MAA8C,EAC9C,SAAkB;IAElB,OAAO,oCAAoC,CACzC,sBAAsB,CAAC,KAAK,CAAC,EAC7B,MAAM,EACN,SAAS,CACV,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Host application funnel — shared evaluation for API + app.
|
|
3
|
+
* Choice questions can auto-deny or flag a mismatch; free text is review-only.
|
|
4
|
+
*
|
|
5
|
+
* Later Posh gaps (tracked, not in this module): bash-page screened badge /
|
|
6
|
+
* cover aesthetics, stronger host identity on Meet the host, who’s-going
|
|
7
|
+
* mutuals before apply, application analytics, AI screening assist (never
|
|
8
|
+
* auto-deny on LLM alone), waitlist → next approved applicant.
|
|
9
|
+
*/
|
|
10
|
+
export declare const QUESTION_MISMATCH_ACTIONS: readonly ["None", "FlagForReview", "AutoDeny"];
|
|
11
|
+
export type QuestionMismatchAction = (typeof QUESTION_MISMATCH_ACTIONS)[number];
|
|
12
|
+
export declare const APPLICATION_QUESTION_TYPES: readonly ["ShortText", "LongText", "SingleChoice", "MultiChoice", "YesNo"];
|
|
13
|
+
export type ApplicationQuestionType = (typeof APPLICATION_QUESTION_TYPES)[number];
|
|
14
|
+
export type ApplicationFunnelQuestion = {
|
|
15
|
+
id: string;
|
|
16
|
+
type: ApplicationQuestionType;
|
|
17
|
+
required?: boolean;
|
|
18
|
+
ticketTierId?: string | null;
|
|
19
|
+
mismatchAction?: QuestionMismatchAction | null;
|
|
20
|
+
acceptableOptions?: string[] | null;
|
|
21
|
+
parentQuestionId?: string | null;
|
|
22
|
+
showWhenAnswer?: string | null;
|
|
23
|
+
};
|
|
24
|
+
export type ApplicationFunnelAnswer = {
|
|
25
|
+
questionId: string;
|
|
26
|
+
answer: string;
|
|
27
|
+
};
|
|
28
|
+
export type ApplicationFunnelEvaluation = {
|
|
29
|
+
outcome: "pass" | "flag" | "auto_deny";
|
|
30
|
+
flaggedQuestionIds: string[];
|
|
31
|
+
autoDenyQuestionIds: string[];
|
|
32
|
+
};
|
|
33
|
+
export declare function isChoiceQuestionType(type: ApplicationQuestionType | string): boolean;
|
|
34
|
+
export declare function questionsForApplicationSurface<T extends {
|
|
35
|
+
ticketTierId?: string | null;
|
|
36
|
+
}>(questions: T[], ticketTierId: string | null): T[];
|
|
37
|
+
export declare function applicationsAreClosed(closesAt: Date | string | null | undefined, now?: Date): boolean;
|
|
38
|
+
export declare function isApplicationQuestionVisible(question: ApplicationFunnelQuestion, answers: ApplicationFunnelAnswer[], allQuestions: ApplicationFunnelQuestion[], seen?: Set<string>): boolean;
|
|
39
|
+
export declare function visibleApplicationQuestions<T extends ApplicationFunnelQuestion>(questions: T[], answers: ApplicationFunnelAnswer[]): T[];
|
|
40
|
+
export declare function missingRequiredQuestionIds(questions: ApplicationFunnelQuestion[], answers: ApplicationFunnelAnswer[]): string[];
|
|
41
|
+
export declare function evaluateApplicationFunnel(questions: ApplicationFunnelQuestion[], answers: ApplicationFunnelAnswer[]): ApplicationFunnelEvaluation;
|
|
42
|
+
export declare function eventHasApplication(event: {
|
|
43
|
+
applicationEnabled?: boolean | null;
|
|
44
|
+
ticketTiers?: Array<{
|
|
45
|
+
requiresApplication?: boolean | null;
|
|
46
|
+
}> | null;
|
|
47
|
+
}): boolean;
|
|
48
|
+
export declare function rsvpApplicationEnabled(event: {
|
|
49
|
+
applicationEnabled?: boolean | null;
|
|
50
|
+
entryMode?: string | null;
|
|
51
|
+
}): boolean;
|
|
52
|
+
export declare function applicationBlocksTierPurchase(tier: {
|
|
53
|
+
requiresApplication?: boolean | null;
|
|
54
|
+
} | null | undefined, status: string | null | undefined, hasTicket: boolean): boolean;
|
|
55
|
+
export declare function selectedTiersRequireApplication(tiers: Array<{
|
|
56
|
+
requiresApplication?: boolean | null;
|
|
57
|
+
}> | null | undefined): boolean;
|
|
58
|
+
//# sourceMappingURL=applicationFunnel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"applicationFunnel.d.ts","sourceRoot":"","sources":["../src/applicationFunnel.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Host application funnel — shared evaluation for API + app.
|
|
3
|
+
* Choice questions can auto-deny or flag a mismatch; free text is review-only.
|
|
4
|
+
*
|
|
5
|
+
* Later Posh gaps (tracked, not in this module): bash-page screened badge /
|
|
6
|
+
* cover aesthetics, stronger host identity on Meet the host, who’s-going
|
|
7
|
+
* mutuals before apply, application analytics, AI screening assist (never
|
|
8
|
+
* auto-deny on LLM alone), waitlist → next approved applicant.
|
|
9
|
+
*/
|
|
10
|
+
export const QUESTION_MISMATCH_ACTIONS = [
|
|
11
|
+
"None",
|
|
12
|
+
"FlagForReview",
|
|
13
|
+
"AutoDeny",
|
|
14
|
+
];
|
|
15
|
+
export const APPLICATION_QUESTION_TYPES = [
|
|
16
|
+
"ShortText",
|
|
17
|
+
"LongText",
|
|
18
|
+
"SingleChoice",
|
|
19
|
+
"MultiChoice",
|
|
20
|
+
"YesNo",
|
|
21
|
+
];
|
|
22
|
+
export function isChoiceQuestionType(type) {
|
|
23
|
+
return (type === "SingleChoice" || type === "MultiChoice" || type === "YesNo");
|
|
24
|
+
}
|
|
25
|
+
export function questionsForApplicationSurface(questions, ticketTierId) {
|
|
26
|
+
return questions.filter((question) => question.ticketTierId == null || question.ticketTierId === ticketTierId);
|
|
27
|
+
}
|
|
28
|
+
export function applicationsAreClosed(closesAt, now = new Date()) {
|
|
29
|
+
if (!closesAt)
|
|
30
|
+
return false;
|
|
31
|
+
const at = closesAt instanceof Date ? closesAt : new Date(closesAt);
|
|
32
|
+
if (Number.isNaN(at.getTime()))
|
|
33
|
+
return false;
|
|
34
|
+
return now.getTime() > at.getTime();
|
|
35
|
+
}
|
|
36
|
+
export function isApplicationQuestionVisible(question, answers, allQuestions, seen = new Set()) {
|
|
37
|
+
const parentId = question.parentQuestionId?.trim();
|
|
38
|
+
const when = question.showWhenAnswer?.trim();
|
|
39
|
+
if (!parentId || !when)
|
|
40
|
+
return true;
|
|
41
|
+
if (seen.has(question.id))
|
|
42
|
+
return false;
|
|
43
|
+
seen.add(question.id);
|
|
44
|
+
const parent = allQuestions.find((row) => row.id === parentId);
|
|
45
|
+
if (parent && !isApplicationQuestionVisible(parent, answers, allQuestions, seen)) {
|
|
46
|
+
return false;
|
|
47
|
+
}
|
|
48
|
+
const raw = answers.find((row) => row.questionId === parentId)?.answer ?? "";
|
|
49
|
+
const parentType = parent?.type ?? "ShortText";
|
|
50
|
+
return answerValues(raw, parentType).some((value) => normalizeOption(value) === normalizeOption(when));
|
|
51
|
+
}
|
|
52
|
+
export function visibleApplicationQuestions(questions, answers) {
|
|
53
|
+
return questions.filter((question) => isApplicationQuestionVisible(question, answers, questions));
|
|
54
|
+
}
|
|
55
|
+
function normalizeOption(value) {
|
|
56
|
+
return value.trim().toLowerCase();
|
|
57
|
+
}
|
|
58
|
+
function answerValues(answer, type) {
|
|
59
|
+
if (type === "MultiChoice") {
|
|
60
|
+
return answer
|
|
61
|
+
.split(",")
|
|
62
|
+
.map((part) => part.trim())
|
|
63
|
+
.filter(Boolean);
|
|
64
|
+
}
|
|
65
|
+
const trimmed = answer.trim();
|
|
66
|
+
return trimmed ? [trimmed] : [];
|
|
67
|
+
}
|
|
68
|
+
export function missingRequiredQuestionIds(questions, answers) {
|
|
69
|
+
const visible = visibleApplicationQuestions(questions, answers);
|
|
70
|
+
const byId = new Map(answers.map((row) => [row.questionId, row.answer]));
|
|
71
|
+
return visible
|
|
72
|
+
.filter((question) => question.required)
|
|
73
|
+
.filter((question) => {
|
|
74
|
+
const raw = byId.get(question.id) ?? "";
|
|
75
|
+
return answerValues(raw, question.type).length === 0;
|
|
76
|
+
})
|
|
77
|
+
.map((question) => question.id);
|
|
78
|
+
}
|
|
79
|
+
export function evaluateApplicationFunnel(questions, answers) {
|
|
80
|
+
const byId = new Map(answers.map((row) => [row.questionId, row.answer]));
|
|
81
|
+
const flaggedQuestionIds = [];
|
|
82
|
+
const autoDenyQuestionIds = [];
|
|
83
|
+
const visible = visibleApplicationQuestions(questions, answers);
|
|
84
|
+
for (const question of visible) {
|
|
85
|
+
const action = question.mismatchAction ?? "None";
|
|
86
|
+
if (action === "None")
|
|
87
|
+
continue;
|
|
88
|
+
if (!isChoiceQuestionType(question.type))
|
|
89
|
+
continue;
|
|
90
|
+
const acceptable = (question.acceptableOptions ?? [])
|
|
91
|
+
.map(normalizeOption)
|
|
92
|
+
.filter(Boolean);
|
|
93
|
+
if (acceptable.length === 0)
|
|
94
|
+
continue;
|
|
95
|
+
const values = answerValues(byId.get(question.id) ?? "", question.type);
|
|
96
|
+
if (values.length === 0)
|
|
97
|
+
continue;
|
|
98
|
+
const acceptableSet = new Set(acceptable);
|
|
99
|
+
const mismatch = values.some((value) => !acceptableSet.has(normalizeOption(value)));
|
|
100
|
+
if (!mismatch)
|
|
101
|
+
continue;
|
|
102
|
+
if (action === "AutoDeny") {
|
|
103
|
+
autoDenyQuestionIds.push(question.id);
|
|
104
|
+
}
|
|
105
|
+
else if (action === "FlagForReview") {
|
|
106
|
+
flaggedQuestionIds.push(question.id);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
if (autoDenyQuestionIds.length > 0) {
|
|
110
|
+
return {
|
|
111
|
+
outcome: "auto_deny",
|
|
112
|
+
flaggedQuestionIds,
|
|
113
|
+
autoDenyQuestionIds,
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
if (flaggedQuestionIds.length > 0) {
|
|
117
|
+
return {
|
|
118
|
+
outcome: "flag",
|
|
119
|
+
flaggedQuestionIds,
|
|
120
|
+
autoDenyQuestionIds,
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
return {
|
|
124
|
+
outcome: "pass",
|
|
125
|
+
flaggedQuestionIds: [],
|
|
126
|
+
autoDenyQuestionIds: [],
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
export function eventHasApplication(event) {
|
|
130
|
+
if (event.applicationEnabled)
|
|
131
|
+
return true;
|
|
132
|
+
return Boolean(event.ticketTiers?.some((tier) => tier.requiresApplication));
|
|
133
|
+
}
|
|
134
|
+
export function rsvpApplicationEnabled(event) {
|
|
135
|
+
return event.entryMode === "Rsvp" && Boolean(event.applicationEnabled);
|
|
136
|
+
}
|
|
137
|
+
export function applicationBlocksTierPurchase(tier, status, hasTicket) {
|
|
138
|
+
if (hasTicket)
|
|
139
|
+
return false;
|
|
140
|
+
if (!tier?.requiresApplication)
|
|
141
|
+
return false;
|
|
142
|
+
return status !== "Approved";
|
|
143
|
+
}
|
|
144
|
+
export function selectedTiersRequireApplication(tiers) {
|
|
145
|
+
return Boolean(tiers?.some((tier) => tier.requiresApplication));
|
|
146
|
+
}
|
|
147
|
+
//# sourceMappingURL=applicationFunnel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"applicationFunnel.js","sourceRoot":"","sources":["../src/applicationFunnel.ts"],"names":[],"mappings":"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"}
|