@bash-app/bash-common 30.360.0 → 30.362.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.
@@ -1,4 +1,4 @@
1
- import { applyBashEventLocationRedaction, computeLocationPublicRevealDueAt, defaultLocationRevealAudience, geocodeQueryTextForPublicBashMap, isLocationGloballyPublic, redactBashEventLocation, shouldAutoRevealLocationToPublicNow, viewerCanSeeFullBashLocation, viewerOwnsValidTicketForBash, } from "../locationVisibility.js";
1
+ import { applyBashEventLocationRedaction, computeLocationPublicRevealDueAt, defaultLocationRevealAudience, defaultLocationRevealMode, geocodeQueryTextForPublicBashMap, isLocationGloballyPublic, redactBashEventLocation, shouldAutoRevealLocationToPublicNow, viewerCanSeeFullBashLocation, viewerOwnsValidTicketForBash, } from "../locationVisibility.js";
2
2
  const baseBash = {
3
3
  creatorId: "host-1",
4
4
  hideLocation: true,
@@ -140,6 +140,39 @@ describe("computeLocationPublicRevealDueAt / shouldAutoRevealLocationToPublicNow
140
140
  locationRevealMode: "ManualOnly",
141
141
  })).toBeNull();
142
142
  });
143
+ it("CustomDateTime returns the scheduled timestamp regardless of start time", () => {
144
+ const scheduled = new Date("2026-01-05T15:00:00.000Z");
145
+ expect(computeLocationPublicRevealDueAt({
146
+ ...baseBash,
147
+ locationRevealMode: "CustomDateTime",
148
+ locationRevealScheduledAt: scheduled,
149
+ startDateTime: null,
150
+ })).toEqual(scheduled);
151
+ });
152
+ it("CustomDateTime returns null when no scheduled timestamp is set", () => {
153
+ expect(computeLocationPublicRevealDueAt({
154
+ ...baseBash,
155
+ locationRevealMode: "CustomDateTime",
156
+ locationRevealScheduledAt: null,
157
+ })).toBeNull();
158
+ });
159
+ it("CustomDateTime returns null for an invalid scheduled timestamp", () => {
160
+ expect(computeLocationPublicRevealDueAt({
161
+ ...baseBash,
162
+ locationRevealMode: "CustomDateTime",
163
+ locationRevealScheduledAt: "not-a-date",
164
+ })).toBeNull();
165
+ });
166
+ it("shouldAutoRevealLocationToPublicNow fires at the scheduled CustomDateTime", () => {
167
+ const bash = {
168
+ ...baseBash,
169
+ locationRevealMode: "CustomDateTime",
170
+ locationRevealScheduledAt: new Date("2026-02-01T12:00:00.000Z"),
171
+ startDateTime: new Date("2026-03-01T20:00:00.000Z"),
172
+ };
173
+ expect(shouldAutoRevealLocationToPublicNow(bash, new Date("2026-02-01T11:59:00.000Z"))).toBe(false);
174
+ expect(shouldAutoRevealLocationToPublicNow(bash, new Date("2026-02-01T12:00:00.000Z"))).toBe(true);
175
+ });
143
176
  it("shouldAutoRevealLocationToPublicNow respects time", () => {
144
177
  const bash = {
145
178
  ...baseBash,
@@ -159,6 +192,11 @@ describe("defaultLocationRevealAudience", () => {
159
192
  expect(defaultLocationRevealAudience(false)).toBe("TicketHoldersAndRsvps");
160
193
  });
161
194
  });
195
+ describe("defaultLocationRevealMode", () => {
196
+ it("defaults to manual reveal so the pin stays gated", () => {
197
+ expect(defaultLocationRevealMode()).toBe("ManualOnly");
198
+ });
199
+ });
162
200
  describe("geocodeQueryTextForPublicBashMap", () => {
163
201
  it("uses city when location redacted", () => {
164
202
  expect(geocodeQueryTextForPublicBashMap({
@@ -1 +1 @@
1
- {"version":3,"file":"locationVisibility.test.js","sourceRoot":"","sources":["../../../src/utils/__tests__/locationVisibility.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"locationVisibility.test.js","sourceRoot":"","sources":["../../../src/utils/__tests__/locationVisibility.test.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { describe, expect, test } from "@jest/globals";
2
- import { organizationHasVanitySubdomain } from "../organizationEntitlements.js";
2
+ import { organizationHasApiAccess, organizationHasAuditLogAccess, organizationHasComplianceAccess, organizationHasEnterprisePlatformAccess, organizationHasProcurementAccess, organizationHasSsoAccess, organizationHasVanitySubdomain, } from "../organizationEntitlements.js";
3
3
  describe("organizationHasVanitySubdomain", () => {
4
4
  test("null / undefined return false", () => {
5
5
  expect(organizationHasVanitySubdomain(null)).toBe(false);
@@ -39,4 +39,37 @@ describe("organizationHasVanitySubdomain", () => {
39
39
  }
40
40
  });
41
41
  });
42
+ describe("enterprise platform gates (audit logs, SSO, procurement, API access)", () => {
43
+ const enterpriseActive = {
44
+ subscriptionTier: "Enterprise",
45
+ subscriptionStatus: "Active",
46
+ };
47
+ const growthActive = { subscriptionTier: "Growth", subscriptionStatus: "Active" };
48
+ test("organizationHasEnterprisePlatformAccess mirrors organizationHasVanitySubdomain", () => {
49
+ expect(organizationHasEnterprisePlatformAccess(enterpriseActive)).toBe(true);
50
+ expect(organizationHasEnterprisePlatformAccess(growthActive)).toBe(false);
51
+ expect(organizationHasEnterprisePlatformAccess(null)).toBe(false);
52
+ expect(organizationHasEnterprisePlatformAccess(undefined)).toBe(false);
53
+ });
54
+ test("organizationHasAuditLogAccess follows the shared enterprise gate", () => {
55
+ expect(organizationHasAuditLogAccess(enterpriseActive)).toBe(true);
56
+ expect(organizationHasAuditLogAccess(growthActive)).toBe(false);
57
+ });
58
+ test("organizationHasSsoAccess follows the shared enterprise gate", () => {
59
+ expect(organizationHasSsoAccess(enterpriseActive)).toBe(true);
60
+ expect(organizationHasSsoAccess(growthActive)).toBe(false);
61
+ });
62
+ test("organizationHasProcurementAccess follows the shared enterprise gate", () => {
63
+ expect(organizationHasProcurementAccess(enterpriseActive)).toBe(true);
64
+ expect(organizationHasProcurementAccess(growthActive)).toBe(false);
65
+ });
66
+ test("organizationHasApiAccess follows the shared enterprise gate", () => {
67
+ expect(organizationHasApiAccess(enterpriseActive)).toBe(true);
68
+ expect(organizationHasApiAccess(growthActive)).toBe(false);
69
+ });
70
+ test("organizationHasComplianceAccess follows the shared enterprise gate", () => {
71
+ expect(organizationHasComplianceAccess(enterpriseActive)).toBe(true);
72
+ expect(organizationHasComplianceAccess(growthActive)).toBe(false);
73
+ });
74
+ });
42
75
  //# sourceMappingURL=organizationEntitlements.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"organizationEntitlements.test.js","sourceRoot":"","sources":["../../../src/utils/__tests__/organizationEntitlements.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAEvD,OAAO,EAAE,8BAA8B,EAAE,MAAM,gCAAgC,CAAC;AAEhF,QAAQ,CAAC,gCAAgC,EAAE,GAAG,EAAE;IAC9C,IAAI,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACzC,MAAM,CAAC,8BAA8B,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACzD,MAAM,CAAC,8BAA8B,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACnD,KAAK,MAAM,IAAI,IAAI,CAAC,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,CAAC,EAAE,CAAC;YACnE,MAAM,CACJ,8BAA8B,CAAC;gBAC7B,gBAAgB,EAAE,IAAI;gBACtB,kBAAkB,EAAE,QAAQ;aAC7B,CAAC,CACH,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAChB,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,uDAAuD,EAAE,GAAG,EAAE;QACjE,MAAM,CACJ,8BAA8B,CAAC;YAC7B,gBAAgB,EAAE,YAAY;YAC9B,kBAAkB,EAAE,QAAQ;SAC7B,CAAC,CACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACb,MAAM,CACJ,8BAA8B,CAAC;YAC7B,gBAAgB,EAAE,YAAY;YAC9B,kBAAkB,EAAE,UAAU;SAC/B,CAAC,CACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACf,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,yEAAyE,EAAE,GAAG,EAAE;QACnF,MAAM,CACJ,8BAA8B,CAAC,EAAE,gBAAgB,EAAE,YAAY,EAAE,CAAC,CACnE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACb,MAAM,CACJ,8BAA8B,CAAC;YAC7B,gBAAgB,EAAE,YAAY;YAC9B,kBAAkB,EAAE,IAAI;SACzB,CAAC,CACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACf,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,iDAAiD,EAAE,GAAG,EAAE;QAC3D,KAAK,MAAM,MAAM,IAAI,CAAC,UAAU,EAAE,SAAS,EAAE,WAAW,CAAC,EAAE,CAAC;YAC1D,MAAM,CACJ,8BAA8B,CAAC;gBAC7B,gBAAgB,EAAE,YAAY;gBAC9B,kBAAkB,EAAE,MAAM;aAC3B,CAAC,CACH,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAChB,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"organizationEntitlements.test.js","sourceRoot":"","sources":["../../../src/utils/__tests__/organizationEntitlements.test.ts"],"names":[],"mappings":"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"}
@@ -7,6 +7,8 @@ export type BashLocationVisibilityEvent = {
7
7
  locationRevealAudience?: LocationRevealAudience | null;
8
8
  locationRevealMode?: LocationRevealMode | null;
9
9
  locationRevealOffsetMins?: number | null;
10
+ /** Absolute reveal timestamp; used when locationRevealMode = CustomDateTime. */
11
+ locationRevealScheduledAt?: Date | string | null;
10
12
  startDateTime?: Date | string | null;
11
13
  };
12
14
  export type ViewerLocationContext = {
@@ -59,6 +61,8 @@ export declare function computeLocationPublicRevealDueAt(bash: BashLocationVisib
59
61
  export declare function shouldAutoRevealLocationToPublicNow(bash: BashLocationVisibilityEvent, now: Date): boolean;
60
62
  /** Default audience for the Where step: paid tiers → ticket holders only; else RSVPs+invited path default. */
61
63
  export declare function defaultLocationRevealAudience(hasPaidTicketTiers: boolean): LocationRevealAudience;
64
+ /** Default reveal timing when the host turns on hide-location: stay gated until they choose otherwise. */
65
+ export declare function defaultLocationRevealMode(): LocationRevealMode;
62
66
  /** Address string for Google geocoding on public maps when full `location` is redacted. */
63
67
  export declare function geocodeQueryTextForPublicBashMap(event: {
64
68
  location?: string | null;
@@ -1 +1 @@
1
- {"version":3,"file":"locationVisibility.d.ts","sourceRoot":"","sources":["../../src/utils/locationVisibility.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"locationVisibility.d.ts","sourceRoot":"","sources":["../../src/utils/locationVisibility.ts"],"names":[],"mappings":"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"}
@@ -70,12 +70,18 @@ export function applyBashEventLocationRedaction(event, canSeeFull) {
70
70
  export function computeLocationPublicRevealDueAt(bash) {
71
71
  if (!bash.hideLocation || bash.locationRevealedAt)
72
72
  return null;
73
- const start = bash.startDateTime ? new Date(bash.startDateTime) : null;
74
- if (!start || Number.isNaN(start.getTime()))
75
- return null;
76
73
  const mode = bash.locationRevealMode ?? "AtStartTime";
77
74
  if (mode === "ManualOnly")
78
75
  return null;
76
+ if (mode === "CustomDateTime") {
77
+ const scheduled = bash.locationRevealScheduledAt
78
+ ? new Date(bash.locationRevealScheduledAt)
79
+ : null;
80
+ return scheduled && !Number.isNaN(scheduled.getTime()) ? scheduled : null;
81
+ }
82
+ const start = bash.startDateTime ? new Date(bash.startDateTime) : null;
83
+ if (!start || Number.isNaN(start.getTime()))
84
+ return null;
79
85
  if (mode === "AtStartTime")
80
86
  return start;
81
87
  if (mode === "CustomOffset") {
@@ -102,6 +108,10 @@ export function shouldAutoRevealLocationToPublicNow(bash, now) {
102
108
  export function defaultLocationRevealAudience(hasPaidTicketTiers) {
103
109
  return hasPaidTicketTiers ? "TicketHolders" : "TicketHoldersAndRsvps";
104
110
  }
111
+ /** Default reveal timing when the host turns on hide-location: stay gated until they choose otherwise. */
112
+ export function defaultLocationRevealMode() {
113
+ return "ManualOnly";
114
+ }
105
115
  /** Address string for Google geocoding on public maps when full `location` is redacted. */
106
116
  export function geocodeQueryTextForPublicBashMap(event) {
107
117
  const loc = event.location?.trim();
@@ -113,3 +123,4 @@ export function geocodeQueryTextForPublicBashMap(event) {
113
123
  }
114
124
  return null;
115
125
  }
126
+ //# sourceMappingURL=locationVisibility.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"locationVisibility.js","sourceRoot":"","sources":["../../src/utils/locationVisibility.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"locationVisibility.js","sourceRoot":"","sources":["../../src/utils/locationVisibility.ts"],"names":[],"mappings":"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"}
@@ -17,4 +17,23 @@ export interface OrganizationEntitlementInput {
17
17
  * (or trialing) subscription so a lapsed Enterprise org falls back to the path.
18
18
  */
19
19
  export declare function organizationHasVanitySubdomain(org: OrganizationEntitlementInput | null | undefined): boolean;
20
+ /**
21
+ * Shared gate for the enterprise platform surface: org-scoped audit logs,
22
+ * SSO/identity setup, procurement approval policy, API keys, webhooks, and
23
+ * third-party integrations (Mailchimp/Salesforce). All are Enterprise-tier
24
+ * perks today — same predicate as {@link organizationHasVanitySubdomain}, kept
25
+ * as a distinct name so the two can diverge later (e.g. Growth gets audit
26
+ * logs before SSO) without touching every call site.
27
+ */
28
+ export declare function organizationHasEnterprisePlatformAccess(org: OrganizationEntitlementInput | null | undefined): boolean;
29
+ /** Org-admin audit log viewer + CSV export. */
30
+ export declare function organizationHasAuditLogAccess(org: OrganizationEntitlementInput | null | undefined): boolean;
31
+ /** SSO/identity setup. */
32
+ export declare function organizationHasSsoAccess(org: OrganizationEntitlementInput | null | undefined): boolean;
33
+ /** Procurement approval workflows (PO-gated billing/spend). */
34
+ export declare function organizationHasProcurementAccess(org: OrganizationEntitlementInput | null | undefined): boolean;
35
+ /** API keys, outbound webhooks, and third-party integrations. */
36
+ export declare function organizationHasApiAccess(org: OrganizationEntitlementInput | null | undefined): boolean;
37
+ /** Compliance docs (W-9 tax collection, certificate-of-insurance tracking). */
38
+ export declare function organizationHasComplianceAccess(org: OrganizationEntitlementInput | null | undefined): boolean;
20
39
  //# sourceMappingURL=organizationEntitlements.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"organizationEntitlements.d.ts","sourceRoot":"","sources":["../../src/utils/organizationEntitlements.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,2EAA2E;AAC3E,eAAO,MAAM,gCAAgC,iCAGnC,CAAC;AAEX,MAAM,WAAW,4BAA4B;IAC3C,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,kBAAkB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACpC;AAED;;;;GAIG;AACH,wBAAgB,8BAA8B,CAC5C,GAAG,EAAE,4BAA4B,GAAG,IAAI,GAAG,SAAS,GACnD,OAAO,CAUT"}
1
+ {"version":3,"file":"organizationEntitlements.d.ts","sourceRoot":"","sources":["../../src/utils/organizationEntitlements.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,2EAA2E;AAC3E,eAAO,MAAM,gCAAgC,iCAGnC,CAAC;AAEX,MAAM,WAAW,4BAA4B;IAC3C,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,kBAAkB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACpC;AAED;;;;GAIG;AACH,wBAAgB,8BAA8B,CAC5C,GAAG,EAAE,4BAA4B,GAAG,IAAI,GAAG,SAAS,GACnD,OAAO,CAUT;AAED;;;;;;;GAOG;AACH,wBAAgB,uCAAuC,CACrD,GAAG,EAAE,4BAA4B,GAAG,IAAI,GAAG,SAAS,GACnD,OAAO,CAET;AAED,+CAA+C;AAC/C,wBAAgB,6BAA6B,CAC3C,GAAG,EAAE,4BAA4B,GAAG,IAAI,GAAG,SAAS,GACnD,OAAO,CAET;AAED,0BAA0B;AAC1B,wBAAgB,wBAAwB,CACtC,GAAG,EAAE,4BAA4B,GAAG,IAAI,GAAG,SAAS,GACnD,OAAO,CAET;AAED,+DAA+D;AAC/D,wBAAgB,gCAAgC,CAC9C,GAAG,EAAE,4BAA4B,GAAG,IAAI,GAAG,SAAS,GACnD,OAAO,CAET;AAED,iEAAiE;AACjE,wBAAgB,wBAAwB,CACtC,GAAG,EAAE,4BAA4B,GAAG,IAAI,GAAG,SAAS,GACnD,OAAO,CAET;AAED,+EAA+E;AAC/E,wBAAgB,+BAA+B,CAC7C,GAAG,EAAE,4BAA4B,GAAG,IAAI,GAAG,SAAS,GACnD,OAAO,CAET"}
@@ -27,3 +27,35 @@ export function organizationHasVanitySubdomain(org) {
27
27
  return true;
28
28
  return ACTIVE_ORG_SUBSCRIPTION_STATUSES.includes(org.subscriptionStatus);
29
29
  }
30
+ /**
31
+ * Shared gate for the enterprise platform surface: org-scoped audit logs,
32
+ * SSO/identity setup, procurement approval policy, API keys, webhooks, and
33
+ * third-party integrations (Mailchimp/Salesforce). All are Enterprise-tier
34
+ * perks today — same predicate as {@link organizationHasVanitySubdomain}, kept
35
+ * as a distinct name so the two can diverge later (e.g. Growth gets audit
36
+ * logs before SSO) without touching every call site.
37
+ */
38
+ export function organizationHasEnterprisePlatformAccess(org) {
39
+ return organizationHasVanitySubdomain(org);
40
+ }
41
+ /** Org-admin audit log viewer + CSV export. */
42
+ export function organizationHasAuditLogAccess(org) {
43
+ return organizationHasEnterprisePlatformAccess(org);
44
+ }
45
+ /** SSO/identity setup. */
46
+ export function organizationHasSsoAccess(org) {
47
+ return organizationHasEnterprisePlatformAccess(org);
48
+ }
49
+ /** Procurement approval workflows (PO-gated billing/spend). */
50
+ export function organizationHasProcurementAccess(org) {
51
+ return organizationHasEnterprisePlatformAccess(org);
52
+ }
53
+ /** API keys, outbound webhooks, and third-party integrations. */
54
+ export function organizationHasApiAccess(org) {
55
+ return organizationHasEnterprisePlatformAccess(org);
56
+ }
57
+ /** Compliance docs (W-9 tax collection, certificate-of-insurance tracking). */
58
+ export function organizationHasComplianceAccess(org) {
59
+ return organizationHasEnterprisePlatformAccess(org);
60
+ }
61
+ //# sourceMappingURL=organizationEntitlements.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"organizationEntitlements.js","sourceRoot":"","sources":["../../src/utils/organizationEntitlements.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,2EAA2E;AAC3E,MAAM,CAAC,MAAM,gCAAgC,GAAG;IAC9C,QAAQ;IACR,UAAU;CACF,CAAC;AAOX;;;;GAIG;AACH,MAAM,UAAU,8BAA8B,CAC5C,GAAoD;IAEpD,IAAI,CAAC,GAAG;QAAE,OAAO,KAAK,CAAC;IACvB,IAAI,GAAG,CAAC,gBAAgB,KAAK,YAAY;QAAE,OAAO,KAAK,CAAC;IACxD,+EAA+E;IAC/E,4EAA4E;IAC5E,4BAA4B;IAC5B,IAAI,GAAG,CAAC,kBAAkB,IAAI,IAAI;QAAE,OAAO,IAAI,CAAC;IAChD,OAAQ,gCAAsD,CAAC,QAAQ,CACrE,GAAG,CAAC,kBAAkB,CACvB,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"organizationEntitlements.js","sourceRoot":"","sources":["../../src/utils/organizationEntitlements.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,2EAA2E;AAC3E,MAAM,CAAC,MAAM,gCAAgC,GAAG;IAC9C,QAAQ;IACR,UAAU;CACF,CAAC;AAOX;;;;GAIG;AACH,MAAM,UAAU,8BAA8B,CAC5C,GAAoD;IAEpD,IAAI,CAAC,GAAG;QAAE,OAAO,KAAK,CAAC;IACvB,IAAI,GAAG,CAAC,gBAAgB,KAAK,YAAY;QAAE,OAAO,KAAK,CAAC;IACxD,+EAA+E;IAC/E,4EAA4E;IAC5E,4BAA4B;IAC5B,IAAI,GAAG,CAAC,kBAAkB,IAAI,IAAI;QAAE,OAAO,IAAI,CAAC;IAChD,OAAQ,gCAAsD,CAAC,QAAQ,CACrE,GAAG,CAAC,kBAAkB,CACvB,CAAC;AACJ,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,uCAAuC,CACrD,GAAoD;IAEpD,OAAO,8BAA8B,CAAC,GAAG,CAAC,CAAC;AAC7C,CAAC;AAED,+CAA+C;AAC/C,MAAM,UAAU,6BAA6B,CAC3C,GAAoD;IAEpD,OAAO,uCAAuC,CAAC,GAAG,CAAC,CAAC;AACtD,CAAC;AAED,0BAA0B;AAC1B,MAAM,UAAU,wBAAwB,CACtC,GAAoD;IAEpD,OAAO,uCAAuC,CAAC,GAAG,CAAC,CAAC;AACtD,CAAC;AAED,+DAA+D;AAC/D,MAAM,UAAU,gCAAgC,CAC9C,GAAoD;IAEpD,OAAO,uCAAuC,CAAC,GAAG,CAAC,CAAC;AACtD,CAAC;AAED,iEAAiE;AACjE,MAAM,UAAU,wBAAwB,CACtC,GAAoD;IAEpD,OAAO,uCAAuC,CAAC,GAAG,CAAC,CAAC;AACtD,CAAC;AAED,+EAA+E;AAC/E,MAAM,UAAU,+BAA+B,CAC7C,GAAoD;IAEpD,OAAO,uCAAuC,CAAC,GAAG,CAAC,CAAC;AACtD,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"slugUtils.d.ts","sourceRoot":"","sources":["../../src/utils/slugUtils.ts"],"names":[],"mappings":"AAQA,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAMlD;AAED,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,MAAM,EACb,eAAe,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,EACvE,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,MAAM,CAAC,CAajB;AAED,wBAAgB,qBAAqB,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAE/E;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAC9B,MAAM,CAMR;AAED;;;;GAIG;AACH,wBAAgB,yBAAyB,CACvC,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAC9B,MAAM,CAER;AAED,yFAAyF;AACzF,wBAAgB,0BAA0B,CACxC,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,GACd,MAAM,CAER;AAED,+EAA+E;AAC/E,wBAAgB,gCAAgC,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAM5E;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GAAG,IAAI,CAqB5F;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAGlD"}
1
+ {"version":3,"file":"slugUtils.d.ts","sourceRoot":"","sources":["../../src/utils/slugUtils.ts"],"names":[],"mappings":"AAsCA,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAMlD;AAED,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,MAAM,EACb,eAAe,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,EACvE,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,MAAM,CAAC,CAajB;AAED,wBAAgB,qBAAqB,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAE/E;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAC9B,MAAM,CAMR;AAED;;;;GAIG;AACH,wBAAgB,yBAAyB,CACvC,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAC9B,MAAM,CAER;AAED,yFAAyF;AACzF,wBAAgB,0BAA0B,CACxC,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,GACd,MAAM,CAER;AAED,+EAA+E;AAC/E,wBAAgB,gCAAgC,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAM5E;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GAAG,IAAI,CAqB5F;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAGlD"}
@@ -1,5 +1,22 @@
1
- import slugify from 'slugify';
1
+ import * as slugifyImport from "slugify";
2
2
  import { BASH_DETAIL_URL, BASH_EVENT_WIZARD_HOW_MAJOR_STEP, BASH_EVENT_WIZARD_HOW_SUBSTEP_PAYOUT, BASH_EVENT_WIZARD_PATH_PREFIX, } from '../definitions.js';
3
+ function isSlugifyFn(value) {
4
+ return typeof value === "function";
5
+ }
6
+ /** CJS `slugify` under Vite exposes `default` on the namespace, not a default import. */
7
+ function resolveSlugify() {
8
+ if (isSlugifyFn(slugifyImport)) {
9
+ return slugifyImport;
10
+ }
11
+ if (typeof slugifyImport === "object" &&
12
+ slugifyImport !== null &&
13
+ "default" in slugifyImport &&
14
+ isSlugifyFn(slugifyImport.default)) {
15
+ return slugifyImport.default;
16
+ }
17
+ throw new Error("slugify package did not export a callable function");
18
+ }
19
+ const slugify = resolveSlugify();
3
20
  export function generateSlug(title) {
4
21
  return slugify(title, {
5
22
  lower: true,
@@ -1 +1 @@
1
- {"version":3,"file":"slugUtils.js","sourceRoot":"","sources":["../../src/utils/slugUtils.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"slugUtils.js","sourceRoot":"","sources":["../../src/utils/slugUtils.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bash-app/bash-common",
3
- "version": "30.360.0",
3
+ "version": "30.362.0",
4
4
  "description": "Common data and scripts to use on the frontend and backend",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -780,6 +780,8 @@ model BashEvent {
780
780
  locationRevealMode LocationRevealMode @default(AtStartTime)
781
781
  /// Minutes before startDateTime to auto-reveal; used when locationRevealMode = CustomOffset.
782
782
  locationRevealOffsetMins Int?
783
+ /// Absolute reveal timestamp; used when locationRevealMode = CustomDateTime.
784
+ locationRevealScheduledAt DateTime?
783
785
  /// When set, exact address is public to everyone (cron, manual reveal, or start-time rule).
784
786
  locationRevealedAt DateTime?
785
787
  status BashStatus @default(Draft)
@@ -4457,6 +4459,20 @@ model User {
4457
4459
  submittedBudgets Budget[] @relation("BudgetSubmitter")
4458
4460
  ownedBudgets Budget[] @relation("UserBudgets")
4459
4461
  departmentsHeaded Department[] @relation("DepartmentHead")
4462
+ /// Enterprise platform (Phase 0-4): internal team members assigned as a named
4463
+ /// account manager, and org members who submit/approve procurement requests
4464
+ /// or create API keys.
4465
+ accountManagerForOrganizations Organization[] @relation("OrganizationAccountManager")
4466
+ procurementRequestsSubmitted ProcurementRequest[] @relation("ProcurementRequestSubmitter")
4467
+ procurementRequestsApproved ProcurementRequest[] @relation("ProcurementRequestApprover")
4468
+ organizationApiKeysCreated OrganizationApiKey[] @relation("OrganizationApiKeyCreator")
4469
+ /// SSO (Phase 2) + compliance (Phase 5): who configured a connection, and
4470
+ /// who submitted/reviewed a W-9 or certificate of insurance.
4471
+ organizationSsoConnectionsConfigured OrganizationSsoConnection[] @relation("OrganizationSsoConfiguredBy")
4472
+ organizationTaxDocumentsSubmitted OrganizationTaxDocument[] @relation("OrgTaxDocumentSubmittedBy")
4473
+ organizationTaxDocumentsReviewed OrganizationTaxDocument[] @relation("OrgTaxDocumentReviewedBy")
4474
+ organizationInsuranceCertsSubmitted OrganizationInsuranceCertificate[] @relation("OrgInsuranceCertSubmittedBy")
4475
+ organizationInsuranceCertsReviewed OrganizationInsuranceCertificate[] @relation("OrgInsuranceCertReviewedBy")
4460
4476
  favoriteOrganizations Organization[] @relation("FavoriteOrganizations")
4461
4477
  organizationEmailSubscriptions OrganizationSubscriber[]
4462
4478
  eventSeriesCreated EventSeries[] @relation("EventSeriesCreator")
@@ -5909,10 +5925,55 @@ model Organization {
5909
5925
  agencyBookingSettlements AgencyBookingSettlement[]
5910
5926
  representedBookings ServiceBooking[]
5911
5927
 
5928
+ /// Enterprise billing + support (ops-provisioned after a signed pilot/annual
5929
+ /// deal — not self-serve). See docs/ENTERPRISE-B2B-SALES-PLAYBOOK.md.
5930
+ billingPoNumber String? // Purchase order number for invoiced billing
5931
+ billingContactEmail String? // AP / finance contact, distinct from pocEmail
5932
+ invoiceNetDays Int? // e.g. 30 for Net 30 terms; null = card/Stripe billing only
5933
+ enterpriseContractStartAt DateTime?
5934
+ enterpriseContractEndAt DateTime?
5935
+ accountManagerUserId String?
5936
+ accountManager User? @relation("OrganizationAccountManager", fields: [accountManagerUserId], references: [id], onDelete: SetNull)
5937
+ /// "Standard" | "Priority" | "Dedicated" — drives named-AM banner + support routing copy.
5938
+ supportTier String @default("Standard")
5939
+
5940
+ /// SSO / identity (Organization Enterprise only). `ssoEnforced` blocks password
5941
+ /// login for members whose email matches `ssoDomain` once `ssoConnection.status`
5942
+ /// is Active. Denormalized here (rather than requiring a join) so the
5943
+ /// pre-login domain check on every sign-in attempt stays a single indexed
5944
+ /// lookup; `ssoConnection` holds the protocol-specific IdP configuration.
5945
+ ssoProvider String? // "saml" | "oidc" — mirrors ssoConnection.protocol; drives login routing
5946
+ ssoDomain String? // Verified email domain that triggers SSO redirect
5947
+ ssoEnforced Boolean @default(false)
5948
+ ssoConfiguredAt DateTime?
5949
+ ssoConnection OrganizationSsoConnection?
5950
+
5951
+ /// Procurement approval policy (nullable JSON). Null = no gate, billing/spend
5952
+ /// proceeds without a PO. Shape when set:
5953
+ /// { requirePoForSubscription: boolean, approverUserIds: string[], minAmountCentsForApproval: number }
5954
+ procurementApprovalPolicy Json?
5955
+ procurementRequests ProcurementRequest[]
5956
+
5957
+ /// Enterprise integrations + developer platform (API keys, outbound webhooks,
5958
+ /// third-party connectors like Mailchimp/Salesforce).
5959
+ integrations OrganizationIntegration[]
5960
+ apiKeys OrganizationApiKey[]
5961
+ webhooks OrganizationWebhook[]
5962
+
5963
+ /// Compliance (deal-driven, Phase 5): W-9 collection for institutional
5964
+ /// finance + certificate-of-insurance tracking. Ops reviews both manually.
5965
+ taxDocuments OrganizationTaxDocument[]
5966
+ insuranceCertificates OrganizationInsuranceCertificate[]
5967
+
5968
+ /// Org-scoped slice of the platform audit trail (member approvals, budget
5969
+ /// approvals, settings changes, SSO logins, API key/webhook/integration events).
5970
+ auditLogs AuditLog[] @relation("OrganizationAuditLogs")
5971
+
5912
5972
  @@index([ownerId])
5913
5973
  @@index([slug])
5914
5974
  @@index([parentOrganizationId])
5915
5975
  @@index([nonprofitVerifiedAt])
5976
+ @@index([accountManagerUserId])
5916
5977
  }
5917
5978
 
5918
5979
  /// Email-first followers of a public organizer (org landing). Authenticated users who
@@ -7877,6 +7938,7 @@ enum Privacy {
7877
7938
  enum LocationRevealMode {
7878
7939
  AtStartTime
7879
7940
  CustomOffset
7941
+ CustomDateTime
7880
7942
  ManualOnly
7881
7943
  }
7882
7944
 
@@ -10840,6 +10902,12 @@ model AuditLog {
10840
10902
  userId String?
10841
10903
  user User? @relation("UserAuditLogs", fields: [userId], references: [id], onDelete: SetNull)
10842
10904
 
10905
+ /// Set when the action happened in the context of an Organization (member
10906
+ /// approvals, budget approvals, settings changes, SSO logins, API keys,
10907
+ /// webhooks, integrations, procurement). Null for platform-wide/user actions.
10908
+ organizationId String?
10909
+ organization Organization? @relation("OrganizationAuditLogs", fields: [organizationId], references: [id], onDelete: SetNull)
10910
+
10843
10911
  // Action details
10844
10912
  action AuditAction // LOGIN_SUCCESS, LOGIN_FAILED, PAYMENT_PROCESSED, etc.
10845
10913
  category AuditCategory // Authentication, Payment, Admin, DataAccess, etc.
@@ -10864,6 +10932,7 @@ model AuditLog {
10864
10932
  @@index([category, severity, createdAt])
10865
10933
  @@index([resourceType, resourceId])
10866
10934
  @@index([ipAddress])
10935
+ @@index([organizationId, createdAt])
10867
10936
  }
10868
10937
 
10869
10938
  /// Token Revocation System
@@ -10959,6 +11028,30 @@ enum AuditAction {
10959
11028
  RATE_LIMIT_EXCEEDED
10960
11029
  IP_BLOCKED
10961
11030
  TOKEN_REVOKED
11031
+
11032
+ // Organization (enterprise platform — member/budget approvals, settings,
11033
+ // SSO, procurement, API keys, webhooks, integrations)
11034
+ ORG_MEMBER_APPROVED
11035
+ ORG_MEMBER_REJECTED
11036
+ ORG_BUDGET_APPROVED
11037
+ ORG_SETTINGS_CHANGED
11038
+ ORG_BILLING_UPDATED
11039
+ ORG_SSO_CONFIGURED
11040
+ ORG_SSO_LOGIN
11041
+ ORG_PROCUREMENT_SUBMITTED
11042
+ ORG_PROCUREMENT_APPROVED
11043
+ ORG_PROCUREMENT_REJECTED
11044
+ ORG_API_KEY_CREATED
11045
+ ORG_API_KEY_REVOKED
11046
+ ORG_WEBHOOK_CREATED
11047
+ ORG_WEBHOOK_DELETED
11048
+ ORG_INTEGRATION_CONNECTED
11049
+ ORG_INTEGRATION_DISCONNECTED
11050
+ ORG_AUDIT_LOG_EXPORTED
11051
+ ORG_TAX_DOCUMENT_SUBMITTED
11052
+ ORG_TAX_DOCUMENT_REVIEWED
11053
+ ORG_INSURANCE_CERTIFICATE_SUBMITTED
11054
+ ORG_INSURANCE_CERTIFICATE_REVIEWED
10962
11055
  }
10963
11056
 
10964
11057
  enum AuditCategory {
@@ -10973,6 +11066,7 @@ enum AuditCategory {
10973
11066
  DataAccess
10974
11067
  Compliance
10975
11068
  Security
11069
+ Organization
10976
11070
  }
10977
11071
 
10978
11072
  enum AuditSeverity {
@@ -10981,6 +11075,260 @@ enum AuditSeverity {
10981
11075
  Critical // Security incidents
10982
11076
  }
10983
11077
 
11078
+ /// ─── Enterprise platform: procurement, API keys, webhooks, integrations ────
11079
+ /// Shared by universities/nonprofits/venues/brands buying Organization
11080
+ /// Enterprise. See docs/ENTERPRISE-B2B-SALES-PLAYBOOK.md for sales framing.
11081
+
11082
+ model ProcurementRequest {
11083
+ id String @id @default(cuid())
11084
+ organizationId String
11085
+
11086
+ /// "OrgSubscription" | "EventSpend" | "VendorContract" | "Other"
11087
+ type String
11088
+
11089
+ amountCents Int
11090
+ poNumber String?
11091
+ description String?
11092
+
11093
+ /// "Draft" | "Submitted" | "Approved" | "Rejected" | "Cancelled"
11094
+ status String @default("Draft")
11095
+
11096
+ submittedById String?
11097
+ /// Snapshot of who is entitled to approve at submit time (org's
11098
+ /// `procurementApprovalPolicy.approverUserIds`, or Owner/Admin if unset).
11099
+ approverIds String[] @default([])
11100
+ approvedById String?
11101
+ approvedAt DateTime?
11102
+ rejectedById String?
11103
+ rejectedAt DateTime?
11104
+ rejectionReason String?
11105
+
11106
+ /// Free-form context: linked subscription tier, budget id, vendor name, etc.
11107
+ metadata Json?
11108
+
11109
+ createdAt DateTime @default(now())
11110
+ updatedAt DateTime @updatedAt
11111
+
11112
+ organization Organization @relation(fields: [organizationId], references: [id], onDelete: Cascade)
11113
+ submittedBy User? @relation("ProcurementRequestSubmitter", fields: [submittedById], references: [id], onDelete: SetNull)
11114
+ approvedBy User? @relation("ProcurementRequestApprover", fields: [approvedById], references: [id], onDelete: SetNull)
11115
+
11116
+ @@index([organizationId, status])
11117
+ @@index([submittedById])
11118
+ }
11119
+
11120
+ model OrganizationApiKey {
11121
+ id String @id @default(cuid())
11122
+ organizationId String
11123
+ name String // Host-chosen label, e.g. "Zapier sync"
11124
+
11125
+ /// SHA-256 hash of the secret; the plaintext key is shown once at creation
11126
+ /// and never persisted. Prefix is safe to display for identification.
11127
+ keyHash String @unique
11128
+ keyPrefix String // e.g. "bsh_live_ab12" — shown in the UI list
11129
+
11130
+ scopes String[] @default([]) // e.g. ["read:members", "read:events"]
11131
+ createdById String?
11132
+ lastUsedAt DateTime?
11133
+ revokedAt DateTime?
11134
+ expiresAt DateTime?
11135
+
11136
+ createdAt DateTime @default(now())
11137
+
11138
+ organization Organization @relation(fields: [organizationId], references: [id], onDelete: Cascade)
11139
+ createdBy User? @relation("OrganizationApiKeyCreator", fields: [createdById], references: [id], onDelete: SetNull)
11140
+
11141
+ @@index([organizationId])
11142
+ }
11143
+
11144
+ model OrganizationWebhook {
11145
+ id String @id @default(cuid())
11146
+ organizationId String
11147
+
11148
+ url String
11149
+ /// Event types this subscription receives, e.g. "ticket.checked_in",
11150
+ /// "member.approved", "procurement.approved".
11151
+ eventTypes String[] @default([])
11152
+ /// HMAC-SHA256 signing secret (shown once at creation) — verify the
11153
+ /// `X-Bash-Signature` header before trusting the payload.
11154
+ signingSecret String
11155
+
11156
+ isActive Boolean @default(true)
11157
+ lastDeliveryAt DateTime?
11158
+ lastDeliveryStatus String? // "success" | "failed"
11159
+ failureCount Int @default(0)
11160
+
11161
+ createdAt DateTime @default(now())
11162
+ updatedAt DateTime @updatedAt
11163
+
11164
+ organization Organization @relation(fields: [organizationId], references: [id], onDelete: Cascade)
11165
+
11166
+ @@index([organizationId])
11167
+ }
11168
+
11169
+ model OrganizationIntegration {
11170
+ id String @id @default(cuid())
11171
+ organizationId String
11172
+
11173
+ /// "Mailchimp" | "Salesforce" — extend as connectors ship.
11174
+ provider String
11175
+
11176
+ /// "Connected" | "Error" | "Disconnected"
11177
+ status String @default("Connected")
11178
+
11179
+ /// Provider credentials, AES-256-CBC encrypted at rest (see
11180
+ /// api/src/utils/organization/organizationIntegrationCrypto.ts). Never
11181
+ /// return this field to the client.
11182
+ encryptedCredentials String?
11183
+
11184
+ /// Non-secret provider config, e.g. { audienceId: "abc123" } for Mailchimp.
11185
+ settings Json?
11186
+
11187
+ lastSyncAt DateTime?
11188
+ lastSyncStatus String? // "success" | "failed"
11189
+ lastSyncError String?
11190
+ connectedById String?
11191
+
11192
+ createdAt DateTime @default(now())
11193
+ updatedAt DateTime @updatedAt
11194
+
11195
+ organization Organization @relation(fields: [organizationId], references: [id], onDelete: Cascade)
11196
+
11197
+ @@unique([organizationId, provider])
11198
+ @@index([organizationId])
11199
+ }
11200
+
11201
+ enum SsoProtocol {
11202
+ Saml
11203
+ Oidc
11204
+ }
11205
+
11206
+ enum SsoConnectionStatus {
11207
+ Draft // Admin has started filling in IdP details; not yet validated.
11208
+ Testing // "Test connection" is in flight or failed; ssoEnforced cannot be true.
11209
+ Active // Test succeeded; org can enforce SSO for its verified domain.
11210
+ Disabled // Was Active; admin turned it off without deleting the config.
11211
+ }
11212
+
11213
+ /// Generic SAML 2.0 (as Service Provider) or OIDC (as Relying Party) connection
11214
+ /// for one Organization. No third-party IdP broker (e.g. WorkOS) — Bash acts as
11215
+ /// its own SP/RP against whatever IdP the customer supplies (Okta, Entra ID,
11216
+ /// Google Workspace, generic OIDC). One connection per org for v1.
11217
+ model OrganizationSsoConnection {
11218
+ id String @id @default(cuid())
11219
+ organizationId String @unique
11220
+ protocol SsoProtocol
11221
+ status SsoConnectionStatus @default(Draft)
11222
+
11223
+ /// SAML 2.0 — values copied from the customer's IdP app configuration.
11224
+ samlIdpEntityId String?
11225
+ samlIdpSsoUrl String? // IdP's Single Sign-On (AuthnRequest destination) URL
11226
+ samlIdpCertificate String? // IdP's public signing cert (PEM), used to verify the SAMLResponse signature
11227
+
11228
+ /// OIDC — values copied from the customer's IdP app configuration. The
11229
+ /// authorization/token/jwks endpoints are filled in by discovery against
11230
+ /// `oidcIssuer` when the connection is tested, not entered by the admin.
11231
+ oidcIssuer String?
11232
+ oidcClientId String?
11233
+ /// AES-256-CBC encrypted (see organizationIntegrationCrypto.ts). Never
11234
+ /// returned to the client.
11235
+ oidcClientSecretEncrypted String?
11236
+ oidcAuthorizationEndpoint String?
11237
+ oidcTokenEndpoint String?
11238
+ oidcJwksUri String?
11239
+
11240
+ lastTestedAt DateTime?
11241
+ lastTestStatus String? // "Success" | "Failed"
11242
+ lastTestError String?
11243
+
11244
+ configuredByUserId String?
11245
+ configuredBy User? @relation("OrganizationSsoConfiguredBy", fields: [configuredByUserId], references: [id], onDelete: SetNull)
11246
+
11247
+ createdAt DateTime @default(now())
11248
+ updatedAt DateTime @updatedAt
11249
+
11250
+ organization Organization @relation(fields: [organizationId], references: [id], onDelete: Cascade)
11251
+
11252
+ @@index([organizationId])
11253
+ }
11254
+
11255
+ enum OrgComplianceDocStatus {
11256
+ Pending
11257
+ Approved
11258
+ Rejected
11259
+ }
11260
+
11261
+ enum OrgTaxDocumentType {
11262
+ W9
11263
+ W8BEN
11264
+ }
11265
+
11266
+ /// Institutional tax documentation (deal-driven, Phase 5). Ops reviews the
11267
+ /// uploaded PDF manually — same "admin approves after out-of-band review"
11268
+ /// shape as nonprofit verification, just with a real self-serve upload
11269
+ /// (presigned S3, see AwsS3Utils.createUrlFromAssetKey) instead of an
11270
+ /// ops-entered doc id.
11271
+ model OrganizationTaxDocument {
11272
+ id String @id @default(cuid())
11273
+ organizationId String
11274
+ type OrgTaxDocumentType @default(W9)
11275
+
11276
+ legalBusinessName String
11277
+ taxClassification String? // e.g. "C Corporation", "LLC", "Nonprofit" — free text, mirrors the W-9 form
11278
+ taxIdLast4 String? // Last 4 of EIN/SSN only; never store the full TIN
11279
+ docUrl String // Uploaded W-9 PDF
11280
+
11281
+ status OrgComplianceDocStatus @default(Pending)
11282
+ rejectionReason String?
11283
+
11284
+ submittedByUserId String?
11285
+ reviewedByUserId String?
11286
+ reviewedAt DateTime?
11287
+
11288
+ createdAt DateTime @default(now())
11289
+ updatedAt DateTime @updatedAt
11290
+
11291
+ organization Organization @relation(fields: [organizationId], references: [id], onDelete: Cascade)
11292
+ submittedBy User? @relation("OrgTaxDocumentSubmittedBy", fields: [submittedByUserId], references: [id], onDelete: SetNull)
11293
+ reviewedBy User? @relation("OrgTaxDocumentReviewedBy", fields: [reviewedByUserId], references: [id], onDelete: SetNull)
11294
+
11295
+ @@index([organizationId])
11296
+ @@index([status])
11297
+ }
11298
+
11299
+ /// Certificate of insurance tracking at the Organization level (deal-driven,
11300
+ /// Phase 5) — e.g. a university requiring proof of general liability coverage
11301
+ /// before an annual agreement. Distinct from the per-`Vendor` insurance flags
11302
+ /// on `VendorInsurance`, which cover marketplace vendors, not the org itself.
11303
+ model OrganizationInsuranceCertificate {
11304
+ id String @id @default(cuid())
11305
+ organizationId String
11306
+
11307
+ insurerName String
11308
+ policyNumber String?
11309
+ coverageAmountCents Int?
11310
+ docUrl String // Uploaded certificate-of-insurance PDF
11311
+ expiresAt DateTime
11312
+
11313
+ status OrgComplianceDocStatus @default(Pending)
11314
+ rejectionReason String?
11315
+
11316
+ submittedByUserId String?
11317
+ reviewedByUserId String?
11318
+ reviewedAt DateTime?
11319
+
11320
+ createdAt DateTime @default(now())
11321
+ updatedAt DateTime @updatedAt
11322
+
11323
+ organization Organization @relation(fields: [organizationId], references: [id], onDelete: Cascade)
11324
+ submittedBy User? @relation("OrgInsuranceCertSubmittedBy", fields: [submittedByUserId], references: [id], onDelete: SetNull)
11325
+ reviewedBy User? @relation("OrgInsuranceCertReviewedBy", fields: [reviewedByUserId], references: [id], onDelete: SetNull)
11326
+
11327
+ @@index([organizationId])
11328
+ @@index([status])
11329
+ @@index([expiresAt])
11330
+ }
11331
+
10984
11332
  // Service Analytics Tracking
10985
11333
  model ServiceAnalytics {
10986
11334
  id String @id @default(cuid())
@@ -2,6 +2,7 @@ import {
2
2
  applyBashEventLocationRedaction,
3
3
  computeLocationPublicRevealDueAt,
4
4
  defaultLocationRevealAudience,
5
+ defaultLocationRevealMode,
5
6
  geocodeQueryTextForPublicBashMap,
6
7
  isLocationGloballyPublic,
7
8
  redactBashEventLocation,
@@ -207,6 +208,49 @@ describe("computeLocationPublicRevealDueAt / shouldAutoRevealLocationToPublicNow
207
208
  ).toBeNull();
208
209
  });
209
210
 
211
+ it("CustomDateTime returns the scheduled timestamp regardless of start time", () => {
212
+ const scheduled = new Date("2026-01-05T15:00:00.000Z");
213
+ expect(
214
+ computeLocationPublicRevealDueAt({
215
+ ...baseBash,
216
+ locationRevealMode: "CustomDateTime",
217
+ locationRevealScheduledAt: scheduled,
218
+ startDateTime: null,
219
+ })
220
+ ).toEqual(scheduled);
221
+ });
222
+
223
+ it("CustomDateTime returns null when no scheduled timestamp is set", () => {
224
+ expect(
225
+ computeLocationPublicRevealDueAt({
226
+ ...baseBash,
227
+ locationRevealMode: "CustomDateTime",
228
+ locationRevealScheduledAt: null,
229
+ })
230
+ ).toBeNull();
231
+ });
232
+
233
+ it("CustomDateTime returns null for an invalid scheduled timestamp", () => {
234
+ expect(
235
+ computeLocationPublicRevealDueAt({
236
+ ...baseBash,
237
+ locationRevealMode: "CustomDateTime",
238
+ locationRevealScheduledAt: "not-a-date",
239
+ })
240
+ ).toBeNull();
241
+ });
242
+
243
+ it("shouldAutoRevealLocationToPublicNow fires at the scheduled CustomDateTime", () => {
244
+ const bash = {
245
+ ...baseBash,
246
+ locationRevealMode: "CustomDateTime" as const,
247
+ locationRevealScheduledAt: new Date("2026-02-01T12:00:00.000Z"),
248
+ startDateTime: new Date("2026-03-01T20:00:00.000Z"),
249
+ };
250
+ expect(shouldAutoRevealLocationToPublicNow(bash, new Date("2026-02-01T11:59:00.000Z"))).toBe(false);
251
+ expect(shouldAutoRevealLocationToPublicNow(bash, new Date("2026-02-01T12:00:00.000Z"))).toBe(true);
252
+ });
253
+
210
254
  it("shouldAutoRevealLocationToPublicNow respects time", () => {
211
255
  const bash = {
212
256
  ...baseBash,
@@ -234,6 +278,12 @@ describe("defaultLocationRevealAudience", () => {
234
278
  });
235
279
  });
236
280
 
281
+ describe("defaultLocationRevealMode", () => {
282
+ it("defaults to manual reveal so the pin stays gated", () => {
283
+ expect(defaultLocationRevealMode()).toBe("ManualOnly");
284
+ });
285
+ });
286
+
237
287
  describe("geocodeQueryTextForPublicBashMap", () => {
238
288
  it("uses city when location redacted", () => {
239
289
  expect(
@@ -1,6 +1,14 @@
1
1
  import { describe, expect, test } from "@jest/globals";
2
2
 
3
- import { organizationHasVanitySubdomain } from "../organizationEntitlements.js";
3
+ import {
4
+ organizationHasApiAccess,
5
+ organizationHasAuditLogAccess,
6
+ organizationHasComplianceAccess,
7
+ organizationHasEnterprisePlatformAccess,
8
+ organizationHasProcurementAccess,
9
+ organizationHasSsoAccess,
10
+ organizationHasVanitySubdomain,
11
+ } from "../organizationEntitlements.js";
4
12
 
5
13
  describe("organizationHasVanitySubdomain", () => {
6
14
  test("null / undefined return false", () => {
@@ -57,3 +65,43 @@ describe("organizationHasVanitySubdomain", () => {
57
65
  }
58
66
  });
59
67
  });
68
+
69
+ describe("enterprise platform gates (audit logs, SSO, procurement, API access)", () => {
70
+ const enterpriseActive = {
71
+ subscriptionTier: "Enterprise",
72
+ subscriptionStatus: "Active",
73
+ };
74
+ const growthActive = { subscriptionTier: "Growth", subscriptionStatus: "Active" };
75
+
76
+ test("organizationHasEnterprisePlatformAccess mirrors organizationHasVanitySubdomain", () => {
77
+ expect(organizationHasEnterprisePlatformAccess(enterpriseActive)).toBe(true);
78
+ expect(organizationHasEnterprisePlatformAccess(growthActive)).toBe(false);
79
+ expect(organizationHasEnterprisePlatformAccess(null)).toBe(false);
80
+ expect(organizationHasEnterprisePlatformAccess(undefined)).toBe(false);
81
+ });
82
+
83
+ test("organizationHasAuditLogAccess follows the shared enterprise gate", () => {
84
+ expect(organizationHasAuditLogAccess(enterpriseActive)).toBe(true);
85
+ expect(organizationHasAuditLogAccess(growthActive)).toBe(false);
86
+ });
87
+
88
+ test("organizationHasSsoAccess follows the shared enterprise gate", () => {
89
+ expect(organizationHasSsoAccess(enterpriseActive)).toBe(true);
90
+ expect(organizationHasSsoAccess(growthActive)).toBe(false);
91
+ });
92
+
93
+ test("organizationHasProcurementAccess follows the shared enterprise gate", () => {
94
+ expect(organizationHasProcurementAccess(enterpriseActive)).toBe(true);
95
+ expect(organizationHasProcurementAccess(growthActive)).toBe(false);
96
+ });
97
+
98
+ test("organizationHasApiAccess follows the shared enterprise gate", () => {
99
+ expect(organizationHasApiAccess(enterpriseActive)).toBe(true);
100
+ expect(organizationHasApiAccess(growthActive)).toBe(false);
101
+ });
102
+
103
+ test("organizationHasComplianceAccess follows the shared enterprise gate", () => {
104
+ expect(organizationHasComplianceAccess(enterpriseActive)).toBe(true);
105
+ expect(organizationHasComplianceAccess(growthActive)).toBe(false);
106
+ });
107
+ });
@@ -8,6 +8,8 @@ export type BashLocationVisibilityEvent = {
8
8
  locationRevealAudience?: LocationRevealAudience | null;
9
9
  locationRevealMode?: LocationRevealMode | null;
10
10
  locationRevealOffsetMins?: number | null;
11
+ /** Absolute reveal timestamp; used when locationRevealMode = CustomDateTime. */
12
+ locationRevealScheduledAt?: Date | string | null;
11
13
  startDateTime?: Date | string | null;
12
14
  };
13
15
 
@@ -122,10 +124,18 @@ export function applyBashEventLocationRedaction<T extends BashEventLocationRedac
122
124
  /** When the address becomes public to everyone (null = manual-only or unknown). */
123
125
  export function computeLocationPublicRevealDueAt(bash: BashLocationVisibilityEvent): Date | null {
124
126
  if (!bash.hideLocation || bash.locationRevealedAt) return null;
125
- const start = bash.startDateTime ? new Date(bash.startDateTime) : null;
126
- if (!start || Number.isNaN(start.getTime())) return null;
127
127
  const mode = bash.locationRevealMode ?? "AtStartTime";
128
128
  if (mode === "ManualOnly") return null;
129
+
130
+ if (mode === "CustomDateTime") {
131
+ const scheduled = bash.locationRevealScheduledAt
132
+ ? new Date(bash.locationRevealScheduledAt)
133
+ : null;
134
+ return scheduled && !Number.isNaN(scheduled.getTime()) ? scheduled : null;
135
+ }
136
+
137
+ const start = bash.startDateTime ? new Date(bash.startDateTime) : null;
138
+ if (!start || Number.isNaN(start.getTime())) return null;
129
139
  if (mode === "AtStartTime") return start;
130
140
  if (mode === "CustomOffset") {
131
141
  const mins = bash.locationRevealOffsetMins;
@@ -153,6 +163,11 @@ export function defaultLocationRevealAudience(hasPaidTicketTiers: boolean): Loca
153
163
  return hasPaidTicketTiers ? "TicketHolders" : "TicketHoldersAndRsvps";
154
164
  }
155
165
 
166
+ /** Default reveal timing when the host turns on hide-location: stay gated until they choose otherwise. */
167
+ export function defaultLocationRevealMode(): LocationRevealMode {
168
+ return "ManualOnly";
169
+ }
170
+
156
171
  /** Address string for Google geocoding on public maps when full `location` is redacted. */
157
172
  export function geocodeQueryTextForPublicBashMap(event: {
158
173
  location?: string | null;
@@ -35,3 +35,52 @@ export function organizationHasVanitySubdomain(
35
35
  org.subscriptionStatus
36
36
  );
37
37
  }
38
+
39
+ /**
40
+ * Shared gate for the enterprise platform surface: org-scoped audit logs,
41
+ * SSO/identity setup, procurement approval policy, API keys, webhooks, and
42
+ * third-party integrations (Mailchimp/Salesforce). All are Enterprise-tier
43
+ * perks today — same predicate as {@link organizationHasVanitySubdomain}, kept
44
+ * as a distinct name so the two can diverge later (e.g. Growth gets audit
45
+ * logs before SSO) without touching every call site.
46
+ */
47
+ export function organizationHasEnterprisePlatformAccess(
48
+ org: OrganizationEntitlementInput | null | undefined
49
+ ): boolean {
50
+ return organizationHasVanitySubdomain(org);
51
+ }
52
+
53
+ /** Org-admin audit log viewer + CSV export. */
54
+ export function organizationHasAuditLogAccess(
55
+ org: OrganizationEntitlementInput | null | undefined
56
+ ): boolean {
57
+ return organizationHasEnterprisePlatformAccess(org);
58
+ }
59
+
60
+ /** SSO/identity setup. */
61
+ export function organizationHasSsoAccess(
62
+ org: OrganizationEntitlementInput | null | undefined
63
+ ): boolean {
64
+ return organizationHasEnterprisePlatformAccess(org);
65
+ }
66
+
67
+ /** Procurement approval workflows (PO-gated billing/spend). */
68
+ export function organizationHasProcurementAccess(
69
+ org: OrganizationEntitlementInput | null | undefined
70
+ ): boolean {
71
+ return organizationHasEnterprisePlatformAccess(org);
72
+ }
73
+
74
+ /** API keys, outbound webhooks, and third-party integrations. */
75
+ export function organizationHasApiAccess(
76
+ org: OrganizationEntitlementInput | null | undefined
77
+ ): boolean {
78
+ return organizationHasEnterprisePlatformAccess(org);
79
+ }
80
+
81
+ /** Compliance docs (W-9 tax collection, certificate-of-insurance tracking). */
82
+ export function organizationHasComplianceAccess(
83
+ org: OrganizationEntitlementInput | null | undefined
84
+ ): boolean {
85
+ return organizationHasEnterprisePlatformAccess(org);
86
+ }
@@ -1,4 +1,4 @@
1
- import slugify from 'slugify';
1
+ import * as slugifyImport from "slugify";
2
2
  import {
3
3
  BASH_DETAIL_URL,
4
4
  BASH_EVENT_WIZARD_HOW_MAJOR_STEP,
@@ -6,6 +6,36 @@ import {
6
6
  BASH_EVENT_WIZARD_PATH_PREFIX,
7
7
  } from '../definitions.js';
8
8
 
9
+ type SlugifyOptions = {
10
+ lower?: boolean;
11
+ strict?: boolean;
12
+ remove?: RegExp;
13
+ };
14
+
15
+ type SlugifyFn = (input: string, options?: SlugifyOptions) => string;
16
+
17
+ function isSlugifyFn(value: unknown): value is SlugifyFn {
18
+ return typeof value === "function";
19
+ }
20
+
21
+ /** CJS `slugify` under Vite exposes `default` on the namespace, not a default import. */
22
+ function resolveSlugify(): SlugifyFn {
23
+ if (isSlugifyFn(slugifyImport)) {
24
+ return slugifyImport;
25
+ }
26
+ if (
27
+ typeof slugifyImport === "object" &&
28
+ slugifyImport !== null &&
29
+ "default" in slugifyImport &&
30
+ isSlugifyFn(slugifyImport.default)
31
+ ) {
32
+ return slugifyImport.default;
33
+ }
34
+ throw new Error("slugify package did not export a callable function");
35
+ }
36
+
37
+ const slugify = resolveSlugify();
38
+
9
39
  export function generateSlug(title: string): string {
10
40
  return slugify(title, {
11
41
  lower: true,