@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.
- package/dist/utils/__tests__/locationVisibility.test.js +39 -1
- package/dist/utils/__tests__/locationVisibility.test.js.map +1 -1
- package/dist/utils/__tests__/organizationEntitlements.test.js +34 -1
- package/dist/utils/__tests__/organizationEntitlements.test.js.map +1 -1
- package/dist/utils/locationVisibility.d.ts +4 -0
- package/dist/utils/locationVisibility.d.ts.map +1 -1
- package/dist/utils/locationVisibility.js +14 -3
- package/dist/utils/locationVisibility.js.map +1 -1
- package/dist/utils/organizationEntitlements.d.ts +19 -0
- package/dist/utils/organizationEntitlements.d.ts.map +1 -1
- package/dist/utils/organizationEntitlements.js +32 -0
- package/dist/utils/organizationEntitlements.js.map +1 -1
- package/dist/utils/slugUtils.d.ts.map +1 -1
- package/dist/utils/slugUtils.js +18 -1
- package/dist/utils/slugUtils.js.map +1 -1
- package/package.json +1 -1
- package/prisma/schema.prisma +348 -0
- package/src/utils/__tests__/locationVisibility.test.ts +50 -0
- package/src/utils/__tests__/organizationEntitlements.test.ts +49 -1
- package/src/utils/locationVisibility.ts +17 -2
- package/src/utils/organizationEntitlements.ts +49 -0
- package/src/utils/slugUtils.ts +31 -1
|
@@ -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,
|
|
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":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAEjF,oEAAoE;AACpE,MAAM,MAAM,2BAA2B,GAAG;IACxC,YAAY,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IAC9B,kBAAkB,CAAC,EAAE,IAAI,GAAG,MAAM,GAAG,IAAI,CAAC;IAC1C,SAAS,EAAE,MAAM,CAAC;IAClB,sBAAsB,CAAC,EAAE,sBAAsB,GAAG,IAAI,CAAC;IACvD,kBAAkB,CAAC,EAAE,kBAAkB,GAAG,IAAI,CAAC;IAC/C,wBAAwB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzC,aAAa,CAAC,EAAE,IAAI,GAAG,MAAM,GAAG,IAAI,CAAC;CACtC,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAClC,YAAY,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IACxC,iBAAiB,EAAE,OAAO,CAAC;IAC3B,qBAAqB,EAAE,OAAO,CAAC;IAC/B,qBAAqB,EAAE,OAAO,CAAC;IAC/B,2BAA2B,EAAE,OAAO,CAAC;IACrC;;;OAGG;IACH,oBAAoB,CAAC,EAAE,OAAO,CAAC;CAChC,CAAC;AAIF;;;GAGG;AACH,wBAAgB,4BAA4B,CAC1C,OAAO,EAAE,aAAa,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC,GAAG,IAAI,GAAG,SAAS,EACrF,YAAY,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GACtC,OAAO,CAMT;AAED;;;GAGG;AACH,wBAAgB,4BAA4B,CAC1C,IAAI,EAAE,2BAA2B,EACjC,GAAG,EAAE,qBAAqB,GACzB,OAAO,CAyBT;AAED,sEAAsE;AACtE,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,2BAA2B,GAAG,OAAO,CAEnF;AAED,MAAM,MAAM,6BAA6B,GAAG;IAC1C,YAAY,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IAC9B,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,WAAW,CAAC,EAAE,aAAa,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC;CAC7C,CAAC;AAEF;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,CAAC,SAAS,6BAA6B,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,CAW5F;AAED;;GAEG;AACH,wBAAgB,+BAA+B,CAAC,CAAC,SAAS,6BAA6B,EACrF,KAAK,EAAE,CAAC,EACR,UAAU,EAAE,OAAO,GAClB,CAAC,CAKH;AAED,mFAAmF;AACnF,wBAAgB,gCAAgC,CAAC,IAAI,EAAE,2BAA2B,GAAG,IAAI,GAAG,IAAI,
|
|
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":"
|
|
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":"
|
|
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"}
|
package/dist/utils/slugUtils.js
CHANGED
|
@@ -1,5 +1,22 @@
|
|
|
1
|
-
import
|
|
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":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"slugUtils.js","sourceRoot":"","sources":["../../src/utils/slugUtils.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/prisma/schema.prisma
CHANGED
|
@@ -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 {
|
|
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
|
+
}
|
package/src/utils/slugUtils.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import
|
|
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,
|