@bash-app/bash-common 30.51.0 → 30.53.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 (184) hide show
  1. package/dist/definitions.d.ts +668 -0
  2. package/dist/definitions.d.ts.map +1 -0
  3. package/dist/definitions.js +467 -0
  4. package/dist/definitions.js.map +1 -0
  5. package/dist/extendedSchemas.d.ts +2206 -0
  6. package/dist/extendedSchemas.d.ts.map +1 -0
  7. package/dist/extendedSchemas.js +429 -0
  8. package/dist/extendedSchemas.js.map +1 -0
  9. package/dist/index.d.ts +39 -0
  10. package/dist/index.d.ts.map +1 -0
  11. package/dist/index.js +40 -0
  12. package/dist/index.js.map +1 -0
  13. package/dist/utils/addressUtils.d.ts +14 -0
  14. package/dist/utils/addressUtils.d.ts.map +1 -0
  15. package/dist/utils/addressUtils.js +177 -0
  16. package/dist/utils/addressUtils.js.map +1 -0
  17. package/dist/utils/apiUtils.d.ts +14 -0
  18. package/dist/utils/apiUtils.d.ts.map +1 -0
  19. package/dist/utils/apiUtils.js +61 -0
  20. package/dist/utils/apiUtils.js.map +1 -0
  21. package/dist/utils/arrayUtils.d.ts +2 -0
  22. package/dist/utils/arrayUtils.d.ts.map +1 -0
  23. package/dist/utils/arrayUtils.js +5 -0
  24. package/dist/utils/arrayUtils.js.map +1 -0
  25. package/dist/utils/awsS3Utils.d.ts +10 -0
  26. package/dist/utils/awsS3Utils.d.ts.map +1 -0
  27. package/dist/utils/awsS3Utils.js +89 -0
  28. package/dist/utils/awsS3Utils.js.map +1 -0
  29. package/dist/utils/badgeUtils.d.ts +33 -0
  30. package/dist/utils/badgeUtils.d.ts.map +1 -0
  31. package/dist/utils/badgeUtils.js +57 -0
  32. package/dist/utils/badgeUtils.js.map +1 -0
  33. package/dist/utils/blog/blogDbUtils.d.ts +48 -0
  34. package/dist/utils/blog/blogDbUtils.d.ts.map +1 -0
  35. package/dist/utils/blog/blogDbUtils.js +218 -0
  36. package/dist/utils/blog/blogDbUtils.js.map +1 -0
  37. package/dist/utils/blogUtils.d.ts +19 -0
  38. package/dist/utils/blogUtils.d.ts.map +1 -0
  39. package/dist/utils/blogUtils.js +118 -0
  40. package/dist/utils/blogUtils.js.map +1 -0
  41. package/dist/utils/dateTimeUtils.d.ts +38 -0
  42. package/dist/utils/dateTimeUtils.d.ts.map +1 -0
  43. package/dist/utils/dateTimeUtils.js +207 -0
  44. package/dist/utils/dateTimeUtils.js.map +1 -0
  45. package/dist/utils/entityUtils.d.ts +5 -0
  46. package/dist/utils/entityUtils.d.ts.map +1 -0
  47. package/dist/utils/entityUtils.js +5 -0
  48. package/dist/utils/entityUtils.js.map +1 -0
  49. package/dist/utils/generalDateTimeUtils.d.ts +15 -0
  50. package/dist/utils/generalDateTimeUtils.d.ts.map +1 -0
  51. package/dist/utils/generalDateTimeUtils.js +38 -0
  52. package/dist/utils/generalDateTimeUtils.js.map +1 -0
  53. package/dist/utils/luxonUtils.d.ts +95 -0
  54. package/dist/utils/luxonUtils.d.ts.map +1 -0
  55. package/dist/utils/luxonUtils.js +623 -0
  56. package/dist/utils/luxonUtils.js.map +1 -0
  57. package/dist/utils/mathUtils.d.ts +2 -0
  58. package/dist/utils/mathUtils.d.ts.map +1 -0
  59. package/dist/utils/mathUtils.js +4 -0
  60. package/dist/utils/mathUtils.js.map +1 -0
  61. package/dist/utils/objUtils.d.ts +3 -0
  62. package/dist/utils/objUtils.d.ts.map +1 -0
  63. package/dist/utils/objUtils.js +29 -0
  64. package/dist/utils/objUtils.js.map +1 -0
  65. package/dist/utils/paymentUtils.d.ts +18 -0
  66. package/dist/utils/paymentUtils.d.ts.map +1 -0
  67. package/dist/utils/paymentUtils.js +50 -0
  68. package/dist/utils/paymentUtils.js.map +1 -0
  69. package/dist/utils/promoCodesUtils.d.ts +6 -0
  70. package/dist/utils/promoCodesUtils.d.ts.map +1 -0
  71. package/dist/utils/promoCodesUtils.js +23 -0
  72. package/dist/utils/promoCodesUtils.js.map +1 -0
  73. package/dist/utils/qrCodeUtils.d.ts +4 -0
  74. package/dist/utils/qrCodeUtils.d.ts.map +1 -0
  75. package/dist/utils/qrCodeUtils.js +22 -0
  76. package/dist/utils/qrCodeUtils.js.map +1 -0
  77. package/dist/utils/recurrenceUtils.d.ts +8 -0
  78. package/dist/utils/recurrenceUtils.d.ts.map +1 -0
  79. package/dist/utils/recurrenceUtils.js +153 -0
  80. package/dist/utils/recurrenceUtils.js.map +1 -0
  81. package/dist/utils/reviewUtils.d.ts +29 -0
  82. package/dist/utils/reviewUtils.d.ts.map +1 -0
  83. package/dist/utils/reviewUtils.js +65 -0
  84. package/dist/utils/reviewUtils.js.map +1 -0
  85. package/dist/utils/service/apiServiceBookingApiUtils.d.ts +21 -0
  86. package/dist/utils/service/apiServiceBookingApiUtils.d.ts.map +1 -0
  87. package/dist/utils/service/apiServiceBookingApiUtils.js +131 -0
  88. package/dist/utils/service/apiServiceBookingApiUtils.js.map +1 -0
  89. package/dist/utils/service/attendeeOptionUtils.d.ts +11 -0
  90. package/dist/utils/service/attendeeOptionUtils.d.ts.map +1 -0
  91. package/dist/utils/service/attendeeOptionUtils.js +9 -0
  92. package/dist/utils/service/attendeeOptionUtils.js.map +1 -0
  93. package/dist/utils/service/frontendServiceBookingUtils.d.ts +53 -0
  94. package/dist/utils/service/frontendServiceBookingUtils.d.ts.map +1 -0
  95. package/dist/utils/service/frontendServiceBookingUtils.js +134 -0
  96. package/dist/utils/service/frontendServiceBookingUtils.js.map +1 -0
  97. package/dist/utils/service/regexUtils.d.ts +6 -0
  98. package/dist/utils/service/regexUtils.d.ts.map +1 -0
  99. package/dist/utils/service/regexUtils.js +16 -0
  100. package/dist/utils/service/regexUtils.js.map +1 -0
  101. package/dist/utils/service/serviceBookingStatusUtils.d.ts +21 -0
  102. package/dist/utils/service/serviceBookingStatusUtils.d.ts.map +1 -0
  103. package/dist/utils/service/serviceBookingStatusUtils.js +130 -0
  104. package/dist/utils/service/serviceBookingStatusUtils.js.map +1 -0
  105. package/dist/utils/service/serviceBookingTypes.d.ts +19 -0
  106. package/dist/utils/service/serviceBookingTypes.d.ts.map +1 -0
  107. package/dist/utils/service/serviceBookingTypes.js +2 -0
  108. package/dist/utils/service/serviceBookingTypes.js.map +1 -0
  109. package/dist/utils/service/serviceDBUtils.d.ts +5 -0
  110. package/dist/utils/service/serviceDBUtils.d.ts.map +1 -0
  111. package/dist/utils/service/serviceDBUtils.js +48 -0
  112. package/dist/utils/service/serviceDBUtils.js.map +1 -0
  113. package/dist/utils/service/serviceRateDBUtils.d.ts +1 -0
  114. package/dist/utils/service/serviceRateDBUtils.d.ts.map +1 -0
  115. package/dist/utils/service/serviceRateDBUtils.js +159 -0
  116. package/dist/utils/service/serviceRateDBUtils.js.map +1 -0
  117. package/dist/utils/service/serviceRateTypes.d.ts +9 -0
  118. package/dist/utils/service/serviceRateTypes.d.ts.map +1 -0
  119. package/dist/utils/service/serviceRateTypes.js +2 -0
  120. package/dist/utils/service/serviceRateTypes.js.map +1 -0
  121. package/dist/utils/service/serviceRateUtils.d.ts +24 -0
  122. package/dist/utils/service/serviceRateUtils.d.ts.map +1 -0
  123. package/dist/utils/service/serviceRateUtils.js +183 -0
  124. package/dist/utils/service/serviceRateUtils.js.map +1 -0
  125. package/dist/utils/service/serviceUtils.d.ts +83 -0
  126. package/dist/utils/service/serviceUtils.d.ts.map +1 -0
  127. package/dist/utils/service/serviceUtils.js +311 -0
  128. package/dist/utils/service/serviceUtils.js.map +1 -0
  129. package/dist/utils/service/venueUtils.d.ts +13 -0
  130. package/dist/utils/service/venueUtils.d.ts.map +1 -0
  131. package/dist/utils/service/venueUtils.js +18 -0
  132. package/dist/utils/service/venueUtils.js.map +1 -0
  133. package/dist/utils/slugUtils.d.ts +9 -0
  134. package/dist/utils/slugUtils.d.ts.map +1 -0
  135. package/dist/utils/slugUtils.js +47 -0
  136. package/dist/utils/slugUtils.js.map +1 -0
  137. package/dist/utils/sortUtils.d.ts +7 -0
  138. package/dist/utils/sortUtils.d.ts.map +1 -0
  139. package/dist/utils/sortUtils.js +26 -0
  140. package/dist/utils/sortUtils.js.map +1 -0
  141. package/dist/utils/stringUtils.d.ts +2 -0
  142. package/dist/utils/stringUtils.d.ts.map +1 -0
  143. package/dist/utils/stringUtils.js +6 -0
  144. package/dist/utils/stringUtils.js.map +1 -0
  145. package/dist/utils/stripeAccountUtils.d.ts +3 -0
  146. package/dist/utils/stripeAccountUtils.d.ts.map +1 -0
  147. package/dist/utils/stripeAccountUtils.js +10 -0
  148. package/dist/utils/stripeAccountUtils.js.map +1 -0
  149. package/dist/utils/ticketListUtils.d.ts +12 -0
  150. package/dist/utils/ticketListUtils.d.ts.map +1 -0
  151. package/dist/utils/ticketListUtils.js +78 -0
  152. package/dist/utils/ticketListUtils.js.map +1 -0
  153. package/dist/utils/typeUtils.d.ts +11 -0
  154. package/dist/utils/typeUtils.d.ts.map +1 -0
  155. package/dist/utils/typeUtils.js +8 -0
  156. package/dist/utils/typeUtils.js.map +1 -0
  157. package/dist/utils/urlUtils.d.ts +10 -0
  158. package/dist/utils/urlUtils.d.ts.map +1 -0
  159. package/dist/utils/urlUtils.js +66 -0
  160. package/dist/utils/urlUtils.js.map +1 -0
  161. package/dist/utils/userPromoCodeUtils.d.ts +21 -0
  162. package/dist/utils/userPromoCodeUtils.d.ts.map +1 -0
  163. package/dist/utils/userPromoCodeUtils.js +13 -0
  164. package/dist/utils/userPromoCodeUtils.js.map +1 -0
  165. package/dist/utils/userSubscriptionUtils.d.ts +36 -0
  166. package/dist/utils/userSubscriptionUtils.d.ts.map +1 -0
  167. package/dist/utils/userSubscriptionUtils.js +56 -0
  168. package/dist/utils/userSubscriptionUtils.js.map +1 -0
  169. package/dist/utils/userUtils.d.ts +2 -0
  170. package/dist/utils/userUtils.d.ts.map +1 -0
  171. package/dist/utils/userUtils.js +2 -0
  172. package/dist/utils/userUtils.js.map +1 -0
  173. package/package.json +5 -3
  174. package/prisma/schema.prisma +117 -0
  175. package/src/definitions.ts +52 -1
  176. package/src/extendedSchemas.ts +177 -6
  177. package/src/index.ts +32 -21
  178. package/src/utils/blog/blogDbUtils.ts +343 -0
  179. package/src/utils/blogUtils.ts +134 -0
  180. package/src/utils/qrCodeUtils.ts +4 -2
  181. package/src/utils/service/apiServiceBookingApiUtils.ts +0 -0
  182. package/src/utils/slugUtils.ts +60 -0
  183. package/src/utils/ticketListUtils.ts +24 -6
  184. package/src/utils/typeUtils.ts +0 -0
@@ -0,0 +1,134 @@
1
+ import { generateSlug } from './slugUtils';
2
+ import { BLOG_DETAIL_URL, BLOG_EXCERPT_LENGTH, DEFAULT_BLOG_IMAGE, SITE_NAME } from '../definitions';
3
+
4
+ // Blog URL generation
5
+ export function generateBlogDetailUrl(blogId: string, slug?: string): string {
6
+ if (slug) {
7
+ return `${BLOG_DETAIL_URL}/${blogId}-${slug}`;
8
+ }
9
+ return `${BLOG_DETAIL_URL}/${blogId}`;
10
+ }
11
+
12
+ export function getBlogDetailUrl(blogId: string, slug?: string, title?: string): string {
13
+ if (slug) {
14
+ return generateBlogDetailUrl(blogId, slug);
15
+ } else if (title) {
16
+ // Generate a temporary slug from title for URLs (not saved to DB)
17
+ const tempSlug = generateSlug(title);
18
+ return generateBlogDetailUrl(blogId, tempSlug);
19
+ } else {
20
+ // Ultimate fallback - use just the ID (backward compatible)
21
+ return `${BLOG_DETAIL_URL}/${blogId}`;
22
+ }
23
+ }
24
+
25
+ // Parse blog URL parameters
26
+ export function parseBlogUrlParams(blogIdSlug: string): { id: string; slug?: string } | null {
27
+ if (!blogIdSlug) return null;
28
+
29
+ // Check if it contains a hyphen (ID-slug format)
30
+ const hyphenIndex = blogIdSlug.indexOf('-');
31
+
32
+ if (hyphenIndex === -1) {
33
+ // No hyphen found, treat as just an ID
34
+ return { id: blogIdSlug };
35
+ }
36
+
37
+ // Split at the first hyphen
38
+ const id = blogIdSlug.substring(0, hyphenIndex);
39
+ const slug = blogIdSlug.substring(hyphenIndex + 1);
40
+
41
+ return { id, slug };
42
+ }
43
+
44
+ // Content processing
45
+ export function generateExcerpt(content: string, length: number = BLOG_EXCERPT_LENGTH): string {
46
+ // Strip HTML tags
47
+ const textContent = content.replace(/<[^>]*>/g, '');
48
+
49
+ if (textContent.length <= length) {
50
+ return textContent;
51
+ }
52
+
53
+ // Find the last complete word within the length limit
54
+ const truncated = textContent.substring(0, length);
55
+ const lastSpace = truncated.lastIndexOf(' ');
56
+
57
+ return lastSpace > 0
58
+ ? truncated.substring(0, lastSpace) + '...'
59
+ : truncated + '...';
60
+ }
61
+
62
+ // Calculate estimated reading time
63
+ export function calculateReadingTime(content: string): number {
64
+ const wordsPerMinute = 200;
65
+ const textContent = content.replace(/<[^>]*>/g, '');
66
+ const wordCount = textContent.split(/\s+/).length;
67
+ return Math.ceil(wordCount / wordsPerMinute);
68
+ }
69
+
70
+ // Blog image handling
71
+ export function getBlogImageUrl(imageUrl?: string | null): string {
72
+ return imageUrl || DEFAULT_BLOG_IMAGE;
73
+ }
74
+
75
+ // SEO helpers
76
+ export function generateMetaTitle(title: string, siteName: string = 'Bash'): string {
77
+ return `${title} | ${siteName}`;
78
+ }
79
+
80
+ export function generateMetaDescription(content: string, title: string): string {
81
+ const excerpt = generateExcerpt(content, 155);
82
+ return excerpt || `Read about ${title} on ${SITE_NAME}`;
83
+ }
84
+
85
+ // Content validation
86
+ export function validateBlogContent(title: string, content: string): { isValid: boolean; errors: string[] } {
87
+ const errors: string[] = [];
88
+
89
+ if (!title || title.trim().length === 0) {
90
+ errors.push('Title is required');
91
+ } else if (title.length > 200) {
92
+ errors.push('Title must be less than 200 characters');
93
+ }
94
+
95
+ if (!content || content.trim().length === 0) {
96
+ errors.push('Content is required');
97
+ } else if (content.length < 100) {
98
+ errors.push('Content must be at least 100 characters');
99
+ }
100
+
101
+ return {
102
+ isValid: errors.length === 0,
103
+ errors
104
+ };
105
+ }
106
+
107
+ // Tag processing
108
+ export function processTags(tagString: string): string[] {
109
+ if (!tagString) return [];
110
+
111
+ return tagString
112
+ .split(',')
113
+ .map(tag => tag.trim().toLowerCase())
114
+ .filter(tag => tag.length > 0)
115
+ .slice(0, 10); // Limit to 10 tags
116
+ }
117
+
118
+ // Search helpers
119
+ export function highlightSearchTerms(text: string, searchTerm: string): string {
120
+ if (!searchTerm) return text;
121
+
122
+ const regex = new RegExp(`(${searchTerm})`, 'gi');
123
+ return text.replace(regex, '<mark>$1</mark>');
124
+ }
125
+
126
+ // Format publication date
127
+ export function formatPublishDate(date: Date | string): string {
128
+ const publishDate = typeof date === 'string' ? new Date(date) : date;
129
+ return publishDate.toLocaleDateString('en-US', {
130
+ year: 'numeric',
131
+ month: 'long',
132
+ day: 'numeric'
133
+ });
134
+ }
@@ -1,12 +1,14 @@
1
1
  import QRCode from "qrcode";
2
2
  import { TICKET_DETAILS } from "../definitions";
3
+ import { generateBashDetailUrl } from "./slugUtils";
3
4
 
4
5
  export function bashEventPrismaCheckoutQrCodeUrl(bashEventId: string | undefined | null, prismaCheckoutId: string | undefined | null): string {
5
6
  return `${TICKET_DETAILS}/${bashEventId}/${prismaCheckoutId}`;
6
7
  }
7
8
 
8
- export function bashEventQrCodeUrl(bashEventId: string | undefined | null, ticketTierId?: string | undefined | null, ticketId?: string | undefined | null): string {
9
- const baseUrl = `${TICKET_DETAILS}/${bashEventId}`;
9
+ export function bashEventQrCodeUrl(bashEventId: string | undefined | null, ticketTierId?: string | undefined | null, ticketId?: string | undefined | null, slug?: string | undefined | null): string {
10
+ const baseUrl = slug ? generateBashDetailUrl(bashEventId!, slug).replace('/bash/', '/ticket-details/') : `${TICKET_DETAILS}/${bashEventId}`;
11
+
10
12
  if (ticketId) {
11
13
  return `${baseUrl}/ticket/${ticketId}`;
12
14
  }
File without changes
@@ -0,0 +1,60 @@
1
+ import slugify from 'slugify';
2
+
3
+ export function generateSlug(title: string): string {
4
+ return slugify(title, {
5
+ lower: true,
6
+ strict: true,
7
+ remove: /[*+~.()'"!:@]/g
8
+ });
9
+ }
10
+
11
+ export async function generateUniqueSlug(
12
+ title: string,
13
+ checkSlugExists: (slug: string, excludeId?: string) => Promise<boolean>,
14
+ excludeId?: string
15
+ ): Promise<string> {
16
+ const baseSlug = generateSlug(title);
17
+ let slug = baseSlug;
18
+ let counter = 1;
19
+
20
+ while (true) {
21
+ const exists = await checkSlugExists(slug, excludeId);
22
+ if (!exists) {
23
+ return slug;
24
+ }
25
+ slug = `${baseSlug}-${counter}`;
26
+ counter++;
27
+ }
28
+ }
29
+
30
+ export function generateBashDetailUrl(bashEventId: string, slug: string): string {
31
+ return `/bash/${bashEventId}-${slug}`;
32
+ }
33
+
34
+ export function parseBashUrlParams(param: string): { id: string; slug: string | null } | null {
35
+ // Expected format: "id-slug" where id is first part before first dash
36
+ const dashIndex = param.indexOf('-');
37
+
38
+ if (dashIndex === -1) {
39
+ // Old format: just the ID
40
+ if (param && param.length > 0) {
41
+ return { id: param, slug: null };
42
+ }
43
+ return null;
44
+ }
45
+
46
+ const id = param.substring(0, dashIndex);
47
+ const slug = param.substring(dashIndex + 1);
48
+
49
+ if (!id) {
50
+ return null;
51
+ }
52
+
53
+ // New format: id-slug
54
+ return { id, slug: slug || null };
55
+ }
56
+
57
+ export function validateSlug(slug: string): boolean {
58
+ // Check if slug only contains lowercase letters, numbers, and hyphens
59
+ return /^[a-z0-9-]+$/.test(slug);
60
+ }
@@ -1,10 +1,10 @@
1
1
  import { DateTime } from "luxon";
2
2
  import {
3
- NumberOfTicketsForDate,
4
- URL_PARAMS_NUMBER_OF_TICKETS_TICKETS_DATE_DELIM,
5
- URL_PARAMS_TICKET_LIST_DELIM,
6
- URL_PARAMS_TICKET_TIER_ID_NUMBER_OF_TICKETS_DATE_DELIM,
7
- URL_PARAMS_TICKETS_DATE_DELIM
3
+ NumberOfTicketsForDate,
4
+ URL_PARAMS_NUMBER_OF_TICKETS_TICKETS_DATE_DELIM,
5
+ URL_PARAMS_TICKET_LIST_DELIM,
6
+ URL_PARAMS_TICKET_TIER_ID_NUMBER_OF_TICKETS_DATE_DELIM,
7
+ URL_PARAMS_TICKETS_DATE_DELIM
8
8
  } from "../definitions";
9
9
  import { DATETIME_FORMAT_ISO_LIKE } from "./dateTimeUtils";
10
10
 
@@ -22,8 +22,26 @@ export function ticketListToString(ticketList: Map<string, NumberOfTicketsForDat
22
22
  for (const ticketNumAndDates of ticketListArgs) {
23
23
  if (ticketNumAndDates.numberOfTickets > 0) {
24
24
  ticketsExist = true;
25
+
26
+ // Ensure ticketDateTime is in ISO format
27
+ let dateTimeStr = ticketNumAndDates.ticketDateTime;
28
+ if (dateTimeStr) {
29
+ // If it's already a string, try to parse it as DateTime and convert to ISO
30
+ const dateTime = typeof dateTimeStr === 'string'
31
+ ? DateTime.fromFormat(dateTimeStr, DATETIME_FORMAT_ISO_LIKE).isValid
32
+ ? DateTime.fromFormat(dateTimeStr, DATETIME_FORMAT_ISO_LIKE)
33
+ : DateTime.fromISO(dateTimeStr).isValid
34
+ ? DateTime.fromISO(dateTimeStr)
35
+ : DateTime.fromJSDate(new Date(dateTimeStr))
36
+ : DateTime.fromJSDate(dateTimeStr as any);
37
+
38
+ if (dateTime.isValid) {
39
+ dateTimeStr = dateTime.toISO() || dateTimeStr;
40
+ }
41
+ }
42
+
25
43
  ticketArgs.push(
26
- `${ticketNumAndDates.numberOfTickets}${URL_PARAMS_TICKETS_DATE_DELIM}${ticketNumAndDates.ticketDateTime}`);
44
+ `${ticketNumAndDates.numberOfTickets}${URL_PARAMS_TICKETS_DATE_DELIM}${dateTimeStr}`);
27
45
  }
28
46
  else {
29
47
  ticketsExist = false;
File without changes