@bash-app/bash-common 30.220.0 → 30.222.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/dist/definitions.d.ts +7 -1
  2. package/dist/definitions.d.ts.map +1 -1
  3. package/dist/definitions.js +19 -1
  4. package/dist/definitions.js.map +1 -1
  5. package/dist/extendedSchemas.d.ts +147 -0
  6. package/dist/extendedSchemas.d.ts.map +1 -1
  7. package/dist/extendedSchemas.js +20 -0
  8. package/dist/extendedSchemas.js.map +1 -1
  9. package/dist/index.d.ts +1 -1
  10. package/dist/index.d.ts.map +1 -1
  11. package/dist/index.js +1 -1
  12. package/dist/index.js.map +1 -1
  13. package/dist/membershipDefinitions.d.ts +4 -2
  14. package/dist/membershipDefinitions.d.ts.map +1 -1
  15. package/dist/membershipDefinitions.js +9 -2
  16. package/dist/membershipDefinitions.js.map +1 -1
  17. package/dist/utils/__tests__/paymentUtils.test.js +126 -1
  18. package/dist/utils/__tests__/paymentUtils.test.js.map +1 -1
  19. package/dist/utils/__tests__/urlUtils.externalLink.test.d.ts +2 -0
  20. package/dist/utils/__tests__/urlUtils.externalLink.test.d.ts.map +1 -0
  21. package/dist/utils/__tests__/urlUtils.externalLink.test.js +29 -0
  22. package/dist/utils/__tests__/urlUtils.externalLink.test.js.map +1 -0
  23. package/dist/utils/paymentUtils.d.ts +29 -1
  24. package/dist/utils/paymentUtils.d.ts.map +1 -1
  25. package/dist/utils/paymentUtils.js +43 -3
  26. package/dist/utils/paymentUtils.js.map +1 -1
  27. package/dist/utils/urlUtils.d.ts +11 -0
  28. package/dist/utils/urlUtils.d.ts.map +1 -1
  29. package/dist/utils/urlUtils.js +40 -0
  30. package/dist/utils/urlUtils.js.map +1 -1
  31. package/package.json +1 -1
  32. package/prisma/schema.prisma +96 -1
  33. package/src/definitions.ts +22 -0
  34. package/src/extendedSchemas.ts +25 -0
  35. package/src/index.ts +1 -0
  36. package/src/membershipDefinitions.ts +10 -2
  37. package/src/utils/__tests__/paymentUtils.test.ts +174 -0
  38. package/src/utils/__tests__/urlUtils.externalLink.test.ts +36 -0
  39. package/src/utils/paymentUtils.ts +68 -1
  40. package/src/utils/urlUtils.ts +45 -0
@@ -1 +1 @@
1
- {"version":3,"file":"paymentUtils.js","sourceRoot":"","sources":["../../src/utils/paymentUtils.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"paymentUtils.js","sourceRoot":"","sources":["../../src/utils/paymentUtils.ts"],"names":[],"mappings":"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"}
@@ -41,4 +41,15 @@ export declare function executeWithTimeout<T>(operation: () => Promise<T>, timeo
41
41
  * @param onTimeout - Callback when redirect times out
42
42
  */
43
43
  export declare function redirectToStripeWithTimeout(redirectUrl: string, timeoutMs?: number, onTimeout?: () => void): void;
44
+ /**
45
+ * Builds a safe absolute URL for `<a href>` from user-edited service/profile links.
46
+ *
47
+ * Browsers resolve `href="example.com"` as a **relative** URL (under the current path),
48
+ * not `https://example.com`, so bare domains must be prefixed with `https://`.
49
+ * Stores sometimes save Instagram as `@handle` instead of a full URL — those are mapped
50
+ * to `https://www.instagram.com/{handle}/`.
51
+ *
52
+ * @returns `"#"` when the value is empty or unsafe (`javascript:`, `data:`).
53
+ */
54
+ export declare function toExternalLinkHref(raw: string | undefined | null): string;
44
55
  //# sourceMappingURL=urlUtils.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"urlUtils.d.ts","sourceRoot":"","sources":["../../src/utils/urlUtils.ts"],"names":[],"mappings":"AAMA,wBAAgB,eAAe,IAAI,MAAM,CAKxC;AAED,wBAAgB,cAAc,IAAI,MAAM,CAYvC;AAED,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAO3E;AAED,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,CA0B7E;AAED,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,CA0BvE;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,sBAAsB,CACpC,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,MAAM,EACZ,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,MAAM,GACd,MAAM,CAIR;AAED;;;;;;;;;GASG;AACH,wBAAsB,kBAAkB,CAAC,CAAC,EACxC,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAC3B,SAAS,GAAE,MAAmC,EAC9C,SAAS,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,EACxD,UAAU,GAAE,MAAU,GACrB,OAAO,CAAC,CAAC,CAAC,CA2BZ;AAED;;;;;;GAMG;AACH,wBAAgB,2BAA2B,CACzC,WAAW,EAAE,MAAM,EACnB,SAAS,GAAE,MAAmC,EAC9C,SAAS,CAAC,EAAE,MAAM,IAAI,GACrB,IAAI,CA8BN"}
1
+ {"version":3,"file":"urlUtils.d.ts","sourceRoot":"","sources":["../../src/utils/urlUtils.ts"],"names":[],"mappings":"AAMA,wBAAgB,eAAe,IAAI,MAAM,CAKxC;AAED,wBAAgB,cAAc,IAAI,MAAM,CAYvC;AAED,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAO3E;AAED,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,CA0B7E;AAED,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,CA0BvE;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,sBAAsB,CACpC,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,MAAM,EACZ,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,MAAM,GACd,MAAM,CAIR;AAED;;;;;;;;;GASG;AACH,wBAAsB,kBAAkB,CAAC,CAAC,EACxC,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAC3B,SAAS,GAAE,MAAmC,EAC9C,SAAS,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,EACxD,UAAU,GAAE,MAAU,GACrB,OAAO,CAAC,CAAC,CAAC,CA2BZ;AAED;;;;;;GAMG;AACH,wBAAgB,2BAA2B,CACzC,WAAW,EAAE,MAAM,EACnB,SAAS,GAAE,MAAmC,EAC9C,SAAS,CAAC,EAAE,MAAM,IAAI,GACrB,IAAI,CA8BN;AAED;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG,MAAM,CAiCzE"}
@@ -161,4 +161,44 @@ export function redirectToStripeWithTimeout(redirectUrl, timeoutMs = STRIPE_REDI
161
161
  }
162
162
  }
163
163
  }
164
+ /**
165
+ * Builds a safe absolute URL for `<a href>` from user-edited service/profile links.
166
+ *
167
+ * Browsers resolve `href="example.com"` as a **relative** URL (under the current path),
168
+ * not `https://example.com`, so bare domains must be prefixed with `https://`.
169
+ * Stores sometimes save Instagram as `@handle` instead of a full URL — those are mapped
170
+ * to `https://www.instagram.com/{handle}/`.
171
+ *
172
+ * @returns `"#"` when the value is empty or unsafe (`javascript:`, `data:`).
173
+ */
174
+ export function toExternalLinkHref(raw) {
175
+ if (raw == null) {
176
+ return "#";
177
+ }
178
+ const trimmed = raw.trim();
179
+ if (trimmed === "") {
180
+ return "#";
181
+ }
182
+ const lower = trimmed.toLowerCase();
183
+ if (lower.startsWith("javascript:") || lower.startsWith("data:")) {
184
+ return "#";
185
+ }
186
+ if (/^https?:\/\//i.test(trimmed)) {
187
+ return trimmed;
188
+ }
189
+ if (/^mailto:/i.test(trimmed) || /^tel:/i.test(trimmed)) {
190
+ return trimmed;
191
+ }
192
+ // Instagram @handle (often stored as a handle instead of a URL)
193
+ if (trimmed.startsWith("@")) {
194
+ const handle = trimmed
195
+ .slice(1)
196
+ .trim()
197
+ .replace(/^@+/, "");
198
+ if (/^[a-zA-Z0-9._]{1,30}$/.test(handle)) {
199
+ return `https://www.instagram.com/${handle}/`;
200
+ }
201
+ }
202
+ return `https://${trimmed}`;
203
+ }
164
204
  //# sourceMappingURL=urlUtils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"urlUtils.js","sourceRoot":"","sources":["../../src/utils/urlUtils.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"urlUtils.js","sourceRoot":"","sources":["../../src/utils/urlUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,0BAA0B,EAAE,0BAA0B,EAAE,MAAM,mBAAmB,CAAC;AAC5G,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAEvD,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,uBAAuB,CAAC;AAEtE,MAAM,UAAU,eAAe;IAC7B,MAAM,IAAI,GAAG,YAAY,EAAE;QACzB,CAAC,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,KAAK,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE;QACxD,CAAC,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,KAAK,MAAM,CAAC,QAAQ,CAAC,QAAQ,OAAO,CAAC;IACpE,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,sDAAsD;IACtD,gDAAgD;IAChD,MAAM,UAAU,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,KAAK,WAAW;QACxC,MAAM,CAAC,QAAQ,CAAC,QAAQ,KAAK,WAAW;QACxC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;IAEhE,MAAM,IAAI,GAAG,UAAU;QACrB,CAAC,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,KAAK,MAAM,CAAC,QAAQ,CAAC,QAAQ,OAAO;QACjE,CAAC,CAAC,QAAQ,CAAC;IAEb,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,WAA+B;IACjE,IAAI,WAAW,EAAE,CAAC;QAChB,MAAM,GAAG,GAAG,WAAW,eAAe,IAAI,WAAW,EAAE,CAAC;QACxD,OAAO,GAAG,CAAC;IACb,CAAC;IACD,OAAO,CAAC,KAAK,CAAC,2DAA2D,CAAC,CAAC;IAC3E,OAAO,EAAE,CAAC;AACZ,CAAC;AAOD,MAAM,UAAU,mBAAmB,CAAC,GAAW,EAAE,MAAoB;IACnE,mCAAmC;IACnC,MAAM,CAAC,IAAI,EAAE,IAAI,GAAG,EAAE,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAEzC,qCAAqC;IACrC,MAAM,CAAC,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAE3C,iDAAiD;IACjD,MAAM,YAAY,GAAG,IAAI,eAAe,CAAC,KAAK,CAAC,CAAC;IAEhD,kCAAkC;IAClC,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;IAEpE,sCAAsC;IACtC,MAAM,QAAQ,GAAG,YAAY,CAAC,QAAQ,EAAE,CAAC;IAEzC,sBAAsB;IACtB,IAAI,MAAM,GAAG,IAAI,CAAC;IAClB,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;IAC3B,CAAC;IACD,IAAI,IAAI,EAAE,CAAC;QACT,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC;IACvB,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,GAAW,EAAE,IAAc;IAC7D,mCAAmC;IACnC,MAAM,CAAC,IAAI,EAAE,IAAI,GAAG,EAAE,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAEzC,qCAAqC;IACrC,MAAM,CAAC,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAE3C,iDAAiD;IACjD,MAAM,YAAY,GAAG,IAAI,eAAe,CAAC,KAAK,CAAC,CAAC;IAEhD,wCAAwC;IACxC,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IAEhD,sCAAsC;IACtC,MAAM,QAAQ,GAAG,YAAY,CAAC,QAAQ,EAAE,CAAC;IAEzC,sBAAsB;IACtB,IAAI,MAAM,GAAG,IAAI,CAAC;IAClB,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;IAC3B,CAAC;IACD,IAAI,IAAI,EAAE,CAAC;QACT,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC;IACvB,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,sBAAsB,CACpC,WAAmB,EACnB,IAAY,EACZ,YAAoB,EACpB,OAAe;IAEf,kDAAkD;IAClD,MAAM,cAAc,GAAG,qBAAqB,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;IAChE,OAAO,GAAG,OAAO,GAAG,cAAc,GAAG,YAAY,EAAE,CAAC;AACtD,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,SAA2B,EAC3B,YAAoB,0BAA0B,EAC9C,SAAwD,EACxD,aAAqB,CAAC;IAEtB,IAAI,SAA4B,CAAC;IAEjC,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,UAAU,EAAE,OAAO,EAAE,EAAE,CAAC;QACvD,IAAI,CAAC;YACH,MAAM,cAAc,GAAG,IAAI,OAAO,CAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE;gBACtD,UAAU,CAAC,GAAG,EAAE;oBACd,MAAM,CAAC,IAAI,KAAK,CAAC,6BAA6B,SAAS,IAAI,CAAC,CAAC,CAAC;gBAChE,CAAC,EAAE,SAAS,CAAC,CAAC;YAChB,CAAC,CAAC,CAAC;YAEH,MAAM,gBAAgB,GAAG,SAAS,EAAE,CAAC;YAErC,OAAO,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,gBAAgB,EAAE,cAAc,CAAC,CAAC,CAAC;QAChE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,SAAS,GAAG,KAAc,CAAC;YAE3B,IAAI,OAAO,GAAG,UAAU,EAAE,CAAC;gBACzB,OAAO,CAAC,IAAI,CAAC,WAAW,OAAO,GAAG,CAAC,sBAAsB,EAAE,KAAK,CAAC,CAAC;gBAClE,IAAI,SAAS,EAAE,CAAC;oBACd,MAAM,SAAS,CAAC,OAAO,CAAC,CAAC;gBAC3B,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,SAAS,IAAI,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;AACrE,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,2BAA2B,CACzC,WAAmB,EACnB,YAAoB,0BAA0B,EAC9C,SAAsB;IAEtB,IAAI,iBAAiB,GAAG,KAAK,CAAC;IAE9B,iBAAiB;IACjB,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE;QAChC,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACvB,OAAO,CAAC,IAAI,CAAC,+CAA+C,CAAC,CAAC;YAC9D,IAAI,SAAS,EAAE,CAAC;gBACd,SAAS,EAAE,CAAC;YACd,CAAC;iBAAM,CAAC;gBACN,qCAAqC;gBACrC,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;YAC3B,CAAC;QACH,CAAC;IACH,CAAC,EAAE,SAAS,CAAC,CAAC;IAEd,IAAI,CAAC;QACH,mBAAmB;QACnB,MAAM,CAAC,QAAQ,CAAC,IAAI,GAAG,WAAW,CAAC;QACnC,iBAAiB,GAAG,IAAI,CAAC;QACzB,YAAY,CAAC,SAAS,CAAC,CAAC;IAC1B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,+BAA+B,EAAE,KAAK,CAAC,CAAC;QACtD,YAAY,CAAC,SAAS,CAAC,CAAC;QACxB,IAAI,SAAS,EAAE,CAAC;YACd,SAAS,EAAE,CAAC;QACd,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;QAC3B,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,kBAAkB,CAAC,GAA8B;IAC/D,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC;QAChB,OAAO,GAAG,CAAC;IACb,CAAC;IACD,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;IAC3B,IAAI,OAAO,KAAK,EAAE,EAAE,CAAC;QACnB,OAAO,GAAG,CAAC;IACb,CAAC;IAED,MAAM,KAAK,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IACpC,IAAI,KAAK,CAAC,UAAU,CAAC,aAAa,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACjE,OAAO,GAAG,CAAC;IACb,CAAC;IAED,IAAI,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAClC,OAAO,OAAO,CAAC;IACjB,CAAC;IACD,IAAI,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QACxD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,gEAAgE;IAChE,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAC5B,MAAM,MAAM,GAAG,OAAO;aACnB,KAAK,CAAC,CAAC,CAAC;aACR,IAAI,EAAE;aACN,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACtB,IAAI,uBAAuB,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YACzC,OAAO,6BAA6B,MAAM,GAAG,CAAC;QAChD,CAAC;IACH,CAAC;IAED,OAAO,WAAW,OAAO,EAAE,CAAC;AAC9B,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bash-app/bash-common",
3
- "version": "30.220.0",
3
+ "version": "30.222.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",
@@ -767,6 +767,7 @@ model BashEvent {
767
767
  sponsorBookingRequests SponsorBookingRequest[] @relation("SponsorBookingEvent")
768
768
  sponsorships SponsoredEvent[]
769
769
  tickets Ticket[]
770
+ ticketGiftGrants TicketGiftGrant[]
770
771
  ticketTiers TicketTier[]
771
772
  favoritedBy UserFavorite[]
772
773
  userPromoCodeRedemption UserPromoCodeRedemption[]
@@ -829,6 +830,7 @@ model BashEvent {
829
830
  groupUnlockOffers GroupUnlockOffer[]
830
831
 
831
832
  bashEventArtists BashEventArtist[]
833
+ vanityPaths EventVanityPath[]
832
834
 
833
835
  @@index([templateId])
834
836
  @@index([parentEventId])
@@ -1355,7 +1357,44 @@ model TicketTier {
1355
1357
  // Checkout timer: host-configurable per-tier timeout (minutes). null = no timer.
1356
1358
  checkoutTimeoutMinutes Int?
1357
1359
 
1360
+ /// When true, BashPass subscribers may redeem this tier (subject to caps).
1361
+ bashPassEligible Boolean @default(false)
1362
+ /// Max BashPass redemptions for this tier (null = unlimited within tier capacity).
1363
+ bashPassMaxRedemptions Int?
1364
+
1358
1365
  @@unique([bashEventId, title])
1366
+ ticketGiftGrants TicketGiftGrant[]
1367
+ }
1368
+
1369
+ enum TicketGiftGrantStatus {
1370
+ Active
1371
+ Revoked
1372
+ Exhausted
1373
+ }
1374
+
1375
+ /// Host-initiated comp block: N tickets allocated to one person to distribute.
1376
+ model TicketGiftGrant {
1377
+ id String @id @default(cuid())
1378
+ bashEventId String
1379
+ bashEvent BashEvent @relation(fields: [bashEventId], references: [id], onDelete: Cascade)
1380
+ ticketTierId String
1381
+ ticketTier TicketTier @relation(fields: [ticketTierId], references: [id], onDelete: Restrict)
1382
+ grantedByUserId String
1383
+ grantedBy User @relation("GiftGrantsIssued", fields: [grantedByUserId], references: [id], onDelete: Cascade)
1384
+ grantedToUserId String
1385
+ grantedTo User @relation("GiftGrantsReceived", fields: [grantedToUserId], references: [id], onDelete: Cascade)
1386
+ quantity Int
1387
+ /// 0 = grantee may not re-gift; 1 = one level of re-gifting; null = unlimited
1388
+ maxGiftHops Int? @default(1)
1389
+ status TicketGiftGrantStatus @default(Active)
1390
+ note String?
1391
+ expiresAt DateTime?
1392
+ createdAt DateTime @default(now())
1393
+ tickets Ticket[]
1394
+
1395
+ @@index([bashEventId])
1396
+ @@index([grantedToUserId])
1397
+ @@index([grantedByUserId])
1359
1398
  }
1360
1399
 
1361
1400
  model Ticket {
@@ -1396,10 +1435,16 @@ model Ticket {
1396
1435
  qrToken String?
1397
1436
 
1398
1437
  // BashPoints Purchase Tracking
1399
- purchaseType String? // "USD", "BashPoints", "Free", "Comp"
1438
+ purchaseType String? // "USD", "BashPoints", "Free", "Comp", "BashPass"
1400
1439
  pointsPaid Int? // BashPoints amount paid (if purchaseType="BashPoints")
1401
1440
  stripePurchaseId String? // Stripe payment ID (if purchaseType="USD")
1402
1441
 
1442
+ /// When set, this ticket was created from a host `TicketGiftGrant` (comp block for distribution).
1443
+ giftGrantId String?
1444
+ giftGrant TicketGiftGrant? @relation(fields: [giftGrantId], references: [id], onDelete: SetNull)
1445
+ /// 0 = held by original grantee; +1 per accepted gift transfer hop.
1446
+ giftHop Int @default(0)
1447
+
1403
1448
  // Marketing attribution (from landing URL → sessionStorage → Stripe metadata → ticket row)
1404
1449
  utmSource String?
1405
1450
  utmMedium String?
@@ -1423,6 +1468,7 @@ model Ticket {
1423
1468
  @@index([bashEventId])
1424
1469
  @@index([waitlistUserId])
1425
1470
  @@index([attributedArtistId])
1471
+ @@index([giftGrantId])
1426
1472
  }
1427
1473
 
1428
1474
  model TicketTransfer {
@@ -1917,6 +1963,10 @@ model User {
1917
1963
  /// Optional consumer BashPass subscription (waives guest platform fee on tickets; monthly BashPoints).
1918
1964
  bashPassStripeSubscriptionId String? @unique
1919
1965
  bashPassCurrentPeriodEnd DateTime?
1966
+ /// Stripe price tier for standalone BashPass; effective tier may also come from membership bundle.
1967
+ bashPassTier BashPassTier?
1968
+ bashPassEventsUsedThisMonth Int @default(0)
1969
+ bashPassMonthlyCapResetAt DateTime?
1920
1970
  isVerified Boolean @default(false)
1921
1971
  verificationMethod String?
1922
1972
  verifiedAt DateTime?
@@ -2053,6 +2103,8 @@ model User {
2053
2103
  transfersTo TicketTransfer[] @relation("TransfersTo")
2054
2104
  ticketTransferInvitesFrom TicketTransferInvite[] @relation("TicketTransferInviteFrom")
2055
2105
  ticketTransferInvitesToUser TicketTransferInvite[] @relation("TicketTransferInviteToUser")
2106
+ giftGrantsIssued TicketGiftGrant[] @relation("GiftGrantsIssued")
2107
+ giftGrantsReceived TicketGiftGrant[] @relation("GiftGrantsReceived")
2056
2108
  unblocksReceived UnblockedUserHistory[] @relation("UserUnblocksReceived")
2057
2109
  unblocksCreated UnblockedUserHistory[] @relation("UserUnblocksMade")
2058
2110
  suspendedBy User? @relation("SuspendedUsers", fields: [suspendedById], references: [id])
@@ -2157,6 +2209,10 @@ model User {
2157
2209
  // Groups
2158
2210
  ownedGroups EventGroup[] @relation("OwnedGroups")
2159
2211
  groupMembers GroupMember[] @relation("GroupMemberships")
2212
+
2213
+ // Vanity paths
2214
+ requestedVanityPaths EventVanityPath[] @relation("VanityRequests")
2215
+ approvedVanityPaths EventVanityPath[] @relation("VanityApprovals")
2160
2216
  }
2161
2217
 
2162
2218
  model UserPreferences {
@@ -6196,6 +6252,12 @@ enum CommentStatus {
6196
6252
  Trash
6197
6253
  }
6198
6254
 
6255
+ enum BashPassTier {
6256
+ LITE
6257
+ STANDARD
6258
+ UNLIMITED
6259
+ }
6260
+
6199
6261
  enum MembershipTier {
6200
6262
  Basic
6201
6263
  Premium
@@ -7666,3 +7728,36 @@ model PartnerAdSlot {
7666
7728
  @@index([isActive, wizardStep])
7667
7729
  @@index([brandId])
7668
7730
  }
7731
+
7732
+ // ============================================
7733
+ // EVENT VANITY PATHS
7734
+ // ============================================
7735
+
7736
+ /// Approved short paths for flagship events: bash.community/bash/{segment}
7737
+ /// Pending rows are visible only to admins; only Active rows resolve publicly.
7738
+ model EventVanityPath {
7739
+ id String @id @default(cuid())
7740
+ /// Lowercase URL segment, e.g. "bashfest". No slashes. Globally unique.
7741
+ segment String @unique
7742
+ bashEventId String
7743
+ status VanityPathStatus @default(Pending)
7744
+ requestedById String?
7745
+ approvedById String?
7746
+ approvedAt DateTime?
7747
+ createdAt DateTime @default(now())
7748
+ updatedAt DateTime @updatedAt
7749
+
7750
+ bashEvent BashEvent @relation(fields: [bashEventId], references: [id], onDelete: Cascade)
7751
+ requestedBy User? @relation("VanityRequests", fields: [requestedById], references: [id], onDelete: SetNull)
7752
+ approvedBy User? @relation("VanityApprovals", fields: [approvedById], references: [id], onDelete: SetNull)
7753
+
7754
+ @@index([status])
7755
+ @@index([bashEventId])
7756
+ @@map("event_vanity_paths")
7757
+ }
7758
+
7759
+ enum VanityPathStatus {
7760
+ Pending
7761
+ Active
7762
+ Revoked
7763
+ }
@@ -1,5 +1,6 @@
1
1
  import {
2
2
  BashEventType,
3
+ BashPassTier,
3
4
  BracketType,
4
5
  CompetitionType,
5
6
  Contact,
@@ -45,6 +46,27 @@ export const STRIPE_API_TIMEOUT_MS = 15000 as const; // 15 seconds for API calls
45
46
  */
46
47
  export const DEFAULT_IDEA_INTEREST_THRESHOLD = 35 as const;
47
48
 
49
+ /** Monthly BashPass event redemption caps by tier (`null` = unlimited). */
50
+ export const BASH_PASS_EVENT_CAPS: Record<BashPassTier, number | null> = {
51
+ [BashPassTier.LITE]: 4,
52
+ [BashPassTier.STANDARD]: 8,
53
+ [BashPassTier.UNLIMITED]: null,
54
+ };
55
+
56
+ /** For comparing which BashPass tier is higher when user has membership bundle + standalone. */
57
+ export const BASH_PASS_TIER_RANK: Record<BashPassTier, number> = {
58
+ [BashPassTier.LITE]: 1,
59
+ [BashPassTier.STANDARD]: 2,
60
+ [BashPassTier.UNLIMITED]: 3,
61
+ };
62
+
63
+ /** Env var names for Stripe Price IDs (read at runtime in API). */
64
+ export const BASH_PASS_PRICE_ENV_KEYS: Record<BashPassTier, string> = {
65
+ [BashPassTier.LITE]: "STRIPE_BASH_PASS_LITE_PRICE_ID",
66
+ [BashPassTier.STANDARD]: "STRIPE_BASH_PASS_STANDARD_PRICE_ID",
67
+ [BashPassTier.UNLIMITED]: "STRIPE_BASH_PASS_UNLIMITED_PRICE_ID",
68
+ };
69
+
48
70
  export const URL_PARAMS_BASH_EVENT_ID = "bashEventId" as const;
49
71
  export const URL_PARAMS_BASH_EVENT_TITLE = "bashEventTitle" as const;
50
72
  export const URL_PARAMS_BASH_EVENT_DESC = "bashEventDesc" as const;
@@ -190,6 +190,12 @@ export const PRIVATE_USER_ACCOUNT_TO_SELECT = {
190
190
  zipCode: true,
191
191
  country: true,
192
192
  phone: true,
193
+ membershipExpiresAt: true,
194
+ bashPassStripeSubscriptionId: true,
195
+ bashPassCurrentPeriodEnd: true,
196
+ bashPassTier: true,
197
+ bashPassEventsUsedThisMonth: true,
198
+ bashPassMonthlyCapResetAt: true,
193
199
  userSubscription: {
194
200
  select: PRIVATE_USER_SUBSCRIPTION_DATA_TO_SELECT,
195
201
  },
@@ -1157,6 +1163,25 @@ export interface TicketTierExt extends TicketTier {
1157
1163
  promoCodes: BashEventPromoCode[];
1158
1164
  }
1159
1165
 
1166
+ /** Host / API include for `TicketGiftGrant` lists and create responses. */
1167
+ export const TICKET_GIFT_GRANT_DATA_TO_INCLUDE = {
1168
+ ticketTier: { select: { id: true, title: true, bashEventId: true } },
1169
+ grantedBy: { select: FRONT_END_USER_DATA_TO_SELECT },
1170
+ grantedTo: { select: FRONT_END_USER_DATA_TO_SELECT },
1171
+ tickets: {
1172
+ select: {
1173
+ id: true,
1174
+ status: true,
1175
+ giftHop: true,
1176
+ ownerId: true,
1177
+ },
1178
+ },
1179
+ } satisfies Prisma.TicketGiftGrantInclude;
1180
+
1181
+ export type TicketGiftGrantExt = Prisma.TicketGiftGrantGetPayload<{
1182
+ include: typeof TICKET_GIFT_GRANT_DATA_TO_INCLUDE;
1183
+ }>;
1184
+
1160
1185
  export interface TicketExt extends Ticket {
1161
1186
  owner: PublicUser;
1162
1187
  forUser: PublicUser;
package/src/index.ts CHANGED
@@ -27,6 +27,7 @@ export {
27
27
  BalloonsFormat,
28
28
  BartenderFormat,
29
29
  BashAssociationType,
30
+ BashPassTier,
30
31
  BashAvailabilityWindow,
31
32
  BashEventDressTags,
32
33
  BashEventSource,
@@ -1,7 +1,15 @@
1
1
  // Membership tier definitions and constants shared between frontend and backend
2
- import { MembershipTier, ReferralTier, CreditTransactionType } from '@prisma/client';
2
+ import { BashPassTier, MembershipTier, ReferralTier, CreditTransactionType } from '@prisma/client';
3
3
 
4
- export { MembershipTier, ReferralTier, CreditTransactionType };
4
+ export { BashPassTier, MembershipTier, ReferralTier, CreditTransactionType };
5
+
6
+ /** BashPass tier included with paid membership (standalone Stripe BashPass can stack; higher tier wins). */
7
+ export const MEMBERSHIP_BASH_PASS_TIER: Partial<Record<MembershipTier, BashPassTier>> = {
8
+ [MembershipTier.Premium]: BashPassTier.LITE,
9
+ [MembershipTier.Pro]: BashPassTier.STANDARD,
10
+ [MembershipTier.Elite]: BashPassTier.UNLIMITED,
11
+ [MembershipTier.Legend]: BashPassTier.UNLIMITED,
12
+ };
5
13
 
6
14
  export type MembershipBillingInterval = 'Monthly' | 'Yearly';
7
15
 
@@ -3,6 +3,7 @@
3
3
  * Testing business logic without database dependencies
4
4
  */
5
5
 
6
+ import { BashPassTier, MembershipTier } from "@prisma/client";
6
7
  import {
7
8
  calculateDiscountFromPromoCode,
8
9
  convertCentsToDollars,
@@ -19,6 +20,10 @@ import {
19
20
  splitBashPlatformFeeForTicketCheckout,
20
21
  computeTicketApplicationFeeAmountCents,
21
22
  userHasActiveBashPass,
23
+ getEffectiveBashPassTier,
24
+ getBashPassMonthlyCapRemaining,
25
+ higherBashPassTier,
26
+ membershipGrantsBashPassTier,
22
27
  } from "../paymentUtils.js";
23
28
 
24
29
  describe("PaymentUtils - Core Functions", () => {
@@ -238,4 +243,173 @@ describe("PaymentUtils - Core Functions", () => {
238
243
  expect(typeof fee).toBe("number");
239
244
  });
240
245
  });
246
+
247
+ describe("BashPass tier and monthly cap", () => {
248
+ const future = new Date(Date.now() + 86400000 * 30);
249
+ const past = new Date(Date.now() - 86400000);
250
+
251
+ test("higherBashPassTier picks the higher rank", () => {
252
+ expect(higherBashPassTier(BashPassTier.LITE, BashPassTier.STANDARD)).toBe(BashPassTier.STANDARD);
253
+ expect(higherBashPassTier(BashPassTier.STANDARD, BashPassTier.LITE)).toBe(BashPassTier.STANDARD);
254
+ expect(higherBashPassTier(BashPassTier.STANDARD, BashPassTier.UNLIMITED)).toBe(BashPassTier.UNLIMITED);
255
+ expect(higherBashPassTier(null, BashPassTier.LITE)).toBe(BashPassTier.LITE);
256
+ expect(higherBashPassTier(BashPassTier.LITE, null)).toBe(BashPassTier.LITE);
257
+ expect(higherBashPassTier(null, null)).toBeNull();
258
+ });
259
+
260
+ test("membershipGrantsBashPassTier returns null for Basic or expired membership", () => {
261
+ expect(
262
+ membershipGrantsBashPassTier({
263
+ membershipTier: MembershipTier.Basic,
264
+ membershipExpiresAt: future,
265
+ })
266
+ ).toBeNull();
267
+ expect(
268
+ membershipGrantsBashPassTier({
269
+ membershipTier: MembershipTier.Premium,
270
+ membershipExpiresAt: past,
271
+ })
272
+ ).toBeNull();
273
+ });
274
+
275
+ test("membershipGrantsBashPassTier maps Premium/Pro/Elite/Legend", () => {
276
+ expect(
277
+ membershipGrantsBashPassTier({ membershipTier: MembershipTier.Premium, membershipExpiresAt: future })
278
+ ).toBe(BashPassTier.LITE);
279
+ expect(
280
+ membershipGrantsBashPassTier({ membershipTier: MembershipTier.Pro, membershipExpiresAt: future })
281
+ ).toBe(BashPassTier.STANDARD);
282
+ expect(
283
+ membershipGrantsBashPassTier({ membershipTier: MembershipTier.Elite, membershipExpiresAt: future })
284
+ ).toBe(BashPassTier.UNLIMITED);
285
+ expect(
286
+ membershipGrantsBashPassTier({ membershipTier: MembershipTier.Legend, membershipExpiresAt: future })
287
+ ).toBe(BashPassTier.UNLIMITED);
288
+ });
289
+
290
+ test("getEffectiveBashPassTier uses standalone subscription when active", () => {
291
+ expect(
292
+ getEffectiveBashPassTier({
293
+ bashPassTier: BashPassTier.STANDARD,
294
+ bashPassStripeSubscriptionId: "sub_1",
295
+ bashPassCurrentPeriodEnd: future,
296
+ membershipTier: MembershipTier.Basic,
297
+ membershipExpiresAt: null,
298
+ })
299
+ ).toBe(BashPassTier.STANDARD);
300
+ });
301
+
302
+ test("getEffectiveBashPassTier uses membership when no standalone", () => {
303
+ expect(
304
+ getEffectiveBashPassTier({
305
+ bashPassTier: null,
306
+ bashPassStripeSubscriptionId: null,
307
+ bashPassCurrentPeriodEnd: null,
308
+ membershipTier: MembershipTier.Pro,
309
+ membershipExpiresAt: future,
310
+ })
311
+ ).toBe(BashPassTier.STANDARD);
312
+ });
313
+
314
+ test("getEffectiveBashPassTier takes higher of membership and standalone", () => {
315
+ expect(
316
+ getEffectiveBashPassTier({
317
+ bashPassTier: BashPassTier.LITE,
318
+ bashPassStripeSubscriptionId: "sub_1",
319
+ bashPassCurrentPeriodEnd: future,
320
+ membershipTier: MembershipTier.Pro,
321
+ membershipExpiresAt: future,
322
+ })
323
+ ).toBe(BashPassTier.STANDARD);
324
+ expect(
325
+ getEffectiveBashPassTier({
326
+ bashPassTier: BashPassTier.UNLIMITED,
327
+ bashPassStripeSubscriptionId: "sub_1",
328
+ bashPassCurrentPeriodEnd: future,
329
+ membershipTier: MembershipTier.Premium,
330
+ membershipExpiresAt: future,
331
+ })
332
+ ).toBe(BashPassTier.UNLIMITED);
333
+ });
334
+
335
+ test("getEffectiveBashPassTier returns null when neither applies", () => {
336
+ expect(
337
+ getEffectiveBashPassTier({
338
+ bashPassTier: null,
339
+ bashPassStripeSubscriptionId: null,
340
+ bashPassCurrentPeriodEnd: null,
341
+ membershipTier: MembershipTier.Basic,
342
+ membershipExpiresAt: null,
343
+ })
344
+ ).toBeNull();
345
+ expect(
346
+ getEffectiveBashPassTier({
347
+ bashPassTier: BashPassTier.LITE,
348
+ bashPassStripeSubscriptionId: null,
349
+ bashPassCurrentPeriodEnd: null,
350
+ membershipTier: MembershipTier.Basic,
351
+ membershipExpiresAt: null,
352
+ })
353
+ ).toBeNull();
354
+ });
355
+
356
+ test("getBashPassMonthlyCapRemaining is 0 without effective tier", () => {
357
+ expect(
358
+ getBashPassMonthlyCapRemaining({
359
+ bashPassTier: null,
360
+ bashPassEventsUsedThisMonth: 0,
361
+ bashPassStripeSubscriptionId: null,
362
+ bashPassCurrentPeriodEnd: null,
363
+ membershipTier: MembershipTier.Basic,
364
+ membershipExpiresAt: null,
365
+ })
366
+ ).toBe(0);
367
+ });
368
+
369
+ test("getBashPassMonthlyCapRemaining is null for UNLIMITED effective tier", () => {
370
+ expect(
371
+ getBashPassMonthlyCapRemaining({
372
+ bashPassTier: null,
373
+ bashPassEventsUsedThisMonth: 100,
374
+ bashPassStripeSubscriptionId: null,
375
+ bashPassCurrentPeriodEnd: null,
376
+ membershipTier: MembershipTier.Elite,
377
+ membershipExpiresAt: future,
378
+ })
379
+ ).toBeNull();
380
+ });
381
+
382
+ test("getBashPassMonthlyCapRemaining subtracts usage for capped tiers", () => {
383
+ expect(
384
+ getBashPassMonthlyCapRemaining({
385
+ bashPassTier: BashPassTier.LITE,
386
+ bashPassEventsUsedThisMonth: 2,
387
+ bashPassStripeSubscriptionId: "sub_1",
388
+ bashPassCurrentPeriodEnd: future,
389
+ membershipTier: MembershipTier.Basic,
390
+ membershipExpiresAt: null,
391
+ })
392
+ ).toBe(2);
393
+ expect(
394
+ getBashPassMonthlyCapRemaining({
395
+ bashPassTier: BashPassTier.LITE,
396
+ bashPassEventsUsedThisMonth: 4,
397
+ bashPassStripeSubscriptionId: "sub_1",
398
+ bashPassCurrentPeriodEnd: future,
399
+ membershipTier: MembershipTier.Basic,
400
+ membershipExpiresAt: null,
401
+ })
402
+ ).toBe(0);
403
+ expect(
404
+ getBashPassMonthlyCapRemaining({
405
+ bashPassTier: BashPassTier.STANDARD,
406
+ bashPassEventsUsedThisMonth: 8,
407
+ bashPassStripeSubscriptionId: "sub_1",
408
+ bashPassCurrentPeriodEnd: future,
409
+ membershipTier: MembershipTier.Basic,
410
+ membershipExpiresAt: null,
411
+ })
412
+ ).toBe(0);
413
+ });
414
+ });
241
415
  });
@@ -0,0 +1,36 @@
1
+ import { toExternalLinkHref } from "../urlUtils.js";
2
+
3
+ describe("toExternalLinkHref", () => {
4
+ it("returns # for empty or null", () => {
5
+ expect(toExternalLinkHref(null)).toBe("#");
6
+ expect(toExternalLinkHref(undefined)).toBe("#");
7
+ expect(toExternalLinkHref("")).toBe("#");
8
+ expect(toExternalLinkHref(" ")).toBe("#");
9
+ });
10
+
11
+ it("leaves http(s) URLs unchanged", () => {
12
+ expect(toExternalLinkHref("https://example.com")).toBe("https://example.com");
13
+ expect(toExternalLinkHref("http://example.com/path")).toBe("http://example.com/path");
14
+ });
15
+
16
+ it("prepends https to bare hostnames so browsers do not treat them as relative paths", () => {
17
+ expect(toExternalLinkHref("aavprod.com")).toBe("https://aavprod.com");
18
+ expect(toExternalLinkHref("www.foo.com/bar")).toBe("https://www.foo.com/bar");
19
+ });
20
+
21
+ it("preserves mailto and tel", () => {
22
+ expect(toExternalLinkHref("mailto:a@b.com")).toBe("mailto:a@b.com");
23
+ expect(toExternalLinkHref("tel:+15555551212")).toBe("tel:+15555551212");
24
+ });
25
+
26
+ it("maps Instagram @handle to instagram.com URL", () => {
27
+ expect(toExternalLinkHref("@a_prod_av")).toBe(
28
+ "https://www.instagram.com/a_prod_av/"
29
+ );
30
+ });
31
+
32
+ it("blocks obvious unsafe schemes", () => {
33
+ expect(toExternalLinkHref("javascript:alert(1)")).toBe("#");
34
+ expect(toExternalLinkHref("data:text/html,hi")).toBe("#");
35
+ });
36
+ });