@bash-app/bash-common 30.50.1 → 30.52.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/README.md +0 -0
- package/dist/definitions.d.ts +668 -0
- package/dist/definitions.d.ts.map +1 -0
- package/dist/definitions.js +467 -0
- package/dist/definitions.js.map +1 -0
- package/dist/extendedSchemas.d.ts +2206 -0
- package/dist/extendedSchemas.d.ts.map +1 -0
- package/dist/extendedSchemas.js +429 -0
- package/dist/extendedSchemas.js.map +1 -0
- package/dist/index.d.ts +39 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +40 -0
- package/dist/index.js.map +1 -0
- package/dist/utils/addressUtils.d.ts +14 -0
- package/dist/utils/addressUtils.d.ts.map +1 -0
- package/dist/utils/addressUtils.js +177 -0
- package/dist/utils/addressUtils.js.map +1 -0
- package/dist/utils/apiUtils.d.ts +14 -0
- package/dist/utils/apiUtils.d.ts.map +1 -0
- package/dist/utils/apiUtils.js +61 -0
- package/dist/utils/apiUtils.js.map +1 -0
- package/dist/utils/arrayUtils.d.ts +2 -0
- package/dist/utils/arrayUtils.d.ts.map +1 -0
- package/dist/utils/arrayUtils.js +5 -0
- package/dist/utils/arrayUtils.js.map +1 -0
- package/dist/utils/awsS3Utils.d.ts +10 -0
- package/dist/utils/awsS3Utils.d.ts.map +1 -0
- package/dist/utils/awsS3Utils.js +89 -0
- package/dist/utils/awsS3Utils.js.map +1 -0
- package/dist/utils/badgeUtils.d.ts +33 -0
- package/dist/utils/badgeUtils.d.ts.map +1 -0
- package/dist/utils/badgeUtils.js +57 -0
- package/dist/utils/badgeUtils.js.map +1 -0
- package/dist/utils/blog/blogDbUtils.d.ts +48 -0
- package/dist/utils/blog/blogDbUtils.d.ts.map +1 -0
- package/dist/utils/blog/blogDbUtils.js +218 -0
- package/dist/utils/blog/blogDbUtils.js.map +1 -0
- package/dist/utils/blogUtils.d.ts +19 -0
- package/dist/utils/blogUtils.d.ts.map +1 -0
- package/dist/utils/blogUtils.js +118 -0
- package/dist/utils/blogUtils.js.map +1 -0
- package/dist/utils/dateTimeUtils.d.ts +38 -0
- package/dist/utils/dateTimeUtils.d.ts.map +1 -0
- package/dist/utils/dateTimeUtils.js +207 -0
- package/dist/utils/dateTimeUtils.js.map +1 -0
- package/dist/utils/entityUtils.d.ts +5 -0
- package/dist/utils/entityUtils.d.ts.map +1 -0
- package/dist/utils/entityUtils.js +5 -0
- package/dist/utils/entityUtils.js.map +1 -0
- package/dist/utils/generalDateTimeUtils.d.ts +15 -0
- package/dist/utils/generalDateTimeUtils.d.ts.map +1 -0
- package/dist/utils/generalDateTimeUtils.js +38 -0
- package/dist/utils/generalDateTimeUtils.js.map +1 -0
- package/dist/utils/luxonUtils.d.ts +95 -0
- package/dist/utils/luxonUtils.d.ts.map +1 -0
- package/dist/utils/luxonUtils.js +623 -0
- package/dist/utils/luxonUtils.js.map +1 -0
- package/dist/utils/mathUtils.d.ts +2 -0
- package/dist/utils/mathUtils.d.ts.map +1 -0
- package/dist/utils/mathUtils.js +4 -0
- package/dist/utils/mathUtils.js.map +1 -0
- package/dist/utils/objUtils.d.ts +3 -0
- package/dist/utils/objUtils.d.ts.map +1 -0
- package/dist/utils/objUtils.js +29 -0
- package/dist/utils/objUtils.js.map +1 -0
- package/dist/utils/paymentUtils.d.ts +18 -0
- package/dist/utils/paymentUtils.d.ts.map +1 -0
- package/dist/utils/paymentUtils.js +50 -0
- package/dist/utils/paymentUtils.js.map +1 -0
- package/dist/utils/promoCodesUtils.d.ts +6 -0
- package/dist/utils/promoCodesUtils.d.ts.map +1 -0
- package/dist/utils/promoCodesUtils.js +23 -0
- package/dist/utils/promoCodesUtils.js.map +1 -0
- package/dist/utils/qrCodeUtils.d.ts +4 -0
- package/dist/utils/qrCodeUtils.d.ts.map +1 -0
- package/dist/utils/qrCodeUtils.js +22 -0
- package/dist/utils/qrCodeUtils.js.map +1 -0
- package/dist/utils/recurrenceUtils.d.ts +8 -0
- package/dist/utils/recurrenceUtils.d.ts.map +1 -0
- package/dist/utils/recurrenceUtils.js +153 -0
- package/dist/utils/recurrenceUtils.js.map +1 -0
- package/dist/utils/reviewUtils.d.ts +29 -0
- package/dist/utils/reviewUtils.d.ts.map +1 -0
- package/dist/utils/reviewUtils.js +65 -0
- package/dist/utils/reviewUtils.js.map +1 -0
- package/dist/utils/service/apiServiceBookingApiUtils.d.ts +21 -0
- package/dist/utils/service/apiServiceBookingApiUtils.d.ts.map +1 -0
- package/dist/utils/service/apiServiceBookingApiUtils.js +131 -0
- package/dist/utils/service/apiServiceBookingApiUtils.js.map +1 -0
- package/dist/utils/service/attendeeOptionUtils.d.ts +11 -0
- package/dist/utils/service/attendeeOptionUtils.d.ts.map +1 -0
- package/dist/utils/service/attendeeOptionUtils.js +9 -0
- package/dist/utils/service/attendeeOptionUtils.js.map +1 -0
- package/dist/utils/service/frontendServiceBookingUtils.d.ts +53 -0
- package/dist/utils/service/frontendServiceBookingUtils.d.ts.map +1 -0
- package/dist/utils/service/frontendServiceBookingUtils.js +134 -0
- package/dist/utils/service/frontendServiceBookingUtils.js.map +1 -0
- package/dist/utils/service/regexUtils.d.ts +6 -0
- package/dist/utils/service/regexUtils.d.ts.map +1 -0
- package/dist/utils/service/regexUtils.js +16 -0
- package/dist/utils/service/regexUtils.js.map +1 -0
- package/dist/utils/service/serviceBookingStatusUtils.d.ts +21 -0
- package/dist/utils/service/serviceBookingStatusUtils.d.ts.map +1 -0
- package/dist/utils/service/serviceBookingStatusUtils.js +130 -0
- package/dist/utils/service/serviceBookingStatusUtils.js.map +1 -0
- package/dist/utils/service/serviceBookingTypes.d.ts +19 -0
- package/dist/utils/service/serviceBookingTypes.d.ts.map +1 -0
- package/dist/utils/service/serviceBookingTypes.js +2 -0
- package/dist/utils/service/serviceBookingTypes.js.map +1 -0
- package/dist/utils/service/serviceDBUtils.d.ts +5 -0
- package/dist/utils/service/serviceDBUtils.d.ts.map +1 -0
- package/dist/utils/service/serviceDBUtils.js +48 -0
- package/dist/utils/service/serviceDBUtils.js.map +1 -0
- package/dist/utils/service/serviceRateDBUtils.d.ts +1 -0
- package/dist/utils/service/serviceRateDBUtils.d.ts.map +1 -0
- package/dist/utils/service/serviceRateDBUtils.js +159 -0
- package/dist/utils/service/serviceRateDBUtils.js.map +1 -0
- package/dist/utils/service/serviceRateTypes.d.ts +9 -0
- package/dist/utils/service/serviceRateTypes.d.ts.map +1 -0
- package/dist/utils/service/serviceRateTypes.js +2 -0
- package/dist/utils/service/serviceRateTypes.js.map +1 -0
- package/dist/utils/service/serviceRateUtils.d.ts +24 -0
- package/dist/utils/service/serviceRateUtils.d.ts.map +1 -0
- package/dist/utils/service/serviceRateUtils.js +183 -0
- package/dist/utils/service/serviceRateUtils.js.map +1 -0
- package/dist/utils/service/serviceUtils.d.ts +83 -0
- package/dist/utils/service/serviceUtils.d.ts.map +1 -0
- package/dist/utils/service/serviceUtils.js +311 -0
- package/dist/utils/service/serviceUtils.js.map +1 -0
- package/dist/utils/service/venueUtils.d.ts +13 -0
- package/dist/utils/service/venueUtils.d.ts.map +1 -0
- package/dist/utils/service/venueUtils.js +18 -0
- package/dist/utils/service/venueUtils.js.map +1 -0
- package/dist/utils/slugUtils.d.ts +9 -0
- package/dist/utils/slugUtils.d.ts.map +1 -0
- package/dist/utils/slugUtils.js +47 -0
- package/dist/utils/slugUtils.js.map +1 -0
- package/dist/utils/sortUtils.d.ts +7 -0
- package/dist/utils/sortUtils.d.ts.map +1 -0
- package/dist/utils/sortUtils.js +26 -0
- package/dist/utils/sortUtils.js.map +1 -0
- package/dist/utils/stringUtils.d.ts +2 -0
- package/dist/utils/stringUtils.d.ts.map +1 -0
- package/dist/utils/stringUtils.js +6 -0
- package/dist/utils/stringUtils.js.map +1 -0
- package/dist/utils/stripeAccountUtils.d.ts +3 -0
- package/dist/utils/stripeAccountUtils.d.ts.map +1 -0
- package/dist/utils/stripeAccountUtils.js +10 -0
- package/dist/utils/stripeAccountUtils.js.map +1 -0
- package/dist/utils/ticketListUtils.d.ts +12 -0
- package/dist/utils/ticketListUtils.d.ts.map +1 -0
- package/dist/utils/ticketListUtils.js +78 -0
- package/dist/utils/ticketListUtils.js.map +1 -0
- package/dist/utils/typeUtils.d.ts +11 -0
- package/dist/utils/typeUtils.d.ts.map +1 -0
- package/dist/utils/typeUtils.js +8 -0
- package/dist/utils/typeUtils.js.map +1 -0
- package/dist/utils/urlUtils.d.ts +10 -0
- package/dist/utils/urlUtils.d.ts.map +1 -0
- package/dist/utils/urlUtils.js +66 -0
- package/dist/utils/urlUtils.js.map +1 -0
- package/dist/utils/userPromoCodeUtils.d.ts +21 -0
- package/dist/utils/userPromoCodeUtils.d.ts.map +1 -0
- package/dist/utils/userPromoCodeUtils.js +13 -0
- package/dist/utils/userPromoCodeUtils.js.map +1 -0
- package/dist/utils/userSubscriptionUtils.d.ts +36 -0
- package/dist/utils/userSubscriptionUtils.d.ts.map +1 -0
- package/dist/utils/userSubscriptionUtils.js +56 -0
- package/dist/utils/userSubscriptionUtils.js.map +1 -0
- package/dist/utils/userUtils.d.ts +2 -0
- package/dist/utils/userUtils.d.ts.map +1 -0
- package/dist/utils/userUtils.js +2 -0
- package/dist/utils/userUtils.js.map +1 -0
- package/package.json +4 -2
- package/prisma/schema.prisma +247 -94
- package/src/definitions.ts +52 -1
- package/src/extendedSchemas.ts +180 -13
- package/src/index.ts +32 -21
- package/src/utils/apiUtils.ts +0 -0
- package/src/utils/arrayUtils.ts +0 -0
- package/src/utils/awsS3Utils.ts +0 -0
- package/src/utils/blog/blogDbUtils.ts +343 -0
- package/src/utils/blogUtils.ts +134 -0
- package/src/utils/entityUtils.ts +0 -0
- package/src/utils/generalDateTimeUtils.ts +0 -0
- package/src/utils/mathUtils.ts +0 -0
- package/src/utils/objUtils.ts +0 -0
- package/src/utils/paymentUtils.ts +0 -0
- package/src/utils/promoCodesUtils.ts +0 -0
- package/src/utils/qrCodeUtils.ts +4 -2
- package/src/utils/service/attendeeOptionUtils.ts +0 -0
- package/src/utils/service/regexUtils.ts +0 -0
- package/src/utils/service/serviceBookingStatusUtils.ts +6 -18
- package/src/utils/service/serviceDBUtils.ts +0 -0
- package/src/utils/service/serviceRateDBUtils.ts +0 -0
- package/src/utils/service/serviceUtils.ts +0 -0
- package/src/utils/service/venueUtils.ts +0 -0
- package/src/utils/slugUtils.ts +60 -0
- package/src/utils/sortUtils.ts +0 -0
- package/src/utils/stringUtils.ts +0 -0
- package/src/utils/stripeAccountUtils.ts +0 -0
- package/src/utils/ticketListUtils.ts +24 -6
- package/src/utils/urlUtils.ts +0 -0
- package/src/utils/userPromoCodeUtils.ts +0 -0
- package/src/utils/userSubscriptionUtils.ts +0 -0
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
import { BlogStatus } from '@prisma/client';
|
|
2
|
+
import { generateSlug, generateUniqueSlug } from '../slugUtils';
|
|
3
|
+
import { generateExcerpt, calculateReadingTime } from '../blogUtils';
|
|
4
|
+
import { BLOG_POST_DATA_TO_INCLUDE, BLOG_POST_PREVIEW_DATA_TO_INCLUDE } from '../../extendedSchemas';
|
|
5
|
+
// Blog slug utilities
|
|
6
|
+
export async function checkBlogSlugExists(prisma, slug, excludeId) {
|
|
7
|
+
const existingPost = await prisma.blogPost.findFirst({
|
|
8
|
+
where: {
|
|
9
|
+
slug,
|
|
10
|
+
...(excludeId && { id: { not: excludeId } }),
|
|
11
|
+
},
|
|
12
|
+
});
|
|
13
|
+
return !!existingPost;
|
|
14
|
+
}
|
|
15
|
+
export async function generateUniqueBlogSlug(prisma, title, excludeId) {
|
|
16
|
+
return generateUniqueSlug(title, (slug, excludeId) => checkBlogSlugExists(prisma, slug, excludeId), excludeId);
|
|
17
|
+
}
|
|
18
|
+
// Blog CRUD operations
|
|
19
|
+
export async function createBlogPost(prisma, data) {
|
|
20
|
+
const slug = await generateUniqueBlogSlug(prisma, data.title);
|
|
21
|
+
const excerpt = data.excerpt || generateExcerpt(data.content);
|
|
22
|
+
const readTime = calculateReadingTime(data.content);
|
|
23
|
+
// Handle tags
|
|
24
|
+
const tagConnections = data.tags ? await connectOrCreateTags(prisma, data.tags) : [];
|
|
25
|
+
const blogPost = await prisma.blogPost.create({
|
|
26
|
+
data: {
|
|
27
|
+
title: data.title,
|
|
28
|
+
slug,
|
|
29
|
+
content: data.content,
|
|
30
|
+
excerpt,
|
|
31
|
+
readTime,
|
|
32
|
+
authorId: data.authorId,
|
|
33
|
+
coverImage: data.coverImage,
|
|
34
|
+
categoryId: data.categoryId,
|
|
35
|
+
metaTitle: data.metaTitle,
|
|
36
|
+
metaDescription: data.metaDescription,
|
|
37
|
+
metaKeywords: data.metaKeywords || [],
|
|
38
|
+
status: data.status || BlogStatus.Draft,
|
|
39
|
+
publishedAt: data.status === BlogStatus.Published ? (data.publishedAt || new Date()) : data.publishedAt,
|
|
40
|
+
scheduledFor: data.scheduledFor,
|
|
41
|
+
tags: {
|
|
42
|
+
connect: tagConnections,
|
|
43
|
+
},
|
|
44
|
+
},
|
|
45
|
+
include: BLOG_POST_DATA_TO_INCLUDE,
|
|
46
|
+
});
|
|
47
|
+
return blogPost;
|
|
48
|
+
}
|
|
49
|
+
export async function updateBlogPost(prisma, id, data) {
|
|
50
|
+
const updateData = { ...data };
|
|
51
|
+
// Generate new slug if title changed
|
|
52
|
+
if (data.title) {
|
|
53
|
+
updateData.slug = await generateUniqueBlogSlug(prisma, data.title, id);
|
|
54
|
+
}
|
|
55
|
+
// Update excerpt if content changed
|
|
56
|
+
if (data.content) {
|
|
57
|
+
updateData.excerpt = data.excerpt || generateExcerpt(data.content);
|
|
58
|
+
updateData.readTime = calculateReadingTime(data.content);
|
|
59
|
+
}
|
|
60
|
+
// Handle publishing
|
|
61
|
+
if (data.status === BlogStatus.Published && !data.publishedAt) {
|
|
62
|
+
updateData.publishedAt = new Date();
|
|
63
|
+
}
|
|
64
|
+
// Handle tags
|
|
65
|
+
if (data.tags) {
|
|
66
|
+
const tagConnections = await connectOrCreateTags(prisma, data.tags);
|
|
67
|
+
updateData.tags = {
|
|
68
|
+
set: tagConnections,
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
const blogPost = await prisma.blogPost.update({
|
|
72
|
+
where: { id },
|
|
73
|
+
data: updateData,
|
|
74
|
+
include: BLOG_POST_DATA_TO_INCLUDE,
|
|
75
|
+
});
|
|
76
|
+
return blogPost;
|
|
77
|
+
}
|
|
78
|
+
export async function getBlogPost(prisma, id, includeComments = true) {
|
|
79
|
+
const blogPost = await prisma.blogPost.findUnique({
|
|
80
|
+
where: { id },
|
|
81
|
+
include: includeComments ? BLOG_POST_DATA_TO_INCLUDE : BLOG_POST_PREVIEW_DATA_TO_INCLUDE,
|
|
82
|
+
});
|
|
83
|
+
return blogPost;
|
|
84
|
+
}
|
|
85
|
+
export async function getBlogPostBySlug(prisma, slug, includeComments = true) {
|
|
86
|
+
const blogPost = await prisma.blogPost.findUnique({
|
|
87
|
+
where: { slug },
|
|
88
|
+
include: includeComments ? BLOG_POST_DATA_TO_INCLUDE : BLOG_POST_PREVIEW_DATA_TO_INCLUDE,
|
|
89
|
+
});
|
|
90
|
+
return blogPost;
|
|
91
|
+
}
|
|
92
|
+
export async function searchBlogPosts(prisma, params) {
|
|
93
|
+
const { query, category, tag, author, status = BlogStatus.Published, page = 1, limit = 12, sortBy = 'publishedAt', sortOrder = 'desc', } = params;
|
|
94
|
+
const skip = (page - 1) * limit;
|
|
95
|
+
// Build where clause
|
|
96
|
+
const where = {
|
|
97
|
+
status,
|
|
98
|
+
};
|
|
99
|
+
if (query) {
|
|
100
|
+
where.OR = [
|
|
101
|
+
{ title: { contains: query, mode: 'insensitive' } },
|
|
102
|
+
{ excerpt: { contains: query, mode: 'insensitive' } },
|
|
103
|
+
{ content: { contains: query, mode: 'insensitive' } },
|
|
104
|
+
];
|
|
105
|
+
}
|
|
106
|
+
if (category) {
|
|
107
|
+
where.category = { slug: category };
|
|
108
|
+
}
|
|
109
|
+
if (tag) {
|
|
110
|
+
where.tags = { some: { slug: tag } };
|
|
111
|
+
}
|
|
112
|
+
if (author) {
|
|
113
|
+
where.author = { username: author };
|
|
114
|
+
}
|
|
115
|
+
// Get posts
|
|
116
|
+
const posts = await prisma.blogPost.findMany({
|
|
117
|
+
where,
|
|
118
|
+
include: BLOG_POST_PREVIEW_DATA_TO_INCLUDE,
|
|
119
|
+
orderBy: { [sortBy]: sortOrder },
|
|
120
|
+
skip,
|
|
121
|
+
take: limit,
|
|
122
|
+
});
|
|
123
|
+
// Get total count
|
|
124
|
+
const totalCount = await prisma.blogPost.count({ where });
|
|
125
|
+
// Get categories and tags for filters
|
|
126
|
+
const [categories, tags] = await Promise.all([
|
|
127
|
+
prisma.blogCategory.findMany({
|
|
128
|
+
include: {
|
|
129
|
+
_count: {
|
|
130
|
+
select: {
|
|
131
|
+
posts: {
|
|
132
|
+
where: { status: BlogStatus.Published },
|
|
133
|
+
},
|
|
134
|
+
},
|
|
135
|
+
},
|
|
136
|
+
},
|
|
137
|
+
orderBy: { name: 'asc' },
|
|
138
|
+
}),
|
|
139
|
+
prisma.blogTag.findMany({
|
|
140
|
+
include: {
|
|
141
|
+
_count: {
|
|
142
|
+
select: {
|
|
143
|
+
posts: {
|
|
144
|
+
where: { status: BlogStatus.Published },
|
|
145
|
+
},
|
|
146
|
+
},
|
|
147
|
+
},
|
|
148
|
+
},
|
|
149
|
+
orderBy: { name: 'asc' },
|
|
150
|
+
}),
|
|
151
|
+
]);
|
|
152
|
+
return {
|
|
153
|
+
posts: posts,
|
|
154
|
+
totalCount,
|
|
155
|
+
totalPages: Math.ceil(totalCount / limit),
|
|
156
|
+
currentPage: page,
|
|
157
|
+
categories,
|
|
158
|
+
tags,
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
export async function incrementBlogPostViews(prisma, id) {
|
|
162
|
+
await prisma.blogPost.update({
|
|
163
|
+
where: { id },
|
|
164
|
+
data: {
|
|
165
|
+
viewCount: {
|
|
166
|
+
increment: 1,
|
|
167
|
+
},
|
|
168
|
+
},
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
// Category utilities
|
|
172
|
+
export async function createBlogCategory(prisma, data) {
|
|
173
|
+
const slug = generateSlug(data.name);
|
|
174
|
+
return prisma.blogCategory.create({
|
|
175
|
+
data: {
|
|
176
|
+
name: data.name,
|
|
177
|
+
slug,
|
|
178
|
+
description: data.description,
|
|
179
|
+
color: data.color,
|
|
180
|
+
},
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
// Tag utilities
|
|
184
|
+
export async function connectOrCreateTags(prisma, tagNames) {
|
|
185
|
+
const connections = [];
|
|
186
|
+
for (const tagName of tagNames) {
|
|
187
|
+
const slug = generateSlug(tagName);
|
|
188
|
+
const tag = await prisma.blogTag.upsert({
|
|
189
|
+
where: { slug },
|
|
190
|
+
update: {},
|
|
191
|
+
create: {
|
|
192
|
+
name: tagName,
|
|
193
|
+
slug,
|
|
194
|
+
},
|
|
195
|
+
});
|
|
196
|
+
connections.push({ id: tag.id });
|
|
197
|
+
}
|
|
198
|
+
return connections;
|
|
199
|
+
}
|
|
200
|
+
export async function getPopularBlogPosts(prisma, limit = 5) {
|
|
201
|
+
const posts = await prisma.blogPost.findMany({
|
|
202
|
+
where: { status: BlogStatus.Published },
|
|
203
|
+
include: BLOG_POST_PREVIEW_DATA_TO_INCLUDE,
|
|
204
|
+
orderBy: { viewCount: 'desc' },
|
|
205
|
+
take: limit,
|
|
206
|
+
});
|
|
207
|
+
return posts;
|
|
208
|
+
}
|
|
209
|
+
export async function getRecentBlogPosts(prisma, limit = 5) {
|
|
210
|
+
const posts = await prisma.blogPost.findMany({
|
|
211
|
+
where: { status: BlogStatus.Published },
|
|
212
|
+
include: BLOG_POST_PREVIEW_DATA_TO_INCLUDE,
|
|
213
|
+
orderBy: { publishedAt: 'desc' },
|
|
214
|
+
take: limit,
|
|
215
|
+
});
|
|
216
|
+
return posts;
|
|
217
|
+
}
|
|
218
|
+
//# sourceMappingURL=blogDbUtils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"blogDbUtils.js","sourceRoot":"","sources":["../../../src/utils/blog/blogDbUtils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export declare function generateBlogDetailUrl(blogId: string, slug?: string): string;
|
|
2
|
+
export declare function getBlogDetailUrl(blogId: string, slug?: string, title?: string): string;
|
|
3
|
+
export declare function parseBlogUrlParams(blogIdSlug: string): {
|
|
4
|
+
id: string;
|
|
5
|
+
slug?: string;
|
|
6
|
+
} | null;
|
|
7
|
+
export declare function generateExcerpt(content: string, length?: number): string;
|
|
8
|
+
export declare function calculateReadingTime(content: string): number;
|
|
9
|
+
export declare function getBlogImageUrl(imageUrl?: string | null): string;
|
|
10
|
+
export declare function generateMetaTitle(title: string, siteName?: string): string;
|
|
11
|
+
export declare function generateMetaDescription(content: string, title: string): string;
|
|
12
|
+
export declare function validateBlogContent(title: string, content: string): {
|
|
13
|
+
isValid: boolean;
|
|
14
|
+
errors: string[];
|
|
15
|
+
};
|
|
16
|
+
export declare function processTags(tagString: string): string[];
|
|
17
|
+
export declare function highlightSearchTerms(text: string, searchTerm: string): string;
|
|
18
|
+
export declare function formatPublishDate(date: Date | string): string;
|
|
19
|
+
//# sourceMappingURL=blogUtils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"blogUtils.d.ts","sourceRoot":"","sources":["../../src/utils/blogUtils.ts"],"names":[],"mappings":"AAIA,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAK3E;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAWtF;AAGD,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAgB3F;AAGD,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,GAAE,MAA4B,GAAG,MAAM,CAe7F;AAGD,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAK5D;AAGD,wBAAgB,eAAe,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAEhE;AAGD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAe,GAAG,MAAM,CAElF;AAED,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAG9E;AAGD,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,CAmB1G;AAGD,wBAAgB,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE,CAQvD;AAGD,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAK7E;AAGD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,GAAG,MAAM,CAO7D"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { generateSlug } from './slugUtils';
|
|
2
|
+
import { BLOG_DETAIL_URL, BLOG_EXCERPT_LENGTH, DEFAULT_BLOG_IMAGE, SITE_NAME } from '../definitions';
|
|
3
|
+
// Blog URL generation
|
|
4
|
+
export function generateBlogDetailUrl(blogId, slug) {
|
|
5
|
+
if (slug) {
|
|
6
|
+
return `${BLOG_DETAIL_URL}/${blogId}-${slug}`;
|
|
7
|
+
}
|
|
8
|
+
return `${BLOG_DETAIL_URL}/${blogId}`;
|
|
9
|
+
}
|
|
10
|
+
export function getBlogDetailUrl(blogId, slug, title) {
|
|
11
|
+
if (slug) {
|
|
12
|
+
return generateBlogDetailUrl(blogId, slug);
|
|
13
|
+
}
|
|
14
|
+
else if (title) {
|
|
15
|
+
// Generate a temporary slug from title for URLs (not saved to DB)
|
|
16
|
+
const tempSlug = generateSlug(title);
|
|
17
|
+
return generateBlogDetailUrl(blogId, tempSlug);
|
|
18
|
+
}
|
|
19
|
+
else {
|
|
20
|
+
// Ultimate fallback - use just the ID (backward compatible)
|
|
21
|
+
return `${BLOG_DETAIL_URL}/${blogId}`;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
// Parse blog URL parameters
|
|
25
|
+
export function parseBlogUrlParams(blogIdSlug) {
|
|
26
|
+
if (!blogIdSlug)
|
|
27
|
+
return null;
|
|
28
|
+
// Check if it contains a hyphen (ID-slug format)
|
|
29
|
+
const hyphenIndex = blogIdSlug.indexOf('-');
|
|
30
|
+
if (hyphenIndex === -1) {
|
|
31
|
+
// No hyphen found, treat as just an ID
|
|
32
|
+
return { id: blogIdSlug };
|
|
33
|
+
}
|
|
34
|
+
// Split at the first hyphen
|
|
35
|
+
const id = blogIdSlug.substring(0, hyphenIndex);
|
|
36
|
+
const slug = blogIdSlug.substring(hyphenIndex + 1);
|
|
37
|
+
return { id, slug };
|
|
38
|
+
}
|
|
39
|
+
// Content processing
|
|
40
|
+
export function generateExcerpt(content, length = BLOG_EXCERPT_LENGTH) {
|
|
41
|
+
// Strip HTML tags
|
|
42
|
+
const textContent = content.replace(/<[^>]*>/g, '');
|
|
43
|
+
if (textContent.length <= length) {
|
|
44
|
+
return textContent;
|
|
45
|
+
}
|
|
46
|
+
// Find the last complete word within the length limit
|
|
47
|
+
const truncated = textContent.substring(0, length);
|
|
48
|
+
const lastSpace = truncated.lastIndexOf(' ');
|
|
49
|
+
return lastSpace > 0
|
|
50
|
+
? truncated.substring(0, lastSpace) + '...'
|
|
51
|
+
: truncated + '...';
|
|
52
|
+
}
|
|
53
|
+
// Calculate estimated reading time
|
|
54
|
+
export function calculateReadingTime(content) {
|
|
55
|
+
const wordsPerMinute = 200;
|
|
56
|
+
const textContent = content.replace(/<[^>]*>/g, '');
|
|
57
|
+
const wordCount = textContent.split(/\s+/).length;
|
|
58
|
+
return Math.ceil(wordCount / wordsPerMinute);
|
|
59
|
+
}
|
|
60
|
+
// Blog image handling
|
|
61
|
+
export function getBlogImageUrl(imageUrl) {
|
|
62
|
+
return imageUrl || DEFAULT_BLOG_IMAGE;
|
|
63
|
+
}
|
|
64
|
+
// SEO helpers
|
|
65
|
+
export function generateMetaTitle(title, siteName = 'Bash') {
|
|
66
|
+
return `${title} | ${siteName}`;
|
|
67
|
+
}
|
|
68
|
+
export function generateMetaDescription(content, title) {
|
|
69
|
+
const excerpt = generateExcerpt(content, 155);
|
|
70
|
+
return excerpt || `Read about ${title} on ${SITE_NAME}`;
|
|
71
|
+
}
|
|
72
|
+
// Content validation
|
|
73
|
+
export function validateBlogContent(title, content) {
|
|
74
|
+
const errors = [];
|
|
75
|
+
if (!title || title.trim().length === 0) {
|
|
76
|
+
errors.push('Title is required');
|
|
77
|
+
}
|
|
78
|
+
else if (title.length > 200) {
|
|
79
|
+
errors.push('Title must be less than 200 characters');
|
|
80
|
+
}
|
|
81
|
+
if (!content || content.trim().length === 0) {
|
|
82
|
+
errors.push('Content is required');
|
|
83
|
+
}
|
|
84
|
+
else if (content.length < 100) {
|
|
85
|
+
errors.push('Content must be at least 100 characters');
|
|
86
|
+
}
|
|
87
|
+
return {
|
|
88
|
+
isValid: errors.length === 0,
|
|
89
|
+
errors
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
// Tag processing
|
|
93
|
+
export function processTags(tagString) {
|
|
94
|
+
if (!tagString)
|
|
95
|
+
return [];
|
|
96
|
+
return tagString
|
|
97
|
+
.split(',')
|
|
98
|
+
.map(tag => tag.trim().toLowerCase())
|
|
99
|
+
.filter(tag => tag.length > 0)
|
|
100
|
+
.slice(0, 10); // Limit to 10 tags
|
|
101
|
+
}
|
|
102
|
+
// Search helpers
|
|
103
|
+
export function highlightSearchTerms(text, searchTerm) {
|
|
104
|
+
if (!searchTerm)
|
|
105
|
+
return text;
|
|
106
|
+
const regex = new RegExp(`(${searchTerm})`, 'gi');
|
|
107
|
+
return text.replace(regex, '<mark>$1</mark>');
|
|
108
|
+
}
|
|
109
|
+
// Format publication date
|
|
110
|
+
export function formatPublishDate(date) {
|
|
111
|
+
const publishDate = typeof date === 'string' ? new Date(date) : date;
|
|
112
|
+
return publishDate.toLocaleDateString('en-US', {
|
|
113
|
+
year: 'numeric',
|
|
114
|
+
month: 'long',
|
|
115
|
+
day: 'numeric'
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=blogUtils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"blogUtils.js","sourceRoot":"","sources":["../../src/utils/blogUtils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { DateTime } from "luxon";
|
|
2
|
+
import { DateType, DateValueType } from "react-tailwindcss-datepicker";
|
|
3
|
+
import { DateTimeArgType } from "../definitions";
|
|
4
|
+
export declare const DATETIME_FORMAT_STANDARD = "MMM d, yyyy - h:mm a";
|
|
5
|
+
export declare const DATETIME_FORMAT_ISO_LIKE = "yyyy-MM-dd HH:mm";
|
|
6
|
+
export declare const DATE_FORMAT_STANDARD = "MM/dd/yyyy";
|
|
7
|
+
export declare const DATE_FORMAT_ISO = "yyyy-MM-dd";
|
|
8
|
+
export declare const TIME_FORMAT_AM_PM = "h:mm a";
|
|
9
|
+
export interface ITime {
|
|
10
|
+
hours: number;
|
|
11
|
+
minutes: number;
|
|
12
|
+
ampm: "AM" | "PM";
|
|
13
|
+
}
|
|
14
|
+
export declare function getLocalTimezoneName(): string;
|
|
15
|
+
export declare function formatDateRangeBasic(startDateTimeArg: Date | null, endDateTimeArg: Date | null): string;
|
|
16
|
+
export declare function formatDateRange(startDateTimeArg: Date | null, endDateTimeArg: Date | null): string;
|
|
17
|
+
export declare function ensureIsDateTime(possiblyADate: DateTimeArgType): Date | undefined;
|
|
18
|
+
export declare function normalizeDate(validDate: Date | string | undefined | null): Date | undefined;
|
|
19
|
+
export declare function normalizeDates(dates: (Date | string | undefined | null)[]): Date[];
|
|
20
|
+
export declare function formatDateTimeToISODateTimeString(date: DateTimeArgType): string | undefined;
|
|
21
|
+
export declare function dateWithinDateRange(date: DateTimeArgType, dateRange: DateValueType | undefined): boolean;
|
|
22
|
+
export declare function findLatestDateTime(date1Arg: DateTimeArgType, date2Arg: DateTimeArgType): Date | undefined;
|
|
23
|
+
export declare function isDateTimeLaterThanNow(date: DateTimeArgType): boolean;
|
|
24
|
+
export declare function areDateTimesEqual(date1: DateTimeArgType, date2: DateTimeArgType): boolean;
|
|
25
|
+
/**
|
|
26
|
+
* Returns a 1 if date1 is later than date2; 0 if both dates are equal; -1 if date2 is later than date1
|
|
27
|
+
* @param date1
|
|
28
|
+
* @param date2
|
|
29
|
+
*/
|
|
30
|
+
export declare function compareDateTime(date1: DateTimeArgType, date2: DateTimeArgType): number;
|
|
31
|
+
export declare function setDateButPreserveTime(dateArg: DateType, dateWithTheTimeYouWantToKeep: DateType | undefined): Date;
|
|
32
|
+
export declare function setTimeOnDate(date: DateType | Date | undefined, parsedTime: ITime | null): Date;
|
|
33
|
+
export declare function ensureDateTimeIsLocalDateTime(dateArg: DateType | DateTime | undefined): DateTime;
|
|
34
|
+
export declare function formatDateTimeToTimeString(date: Date | string | undefined | null): string;
|
|
35
|
+
export declare function formatDateTimeToTimeString24hr(date: Date | string | undefined | null): string;
|
|
36
|
+
export declare function parseTimeString(timeStr: string): ITime | null;
|
|
37
|
+
export declare function timestampMinutesFromNow(minutes: number): number;
|
|
38
|
+
//# sourceMappingURL=dateTimeUtils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dateTimeUtils.d.ts","sourceRoot":"","sources":["../../src/utils/dateTimeUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACjC,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAIjD,eAAO,MAAM,wBAAwB,yBAAyB,CAAC;AAC/D,eAAO,MAAM,wBAAwB,qBAAqB,CAAC;AAC3D,eAAO,MAAM,oBAAoB,eAAe,CAAC;AACjD,eAAO,MAAM,eAAe,eAAe,CAAC;AAC5C,eAAO,MAAM,iBAAiB,WAAW,CAAC;AAE1C,MAAM,WAAW,KAAK;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC;CACnB;AAED,wBAAgB,oBAAoB,IAAI,MAAM,CAE7C;AAED,wBAAgB,oBAAoB,CAClC,gBAAgB,EAAE,IAAI,GAAG,IAAI,EAC7B,cAAc,EAAE,IAAI,GAAG,IAAI,GAC1B,MAAM,CAcR;AAED,wBAAgB,eAAe,CAC7B,gBAAgB,EAAE,IAAI,GAAG,IAAI,EAC7B,cAAc,EAAE,IAAI,GAAG,IAAI,GAC1B,MAAM,CAcR;AAED,wBAAgB,gBAAgB,CAC9B,aAAa,EAAE,eAAe,GAC7B,IAAI,GAAG,SAAS,CAOlB;AAGD,wBAAgB,aAAa,CAC3B,SAAS,EAAE,IAAI,GAAG,MAAM,GAAG,SAAS,GAAG,IAAI,GAC1C,IAAI,GAAG,SAAS,CAYlB;AAED,wBAAgB,cAAc,CAC5B,KAAK,EAAE,CAAC,IAAI,GAAG,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC,EAAE,GAC1C,IAAI,EAAE,CAIR;AAED,wBAAgB,iCAAiC,CAC/C,IAAI,EAAE,eAAe,GACpB,MAAM,GAAG,SAAS,CAMpB;AAED,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,eAAe,EACrB,SAAS,EAAE,aAAa,GAAG,SAAS,GACnC,OAAO,CAMT;AAED,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,eAAe,EACzB,QAAQ,EAAE,eAAe,GACxB,IAAI,GAAG,SAAS,CAIlB;AAUD,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAErE;AAED,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,eAAe,EACtB,KAAK,EAAE,eAAe,GACrB,OAAO,CAET;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAC7B,KAAK,EAAE,eAAe,EACtB,KAAK,EAAE,eAAe,GACrB,MAAM,CA4BR;AAED,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,QAAQ,EACjB,4BAA4B,EAAE,QAAQ,GAAG,SAAS,GACjD,IAAI,CAyCN;AAED,wBAAgB,aAAa,CAC3B,IAAI,EAAE,QAAQ,GAAG,IAAI,GAAG,SAAS,EACjC,UAAU,EAAE,KAAK,GAAG,IAAI,GACvB,IAAI,CAaN;AAED,wBAAgB,6BAA6B,CAC3C,OAAO,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,GACvC,QAAQ,CAWV;AAED,wBAAgB,0BAA0B,CACxC,IAAI,EAAE,IAAI,GAAG,MAAM,GAAG,SAAS,GAAG,IAAI,GACrC,MAAM,CAGR;AAED,wBAAgB,8BAA8B,CAC5C,IAAI,EAAE,IAAI,GAAG,MAAM,GAAG,SAAS,GAAG,IAAI,GACrC,MAAM,CAGR;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,KAAK,GAAG,IAAI,CAuB7D;AAED,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAE/D"}
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
import { DateTime } from "luxon";
|
|
2
|
+
const PARSE_TIME_REG = /^(\d{1,2}):(\d{2}) ?([APM]{0,2})$/i;
|
|
3
|
+
export const DATETIME_FORMAT_STANDARD = "MMM d, yyyy - h:mm a";
|
|
4
|
+
export const DATETIME_FORMAT_ISO_LIKE = "yyyy-MM-dd HH:mm";
|
|
5
|
+
export const DATE_FORMAT_STANDARD = "MM/dd/yyyy";
|
|
6
|
+
export const DATE_FORMAT_ISO = "yyyy-MM-dd";
|
|
7
|
+
export const TIME_FORMAT_AM_PM = "h:mm a";
|
|
8
|
+
export function getLocalTimezoneName() {
|
|
9
|
+
return DateTime.local().zoneName;
|
|
10
|
+
}
|
|
11
|
+
export function formatDateRangeBasic(startDateTimeArg, endDateTimeArg) {
|
|
12
|
+
const userTimezone = getLocalTimezoneName();
|
|
13
|
+
const startDateTime = DateTime.fromJSDate(startDateTimeArg || new Date()).setZone(userTimezone);
|
|
14
|
+
const endDateTime = DateTime.fromJSDate(endDateTimeArg || new Date()).setZone(userTimezone);
|
|
15
|
+
if (startDateTime.hasSame(endDateTime, "day")) {
|
|
16
|
+
return `${startDateTime.toFormat(DATETIME_FORMAT_STANDARD)} to ${endDateTime.toFormat(TIME_FORMAT_AM_PM)}`;
|
|
17
|
+
}
|
|
18
|
+
return `${startDateTime.toFormat(DATETIME_FORMAT_STANDARD)} to ${endDateTime.toFormat(DATETIME_FORMAT_STANDARD)}`;
|
|
19
|
+
}
|
|
20
|
+
export function formatDateRange(startDateTimeArg, endDateTimeArg) {
|
|
21
|
+
const userTimezone = getLocalTimezoneName();
|
|
22
|
+
const startDateTime = ensureDateTimeIsLocalDateTime(startDateTimeArg).setZone(userTimezone);
|
|
23
|
+
const endDateTime = ensureDateTimeIsLocalDateTime(endDateTimeArg).setZone(userTimezone);
|
|
24
|
+
if (startDateTime.hasSame(endDateTime, "day")) {
|
|
25
|
+
return `${startDateTime.toFormat(DATETIME_FORMAT_STANDARD)} to ${endDateTime.toFormat(TIME_FORMAT_AM_PM)}`;
|
|
26
|
+
}
|
|
27
|
+
return `${startDateTime.toFormat(DATETIME_FORMAT_STANDARD)} to ${endDateTime.toFormat(DATETIME_FORMAT_STANDARD)}`;
|
|
28
|
+
}
|
|
29
|
+
export function ensureIsDateTime(possiblyADate) {
|
|
30
|
+
if (!possiblyADate) {
|
|
31
|
+
return undefined;
|
|
32
|
+
}
|
|
33
|
+
return typeof possiblyADate === "string"
|
|
34
|
+
? new Date(possiblyADate)
|
|
35
|
+
: possiblyADate;
|
|
36
|
+
}
|
|
37
|
+
//convert to utc and round minutes
|
|
38
|
+
export function normalizeDate(validDate) {
|
|
39
|
+
if (!validDate)
|
|
40
|
+
return undefined;
|
|
41
|
+
const date = new Date(validDate);
|
|
42
|
+
if (isNaN(date.getTime())) {
|
|
43
|
+
console.error("Invalid date provided:", validDate);
|
|
44
|
+
return undefined;
|
|
45
|
+
}
|
|
46
|
+
// Normalize to UTC and start of minute
|
|
47
|
+
return DateTime.fromJSDate(date).toUTC().startOf("minute").toJSDate();
|
|
48
|
+
}
|
|
49
|
+
export function normalizeDates(dates) {
|
|
50
|
+
return dates
|
|
51
|
+
.map((date) => normalizeDate(date)) // Normalize each date
|
|
52
|
+
.filter((date) => !!date); // Filter out invalid dates
|
|
53
|
+
}
|
|
54
|
+
export function formatDateTimeToISODateTimeString(date) {
|
|
55
|
+
if (!date) {
|
|
56
|
+
return undefined;
|
|
57
|
+
}
|
|
58
|
+
date = new Date(date);
|
|
59
|
+
return date.toISOString();
|
|
60
|
+
}
|
|
61
|
+
export function dateWithinDateRange(date, dateRange) {
|
|
62
|
+
const startDate = DateTime.fromJSDate(dateRange?.startDate || new Date()).startOf("day");
|
|
63
|
+
const endDate = DateTime.fromJSDate(dateRange?.endDate || new Date()).endOf("day");
|
|
64
|
+
const checkDate = DateTime.fromJSDate(new Date(date || ''));
|
|
65
|
+
return checkDate >= startDate && checkDate < endDate;
|
|
66
|
+
}
|
|
67
|
+
export function findLatestDateTime(date1Arg, date2Arg) {
|
|
68
|
+
const date1 = dateTimeTypeToDate(date1Arg);
|
|
69
|
+
const date2 = dateTimeTypeToDate(date2Arg);
|
|
70
|
+
return compareDateTime(date1, date2) > 0 ? date1 : date2;
|
|
71
|
+
}
|
|
72
|
+
function dateTimeTypeToDate(date) {
|
|
73
|
+
if (typeof date === "string") {
|
|
74
|
+
return new Date(date);
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
return date ?? undefined;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
export function isDateTimeLaterThanNow(date) {
|
|
81
|
+
return compareDateTime(date, new Date()) > 0;
|
|
82
|
+
}
|
|
83
|
+
export function areDateTimesEqual(date1, date2) {
|
|
84
|
+
return compareDateTime(date1, date2) === 0;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Returns a 1 if date1 is later than date2; 0 if both dates are equal; -1 if date2 is later than date1
|
|
88
|
+
* @param date1
|
|
89
|
+
* @param date2
|
|
90
|
+
*/
|
|
91
|
+
export function compareDateTime(date1, date2) {
|
|
92
|
+
if (!date1 && !date2) {
|
|
93
|
+
return 0;
|
|
94
|
+
}
|
|
95
|
+
if (!date1) {
|
|
96
|
+
return -1;
|
|
97
|
+
}
|
|
98
|
+
if (!date2) {
|
|
99
|
+
return 1;
|
|
100
|
+
}
|
|
101
|
+
if (typeof date1 === "string") {
|
|
102
|
+
date1 = new Date(date1);
|
|
103
|
+
}
|
|
104
|
+
if (typeof date2 === "string") {
|
|
105
|
+
date2 = new Date(date2);
|
|
106
|
+
}
|
|
107
|
+
const date1Time = date1.getTime();
|
|
108
|
+
const date2Time = date2.getTime();
|
|
109
|
+
if (date1Time > date2Time) {
|
|
110
|
+
return 1;
|
|
111
|
+
}
|
|
112
|
+
if (date1Time === date2Time) {
|
|
113
|
+
return 0;
|
|
114
|
+
}
|
|
115
|
+
else {
|
|
116
|
+
return -1;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
export function setDateButPreserveTime(dateArg, dateWithTheTimeYouWantToKeep) {
|
|
120
|
+
if (!dateArg || !dateWithTheTimeYouWantToKeep) {
|
|
121
|
+
console.error("Invalid arguments:", {
|
|
122
|
+
dateArg,
|
|
123
|
+
dateWithTheTimeYouWantToKeep,
|
|
124
|
+
});
|
|
125
|
+
throw new Error("Both dateArg and dateWithTheTimeYouWantToKeep are required.");
|
|
126
|
+
}
|
|
127
|
+
// Get local timezone
|
|
128
|
+
const localTimeZone = getLocalTimezoneName();
|
|
129
|
+
// Extract date and time components using Luxon
|
|
130
|
+
const dateOnly = DateTime.fromJSDate(new Date(dateArg)).setZone(localTimeZone);
|
|
131
|
+
const timeOnly = DateTime.fromJSDate(new Date(dateWithTheTimeYouWantToKeep)).setZone(localTimeZone);
|
|
132
|
+
// Combine date from first argument with time from second argument
|
|
133
|
+
const combinedDateTime = dateOnly.set({
|
|
134
|
+
hour: timeOnly.hour,
|
|
135
|
+
minute: timeOnly.minute,
|
|
136
|
+
second: 0,
|
|
137
|
+
millisecond: 0
|
|
138
|
+
});
|
|
139
|
+
console.log("Combining date and time:", {
|
|
140
|
+
dateOnly: dateOnly.toISO(),
|
|
141
|
+
timeOnly: timeOnly.toFormat("HH:mm"),
|
|
142
|
+
combinedDateTime: combinedDateTime.toISO(),
|
|
143
|
+
localTimeZone,
|
|
144
|
+
});
|
|
145
|
+
const result = combinedDateTime.toJSDate();
|
|
146
|
+
if (isNaN(result.getTime())) {
|
|
147
|
+
console.error("Invalid combined datetime:", combinedDateTime.toISO());
|
|
148
|
+
throw new Error("Invalid date or time format.");
|
|
149
|
+
}
|
|
150
|
+
console.log("Final combined DateTime (UTC):", result);
|
|
151
|
+
return result;
|
|
152
|
+
}
|
|
153
|
+
export function setTimeOnDate(date, parsedTime) {
|
|
154
|
+
const dateTime = DateTime.fromJSDate(date ? new Date(date) : new Date());
|
|
155
|
+
if (parsedTime) {
|
|
156
|
+
const updatedDateTime = dateTime.set({
|
|
157
|
+
hour: parsedTime.hours,
|
|
158
|
+
minute: parsedTime.minutes,
|
|
159
|
+
second: 0,
|
|
160
|
+
millisecond: 0
|
|
161
|
+
});
|
|
162
|
+
return setDateButPreserveTime(dateTime.toJSDate(), updatedDateTime.toJSDate());
|
|
163
|
+
}
|
|
164
|
+
return dateTime.toJSDate();
|
|
165
|
+
}
|
|
166
|
+
export function ensureDateTimeIsLocalDateTime(dateArg) {
|
|
167
|
+
if (!dateArg) {
|
|
168
|
+
return DateTime.local();
|
|
169
|
+
}
|
|
170
|
+
if (dateArg instanceof DateTime) {
|
|
171
|
+
return dateArg.setZone(getLocalTimezoneName());
|
|
172
|
+
}
|
|
173
|
+
const dt = DateTime.fromJSDate(new Date(dateArg));
|
|
174
|
+
return dt.setZone(getLocalTimezoneName());
|
|
175
|
+
}
|
|
176
|
+
export function formatDateTimeToTimeString(date) {
|
|
177
|
+
const dt = DateTime.fromJSDate(new Date(date ?? Date.now()));
|
|
178
|
+
return dt.toFormat("h:mm a");
|
|
179
|
+
}
|
|
180
|
+
export function formatDateTimeToTimeString24hr(date) {
|
|
181
|
+
const dt = DateTime.fromJSDate(new Date(date ?? Date.now()));
|
|
182
|
+
return dt.toFormat("H:mm");
|
|
183
|
+
}
|
|
184
|
+
export function parseTimeString(timeStr) {
|
|
185
|
+
const match = timeStr.match(PARSE_TIME_REG);
|
|
186
|
+
if (match) {
|
|
187
|
+
const hours = parseInt(match[1], 10);
|
|
188
|
+
const minutes = parseInt(match[2], 10);
|
|
189
|
+
const ampm = match[3].toUpperCase();
|
|
190
|
+
if (hours >= 0 &&
|
|
191
|
+
hours <= 12 &&
|
|
192
|
+
minutes >= 0 &&
|
|
193
|
+
minutes <= 59 &&
|
|
194
|
+
(ampm === "AM" || ampm === "PM")) {
|
|
195
|
+
return {
|
|
196
|
+
hours: ampm === "PM" && hours < 12 ? hours + 12 : hours,
|
|
197
|
+
minutes,
|
|
198
|
+
ampm,
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
return null;
|
|
203
|
+
}
|
|
204
|
+
export function timestampMinutesFromNow(minutes) {
|
|
205
|
+
return Math.floor(DateTime.local().plus({ minutes }).toSeconds());
|
|
206
|
+
}
|
|
207
|
+
//# sourceMappingURL=dateTimeUtils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dateTimeUtils.js","sourceRoot":"","sources":["../../src/utils/dateTimeUtils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"entityUtils.d.ts","sourceRoot":"","sources":["../../src/utils/entityUtils.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,QAAQ;;;CAGX,CAAC"}
|