@exyconn/common 1.0.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 +259 -0
- package/dist/client/http/index.d.mts +85 -0
- package/dist/client/http/index.d.ts +85 -0
- package/dist/client/http/index.js +127 -0
- package/dist/client/http/index.js.map +1 -0
- package/dist/client/http/index.mjs +109 -0
- package/dist/client/http/index.mjs.map +1 -0
- package/dist/client/index.d.mts +7 -0
- package/dist/client/index.d.ts +7 -0
- package/dist/client/index.js +964 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/index.mjs +889 -0
- package/dist/client/index.mjs.map +1 -0
- package/dist/client/logger/index.d.mts +53 -0
- package/dist/client/logger/index.d.ts +53 -0
- package/dist/client/logger/index.js +120 -0
- package/dist/client/logger/index.js.map +1 -0
- package/dist/client/logger/index.mjs +116 -0
- package/dist/client/logger/index.mjs.map +1 -0
- package/dist/client/utils/index.d.mts +285 -0
- package/dist/client/utils/index.d.ts +285 -0
- package/dist/client/utils/index.js +403 -0
- package/dist/client/utils/index.js.map +1 -0
- package/dist/client/utils/index.mjs +362 -0
- package/dist/client/utils/index.mjs.map +1 -0
- package/dist/index-BNdT-2X4.d.ts +229 -0
- package/dist/index-CcrANHAQ.d.mts +59 -0
- package/dist/index-ClWtDfwk.d.ts +833 -0
- package/dist/index-DSW6JfD-.d.mts +833 -0
- package/dist/index-Du0LLt9f.d.mts +229 -0
- package/dist/index-iTKxFa78.d.ts +59 -0
- package/dist/index.d.mts +171 -0
- package/dist/index.d.ts +171 -0
- package/dist/index.js +3806 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +3792 -0
- package/dist/index.mjs.map +1 -0
- package/dist/response.types-D--UhLJq.d.mts +67 -0
- package/dist/response.types-D--UhLJq.d.ts +67 -0
- package/dist/server/db/index.d.mts +38 -0
- package/dist/server/db/index.d.ts +38 -0
- package/dist/server/db/index.js +68 -0
- package/dist/server/db/index.js.map +1 -0
- package/dist/server/db/index.mjs +60 -0
- package/dist/server/db/index.mjs.map +1 -0
- package/dist/server/enums/index.d.mts +46 -0
- package/dist/server/enums/index.d.ts +46 -0
- package/dist/server/enums/index.js +48 -0
- package/dist/server/enums/index.js.map +1 -0
- package/dist/server/enums/index.mjs +43 -0
- package/dist/server/enums/index.mjs.map +1 -0
- package/dist/server/index.d.mts +9 -0
- package/dist/server/index.d.ts +9 -0
- package/dist/server/index.js +569 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/index.mjs +523 -0
- package/dist/server/index.mjs.map +1 -0
- package/dist/server/logger/index.d.mts +34 -0
- package/dist/server/logger/index.d.ts +34 -0
- package/dist/server/logger/index.js +125 -0
- package/dist/server/logger/index.js.map +1 -0
- package/dist/server/logger/index.mjs +113 -0
- package/dist/server/logger/index.mjs.map +1 -0
- package/dist/server/middleware/index.d.mts +56 -0
- package/dist/server/middleware/index.d.ts +56 -0
- package/dist/server/middleware/index.js +128 -0
- package/dist/server/middleware/index.js.map +1 -0
- package/dist/server/middleware/index.mjs +118 -0
- package/dist/server/middleware/index.mjs.map +1 -0
- package/dist/server/response/index.d.mts +86 -0
- package/dist/server/response/index.d.ts +86 -0
- package/dist/server/response/index.js +140 -0
- package/dist/server/response/index.js.map +1 -0
- package/dist/server/response/index.mjs +126 -0
- package/dist/server/response/index.mjs.map +1 -0
- package/dist/server/utils/index.d.mts +69 -0
- package/dist/server/utils/index.d.ts +69 -0
- package/dist/server/utils/index.js +114 -0
- package/dist/server/utils/index.js.map +1 -0
- package/dist/server/utils/index.mjs +106 -0
- package/dist/server/utils/index.mjs.map +1 -0
- package/dist/shared/index.d.mts +4 -0
- package/dist/shared/index.d.ts +4 -0
- package/dist/shared/index.js +933 -0
- package/dist/shared/index.js.map +1 -0
- package/dist/shared/index.mjs +612 -0
- package/dist/shared/index.mjs.map +1 -0
- package/package.json +202 -0
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Filter Builder Options
|
|
3
|
+
*/
|
|
4
|
+
interface FilterOptions {
|
|
5
|
+
organizationId?: string;
|
|
6
|
+
search?: string;
|
|
7
|
+
searchFields?: string[];
|
|
8
|
+
dateField?: string;
|
|
9
|
+
startDate?: string;
|
|
10
|
+
endDate?: string;
|
|
11
|
+
status?: string;
|
|
12
|
+
isActive?: boolean;
|
|
13
|
+
[key: string]: unknown;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Pagination Options
|
|
17
|
+
*/
|
|
18
|
+
interface PaginationOptions {
|
|
19
|
+
page?: number;
|
|
20
|
+
limit?: number;
|
|
21
|
+
defaultLimit?: number;
|
|
22
|
+
maxLimit?: number;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Pagination Result
|
|
26
|
+
*/
|
|
27
|
+
interface PaginationResult {
|
|
28
|
+
skip: number;
|
|
29
|
+
limit: number;
|
|
30
|
+
page: number;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Build MongoDB filter query dynamically
|
|
34
|
+
*/
|
|
35
|
+
declare const buildFilter: (options: FilterOptions) => Record<string, unknown>;
|
|
36
|
+
/**
|
|
37
|
+
* Calculate pagination values
|
|
38
|
+
*/
|
|
39
|
+
declare const buildPagination: (options: PaginationOptions) => PaginationResult;
|
|
40
|
+
/**
|
|
41
|
+
* Calculate pagination metadata for response
|
|
42
|
+
*/
|
|
43
|
+
declare const buildPaginationMeta: (total: number, page: number, limit: number) => {
|
|
44
|
+
total: number;
|
|
45
|
+
page: number;
|
|
46
|
+
limit: number;
|
|
47
|
+
totalPages: number;
|
|
48
|
+
hasNextPage: boolean;
|
|
49
|
+
hasPrevPage: boolean;
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Sanitize user object by removing sensitive fields
|
|
54
|
+
*/
|
|
55
|
+
declare const sanitizeUser: <T extends Record<string, unknown>>(user: T | null | undefined, additionalFieldsToRemove?: string[]) => Omit<T, "password" | "__v" | "_id"> | null;
|
|
56
|
+
/**
|
|
57
|
+
* Sanitize document by removing specified fields
|
|
58
|
+
*/
|
|
59
|
+
declare const sanitizeDocument: <T extends Record<string, unknown>>(doc: T | null | undefined, fieldsToRemove: string[]) => Partial<T> | null;
|
|
60
|
+
/**
|
|
61
|
+
* Pick specific fields from an object
|
|
62
|
+
*/
|
|
63
|
+
declare const pickFields: <T extends Record<string, unknown>>(obj: T | null | undefined, fieldsToPick: (keyof T)[]) => Partial<T> | null;
|
|
64
|
+
/**
|
|
65
|
+
* Omit specific fields from an object
|
|
66
|
+
*/
|
|
67
|
+
declare const omitFields: <T extends Record<string, unknown>, K extends keyof T>(obj: T | null | undefined, fieldsToOmit: K[]) => Omit<T, K> | null;
|
|
68
|
+
|
|
69
|
+
export { type FilterOptions, type PaginationOptions, type PaginationResult, buildFilter, buildPagination, buildPaginationMeta, omitFields, pickFields, sanitizeDocument, sanitizeUser };
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Filter Builder Options
|
|
3
|
+
*/
|
|
4
|
+
interface FilterOptions {
|
|
5
|
+
organizationId?: string;
|
|
6
|
+
search?: string;
|
|
7
|
+
searchFields?: string[];
|
|
8
|
+
dateField?: string;
|
|
9
|
+
startDate?: string;
|
|
10
|
+
endDate?: string;
|
|
11
|
+
status?: string;
|
|
12
|
+
isActive?: boolean;
|
|
13
|
+
[key: string]: unknown;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Pagination Options
|
|
17
|
+
*/
|
|
18
|
+
interface PaginationOptions {
|
|
19
|
+
page?: number;
|
|
20
|
+
limit?: number;
|
|
21
|
+
defaultLimit?: number;
|
|
22
|
+
maxLimit?: number;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Pagination Result
|
|
26
|
+
*/
|
|
27
|
+
interface PaginationResult {
|
|
28
|
+
skip: number;
|
|
29
|
+
limit: number;
|
|
30
|
+
page: number;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Build MongoDB filter query dynamically
|
|
34
|
+
*/
|
|
35
|
+
declare const buildFilter: (options: FilterOptions) => Record<string, unknown>;
|
|
36
|
+
/**
|
|
37
|
+
* Calculate pagination values
|
|
38
|
+
*/
|
|
39
|
+
declare const buildPagination: (options: PaginationOptions) => PaginationResult;
|
|
40
|
+
/**
|
|
41
|
+
* Calculate pagination metadata for response
|
|
42
|
+
*/
|
|
43
|
+
declare const buildPaginationMeta: (total: number, page: number, limit: number) => {
|
|
44
|
+
total: number;
|
|
45
|
+
page: number;
|
|
46
|
+
limit: number;
|
|
47
|
+
totalPages: number;
|
|
48
|
+
hasNextPage: boolean;
|
|
49
|
+
hasPrevPage: boolean;
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Sanitize user object by removing sensitive fields
|
|
54
|
+
*/
|
|
55
|
+
declare const sanitizeUser: <T extends Record<string, unknown>>(user: T | null | undefined, additionalFieldsToRemove?: string[]) => Omit<T, "password" | "__v" | "_id"> | null;
|
|
56
|
+
/**
|
|
57
|
+
* Sanitize document by removing specified fields
|
|
58
|
+
*/
|
|
59
|
+
declare const sanitizeDocument: <T extends Record<string, unknown>>(doc: T | null | undefined, fieldsToRemove: string[]) => Partial<T> | null;
|
|
60
|
+
/**
|
|
61
|
+
* Pick specific fields from an object
|
|
62
|
+
*/
|
|
63
|
+
declare const pickFields: <T extends Record<string, unknown>>(obj: T | null | undefined, fieldsToPick: (keyof T)[]) => Partial<T> | null;
|
|
64
|
+
/**
|
|
65
|
+
* Omit specific fields from an object
|
|
66
|
+
*/
|
|
67
|
+
declare const omitFields: <T extends Record<string, unknown>, K extends keyof T>(obj: T | null | undefined, fieldsToOmit: K[]) => Omit<T, K> | null;
|
|
68
|
+
|
|
69
|
+
export { type FilterOptions, type PaginationOptions, type PaginationResult, buildFilter, buildPagination, buildPaginationMeta, omitFields, pickFields, sanitizeDocument, sanitizeUser };
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
// src/server/utils/filter-builder.ts
|
|
4
|
+
var buildFilter = (options) => {
|
|
5
|
+
const {
|
|
6
|
+
organizationId,
|
|
7
|
+
search,
|
|
8
|
+
searchFields = [],
|
|
9
|
+
dateField = "createdAt",
|
|
10
|
+
startDate,
|
|
11
|
+
endDate,
|
|
12
|
+
status,
|
|
13
|
+
isActive,
|
|
14
|
+
...additionalFilters
|
|
15
|
+
} = options;
|
|
16
|
+
const filter = {};
|
|
17
|
+
if (organizationId) {
|
|
18
|
+
filter.organizationId = organizationId;
|
|
19
|
+
}
|
|
20
|
+
if (search && search.trim().length >= 2 && searchFields.length > 0) {
|
|
21
|
+
const searchRegex = new RegExp(search.trim(), "i");
|
|
22
|
+
filter.$or = searchFields.map((field) => ({ [field]: searchRegex }));
|
|
23
|
+
}
|
|
24
|
+
if (startDate || endDate) {
|
|
25
|
+
filter[dateField] = {};
|
|
26
|
+
if (startDate) {
|
|
27
|
+
filter[dateField].$gte = new Date(startDate);
|
|
28
|
+
}
|
|
29
|
+
if (endDate) {
|
|
30
|
+
filter[dateField].$lte = new Date(endDate);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
if (status !== void 0) {
|
|
34
|
+
filter.status = status;
|
|
35
|
+
}
|
|
36
|
+
if (isActive !== void 0) {
|
|
37
|
+
filter.isActive = isActive;
|
|
38
|
+
}
|
|
39
|
+
Object.entries(additionalFilters).forEach(([key, value]) => {
|
|
40
|
+
if (value !== void 0 && value !== null && value !== "") {
|
|
41
|
+
filter[key] = value;
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
return filter;
|
|
45
|
+
};
|
|
46
|
+
var buildPagination = (options) => {
|
|
47
|
+
const { page = 1, limit, defaultLimit = 10, maxLimit = 100 } = options;
|
|
48
|
+
const finalPage = Math.max(1, page);
|
|
49
|
+
const finalLimit = Math.min(maxLimit, Math.max(1, limit || defaultLimit));
|
|
50
|
+
const skip = (finalPage - 1) * finalLimit;
|
|
51
|
+
return {
|
|
52
|
+
skip,
|
|
53
|
+
limit: finalLimit,
|
|
54
|
+
page: finalPage
|
|
55
|
+
};
|
|
56
|
+
};
|
|
57
|
+
var buildPaginationMeta = (total, page, limit) => {
|
|
58
|
+
const totalPages = Math.ceil(total / limit);
|
|
59
|
+
return {
|
|
60
|
+
total,
|
|
61
|
+
page,
|
|
62
|
+
limit,
|
|
63
|
+
totalPages,
|
|
64
|
+
hasNextPage: page < totalPages,
|
|
65
|
+
hasPrevPage: page > 1
|
|
66
|
+
};
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
// src/server/utils/sanitize.ts
|
|
70
|
+
var sanitizeUser = (user, additionalFieldsToRemove = []) => {
|
|
71
|
+
if (!user) return null;
|
|
72
|
+
const fieldsToRemove = ["password", "__v", "_id", ...additionalFieldsToRemove];
|
|
73
|
+
const obj = typeof user.toObject === "function" ? user.toObject() : { ...user };
|
|
74
|
+
fieldsToRemove.forEach((field) => {
|
|
75
|
+
delete obj[field];
|
|
76
|
+
});
|
|
77
|
+
return obj;
|
|
78
|
+
};
|
|
79
|
+
var sanitizeDocument = (doc, fieldsToRemove) => {
|
|
80
|
+
if (!doc) return null;
|
|
81
|
+
const obj = typeof doc.toObject === "function" ? doc.toObject() : { ...doc };
|
|
82
|
+
fieldsToRemove.forEach((field) => {
|
|
83
|
+
delete obj[field];
|
|
84
|
+
});
|
|
85
|
+
return obj;
|
|
86
|
+
};
|
|
87
|
+
var pickFields = (obj, fieldsToPick) => {
|
|
88
|
+
if (!obj) return null;
|
|
89
|
+
const result = {};
|
|
90
|
+
fieldsToPick.forEach((field) => {
|
|
91
|
+
if (field in obj) {
|
|
92
|
+
result[field] = obj[field];
|
|
93
|
+
}
|
|
94
|
+
});
|
|
95
|
+
return result;
|
|
96
|
+
};
|
|
97
|
+
var omitFields = (obj, fieldsToOmit) => {
|
|
98
|
+
if (!obj) return null;
|
|
99
|
+
const result = { ...obj };
|
|
100
|
+
fieldsToOmit.forEach((field) => {
|
|
101
|
+
delete result[field];
|
|
102
|
+
});
|
|
103
|
+
return result;
|
|
104
|
+
};
|
|
105
|
+
|
|
106
|
+
exports.buildFilter = buildFilter;
|
|
107
|
+
exports.buildPagination = buildPagination;
|
|
108
|
+
exports.buildPaginationMeta = buildPaginationMeta;
|
|
109
|
+
exports.omitFields = omitFields;
|
|
110
|
+
exports.pickFields = pickFields;
|
|
111
|
+
exports.sanitizeDocument = sanitizeDocument;
|
|
112
|
+
exports.sanitizeUser = sanitizeUser;
|
|
113
|
+
//# sourceMappingURL=index.js.map
|
|
114
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/server/utils/filter-builder.ts","../../../src/server/utils/sanitize.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\r\n * Filter Builder Options\r\n */\r\nexport interface FilterOptions {\r\n organizationId?: string;\r\n search?: string;\r\n searchFields?: string[];\r\n dateField?: string;\r\n startDate?: string;\r\n endDate?: string;\r\n status?: string;\r\n isActive?: boolean;\r\n [key: string]: unknown;\r\n}\r\n\r\n/**\r\n * Pagination Options\r\n */\r\nexport interface PaginationOptions {\r\n page?: number;\r\n limit?: number;\r\n defaultLimit?: number;\r\n maxLimit?: number;\r\n}\r\n\r\n/**\r\n * Pagination Result\r\n */\r\nexport interface PaginationResult {\r\n skip: number;\r\n limit: number;\r\n page: number;\r\n}\r\n\r\n/**\r\n * Build MongoDB filter query dynamically\r\n */\r\nexport const buildFilter = (options: FilterOptions): Record<string, unknown> => {\r\n const {\r\n organizationId,\r\n search,\r\n searchFields = [],\r\n dateField = 'createdAt',\r\n startDate,\r\n endDate,\r\n status,\r\n isActive,\r\n ...additionalFilters\r\n } = options;\r\n\r\n const filter: Record<string, unknown> = {};\r\n\r\n // Add organizationId if provided\r\n if (organizationId) {\r\n filter.organizationId = organizationId;\r\n }\r\n\r\n // Handle text search with regex (min 2 characters)\r\n if (search && search.trim().length >= 2 && searchFields.length > 0) {\r\n const searchRegex = new RegExp(search.trim(), 'i');\r\n filter.$or = searchFields.map((field) => ({ [field]: searchRegex }));\r\n }\r\n\r\n // Handle date range filtering\r\n if (startDate || endDate) {\r\n filter[dateField] = {};\r\n if (startDate) {\r\n (filter[dateField] as Record<string, unknown>).$gte = new Date(startDate);\r\n }\r\n if (endDate) {\r\n (filter[dateField] as Record<string, unknown>).$lte = new Date(endDate);\r\n }\r\n }\r\n\r\n // Handle status filter\r\n if (status !== undefined) {\r\n filter.status = status;\r\n }\r\n\r\n // Handle isActive filter\r\n if (isActive !== undefined) {\r\n filter.isActive = isActive;\r\n }\r\n\r\n // Add any additional filters\r\n Object.entries(additionalFilters).forEach(([key, value]) => {\r\n if (value !== undefined && value !== null && value !== '') {\r\n filter[key] = value;\r\n }\r\n });\r\n\r\n return filter;\r\n};\r\n\r\n/**\r\n * Calculate pagination values\r\n */\r\nexport const buildPagination = (options: PaginationOptions): PaginationResult => {\r\n const { page = 1, limit, defaultLimit = 10, maxLimit = 100 } = options;\r\n\r\n const finalPage = Math.max(1, page);\r\n const finalLimit = Math.min(maxLimit, Math.max(1, limit || defaultLimit));\r\n const skip = (finalPage - 1) * finalLimit;\r\n\r\n return {\r\n skip,\r\n limit: finalLimit,\r\n page: finalPage,\r\n };\r\n};\r\n\r\n/**\r\n * Calculate pagination metadata for response\r\n */\r\nexport const buildPaginationMeta = (\r\n total: number,\r\n page: number,\r\n limit: number\r\n): {\r\n total: number;\r\n page: number;\r\n limit: number;\r\n totalPages: number;\r\n hasNextPage: boolean;\r\n hasPrevPage: boolean;\r\n} => {\r\n const totalPages = Math.ceil(total / limit);\r\n\r\n return {\r\n total,\r\n page,\r\n limit,\r\n totalPages,\r\n hasNextPage: page < totalPages,\r\n hasPrevPage: page > 1,\r\n };\r\n};\r\n\r\nexport default {\r\n buildFilter,\r\n buildPagination,\r\n buildPaginationMeta,\r\n};\r\n","/**\r\n * Sanitize user object by removing sensitive fields\r\n */\r\nexport const sanitizeUser = <T extends Record<string, unknown>>(\r\n user: T | null | undefined,\r\n additionalFieldsToRemove: string[] = []\r\n): Omit<T, 'password' | '__v' | '_id'> | null => {\r\n if (!user) return null;\r\n\r\n const fieldsToRemove = ['password', '__v', '_id', ...additionalFieldsToRemove];\r\n\r\n // Handle mongoose documents\r\n const obj = typeof (user as any).toObject === 'function' \r\n ? (user as any).toObject() \r\n : { ...user };\r\n\r\n fieldsToRemove.forEach((field) => {\r\n delete obj[field];\r\n });\r\n\r\n return obj;\r\n};\r\n\r\n/**\r\n * Sanitize document by removing specified fields\r\n */\r\nexport const sanitizeDocument = <T extends Record<string, unknown>>(\r\n doc: T | null | undefined,\r\n fieldsToRemove: string[]\r\n): Partial<T> | null => {\r\n if (!doc) return null;\r\n\r\n // Handle mongoose documents\r\n const obj = typeof (doc as any).toObject === 'function' \r\n ? (doc as any).toObject() \r\n : { ...doc };\r\n\r\n fieldsToRemove.forEach((field) => {\r\n delete obj[field];\r\n });\r\n\r\n return obj;\r\n};\r\n\r\n/**\r\n * Pick specific fields from an object\r\n */\r\nexport const pickFields = <T extends Record<string, unknown>>(\r\n obj: T | null | undefined,\r\n fieldsToPick: (keyof T)[]\r\n): Partial<T> | null => {\r\n if (!obj) return null;\r\n\r\n const result: Partial<T> = {};\r\n\r\n fieldsToPick.forEach((field) => {\r\n if (field in obj) {\r\n result[field] = obj[field];\r\n }\r\n });\r\n\r\n return result;\r\n};\r\n\r\n/**\r\n * Omit specific fields from an object\r\n */\r\nexport const omitFields = <T extends Record<string, unknown>, K extends keyof T>(\r\n obj: T | null | undefined,\r\n fieldsToOmit: K[]\r\n): Omit<T, K> | null => {\r\n if (!obj) return null;\r\n\r\n const result = { ...obj };\r\n\r\n fieldsToOmit.forEach((field) => {\r\n delete result[field];\r\n });\r\n\r\n return result as Omit<T, K>;\r\n};\r\n\r\nexport default {\r\n sanitizeUser,\r\n sanitizeDocument,\r\n pickFields,\r\n omitFields,\r\n};\r\n"]}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
// src/server/utils/filter-builder.ts
|
|
2
|
+
var buildFilter = (options) => {
|
|
3
|
+
const {
|
|
4
|
+
organizationId,
|
|
5
|
+
search,
|
|
6
|
+
searchFields = [],
|
|
7
|
+
dateField = "createdAt",
|
|
8
|
+
startDate,
|
|
9
|
+
endDate,
|
|
10
|
+
status,
|
|
11
|
+
isActive,
|
|
12
|
+
...additionalFilters
|
|
13
|
+
} = options;
|
|
14
|
+
const filter = {};
|
|
15
|
+
if (organizationId) {
|
|
16
|
+
filter.organizationId = organizationId;
|
|
17
|
+
}
|
|
18
|
+
if (search && search.trim().length >= 2 && searchFields.length > 0) {
|
|
19
|
+
const searchRegex = new RegExp(search.trim(), "i");
|
|
20
|
+
filter.$or = searchFields.map((field) => ({ [field]: searchRegex }));
|
|
21
|
+
}
|
|
22
|
+
if (startDate || endDate) {
|
|
23
|
+
filter[dateField] = {};
|
|
24
|
+
if (startDate) {
|
|
25
|
+
filter[dateField].$gte = new Date(startDate);
|
|
26
|
+
}
|
|
27
|
+
if (endDate) {
|
|
28
|
+
filter[dateField].$lte = new Date(endDate);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
if (status !== void 0) {
|
|
32
|
+
filter.status = status;
|
|
33
|
+
}
|
|
34
|
+
if (isActive !== void 0) {
|
|
35
|
+
filter.isActive = isActive;
|
|
36
|
+
}
|
|
37
|
+
Object.entries(additionalFilters).forEach(([key, value]) => {
|
|
38
|
+
if (value !== void 0 && value !== null && value !== "") {
|
|
39
|
+
filter[key] = value;
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
return filter;
|
|
43
|
+
};
|
|
44
|
+
var buildPagination = (options) => {
|
|
45
|
+
const { page = 1, limit, defaultLimit = 10, maxLimit = 100 } = options;
|
|
46
|
+
const finalPage = Math.max(1, page);
|
|
47
|
+
const finalLimit = Math.min(maxLimit, Math.max(1, limit || defaultLimit));
|
|
48
|
+
const skip = (finalPage - 1) * finalLimit;
|
|
49
|
+
return {
|
|
50
|
+
skip,
|
|
51
|
+
limit: finalLimit,
|
|
52
|
+
page: finalPage
|
|
53
|
+
};
|
|
54
|
+
};
|
|
55
|
+
var buildPaginationMeta = (total, page, limit) => {
|
|
56
|
+
const totalPages = Math.ceil(total / limit);
|
|
57
|
+
return {
|
|
58
|
+
total,
|
|
59
|
+
page,
|
|
60
|
+
limit,
|
|
61
|
+
totalPages,
|
|
62
|
+
hasNextPage: page < totalPages,
|
|
63
|
+
hasPrevPage: page > 1
|
|
64
|
+
};
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
// src/server/utils/sanitize.ts
|
|
68
|
+
var sanitizeUser = (user, additionalFieldsToRemove = []) => {
|
|
69
|
+
if (!user) return null;
|
|
70
|
+
const fieldsToRemove = ["password", "__v", "_id", ...additionalFieldsToRemove];
|
|
71
|
+
const obj = typeof user.toObject === "function" ? user.toObject() : { ...user };
|
|
72
|
+
fieldsToRemove.forEach((field) => {
|
|
73
|
+
delete obj[field];
|
|
74
|
+
});
|
|
75
|
+
return obj;
|
|
76
|
+
};
|
|
77
|
+
var sanitizeDocument = (doc, fieldsToRemove) => {
|
|
78
|
+
if (!doc) return null;
|
|
79
|
+
const obj = typeof doc.toObject === "function" ? doc.toObject() : { ...doc };
|
|
80
|
+
fieldsToRemove.forEach((field) => {
|
|
81
|
+
delete obj[field];
|
|
82
|
+
});
|
|
83
|
+
return obj;
|
|
84
|
+
};
|
|
85
|
+
var pickFields = (obj, fieldsToPick) => {
|
|
86
|
+
if (!obj) return null;
|
|
87
|
+
const result = {};
|
|
88
|
+
fieldsToPick.forEach((field) => {
|
|
89
|
+
if (field in obj) {
|
|
90
|
+
result[field] = obj[field];
|
|
91
|
+
}
|
|
92
|
+
});
|
|
93
|
+
return result;
|
|
94
|
+
};
|
|
95
|
+
var omitFields = (obj, fieldsToOmit) => {
|
|
96
|
+
if (!obj) return null;
|
|
97
|
+
const result = { ...obj };
|
|
98
|
+
fieldsToOmit.forEach((field) => {
|
|
99
|
+
delete result[field];
|
|
100
|
+
});
|
|
101
|
+
return result;
|
|
102
|
+
};
|
|
103
|
+
|
|
104
|
+
export { buildFilter, buildPagination, buildPaginationMeta, omitFields, pickFields, sanitizeDocument, sanitizeUser };
|
|
105
|
+
//# sourceMappingURL=index.mjs.map
|
|
106
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/server/utils/filter-builder.ts","../../../src/server/utils/sanitize.ts"],"names":[],"mappings":";AAqCO,IAAM,WAAA,GAAc,CAAC,OAAA,KAAoD;AAC9E,EAAA,MAAM;AAAA,IACJ,cAAA;AAAA,IACA,MAAA;AAAA,IACA,eAAe,EAAC;AAAA,IAChB,SAAA,GAAY,WAAA;AAAA,IACZ,SAAA;AAAA,IACA,OAAA;AAAA,IACA,MAAA;AAAA,IACA,QAAA;AAAA,IACA,GAAG;AAAA,GACL,GAAI,OAAA;AAEJ,EAAA,MAAM,SAAkC,EAAC;AAGzC,EAAA,IAAI,cAAA,EAAgB;AAClB,IAAA,MAAA,CAAO,cAAA,GAAiB,cAAA;AAAA,EAC1B;AAGA,EAAA,IAAI,MAAA,IAAU,OAAO,IAAA,EAAK,CAAE,UAAU,CAAA,IAAK,YAAA,CAAa,SAAS,CAAA,EAAG;AAClE,IAAA,MAAM,cAAc,IAAI,MAAA,CAAO,MAAA,CAAO,IAAA,IAAQ,GAAG,CAAA;AACjD,IAAA,MAAA,CAAO,GAAA,GAAM,YAAA,CAAa,GAAA,CAAI,CAAC,KAAA,MAAW,EAAE,CAAC,KAAK,GAAG,WAAA,EAAY,CAAE,CAAA;AAAA,EACrE;AAGA,EAAA,IAAI,aAAa,OAAA,EAAS;AACxB,IAAA,MAAA,CAAO,SAAS,IAAI,EAAC;AACrB,IAAA,IAAI,SAAA,EAAW;AACb,MAAC,OAAO,SAAS,CAAA,CAA8B,IAAA,GAAO,IAAI,KAAK,SAAS,CAAA;AAAA,IAC1E;AACA,IAAA,IAAI,OAAA,EAAS;AACX,MAAC,OAAO,SAAS,CAAA,CAA8B,IAAA,GAAO,IAAI,KAAK,OAAO,CAAA;AAAA,IACxE;AAAA,EACF;AAGA,EAAA,IAAI,WAAW,MAAA,EAAW;AACxB,IAAA,MAAA,CAAO,MAAA,GAAS,MAAA;AAAA,EAClB;AAGA,EAAA,IAAI,aAAa,MAAA,EAAW;AAC1B,IAAA,MAAA,CAAO,QAAA,GAAW,QAAA;AAAA,EACpB;AAGA,EAAA,MAAA,CAAO,OAAA,CAAQ,iBAAiB,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,KAAM;AAC1D,IAAA,IAAI,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,IAAA,IAAQ,UAAU,EAAA,EAAI;AACzD,MAAA,MAAA,CAAO,GAAG,CAAA,GAAI,KAAA;AAAA,IAChB;AAAA,EACF,CAAC,CAAA;AAED,EAAA,OAAO,MAAA;AACT;AAKO,IAAM,eAAA,GAAkB,CAAC,OAAA,KAAiD;AAC/E,EAAA,MAAM,EAAE,OAAO,CAAA,EAAG,KAAA,EAAO,eAAe,EAAA,EAAI,QAAA,GAAW,KAAI,GAAI,OAAA;AAE/D,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAI,CAAA;AAClC,EAAA,MAAM,UAAA,GAAa,KAAK,GAAA,CAAI,QAAA,EAAU,KAAK,GAAA,CAAI,CAAA,EAAG,KAAA,IAAS,YAAY,CAAC,CAAA;AACxE,EAAA,MAAM,IAAA,GAAA,CAAQ,YAAY,CAAA,IAAK,UAAA;AAE/B,EAAA,OAAO;AAAA,IACL,IAAA;AAAA,IACA,KAAA,EAAO,UAAA;AAAA,IACP,IAAA,EAAM;AAAA,GACR;AACF;AAKO,IAAM,mBAAA,GAAsB,CACjC,KAAA,EACA,IAAA,EACA,KAAA,KAQG;AACH,EAAA,MAAM,UAAA,GAAa,IAAA,CAAK,IAAA,CAAK,KAAA,GAAQ,KAAK,CAAA;AAE1C,EAAA,OAAO;AAAA,IACL,KAAA;AAAA,IACA,IAAA;AAAA,IACA,KAAA;AAAA,IACA,UAAA;AAAA,IACA,aAAa,IAAA,GAAO,UAAA;AAAA,IACpB,aAAa,IAAA,GAAO;AAAA,GACtB;AACF;;;ACrIO,IAAM,YAAA,GAAe,CAC1B,IAAA,EACA,wBAAA,GAAqC,EAAC,KACS;AAC/C,EAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAElB,EAAA,MAAM,iBAAiB,CAAC,UAAA,EAAY,KAAA,EAAO,KAAA,EAAO,GAAG,wBAAwB,CAAA;AAG7E,EAAA,MAAM,GAAA,GAAM,OAAQ,IAAA,CAAa,QAAA,KAAa,UAAA,GACzC,KAAa,QAAA,EAAS,GACvB,EAAE,GAAG,IAAA,EAAK;AAEd,EAAA,cAAA,CAAe,OAAA,CAAQ,CAAC,KAAA,KAAU;AAChC,IAAA,OAAO,IAAI,KAAK,CAAA;AAAA,EAClB,CAAC,CAAA;AAED,EAAA,OAAO,GAAA;AACT;AAKO,IAAM,gBAAA,GAAmB,CAC9B,GAAA,EACA,cAAA,KACsB;AACtB,EAAA,IAAI,CAAC,KAAK,OAAO,IAAA;AAGjB,EAAA,MAAM,GAAA,GAAM,OAAQ,GAAA,CAAY,QAAA,KAAa,UAAA,GACxC,IAAY,QAAA,EAAS,GACtB,EAAE,GAAG,GAAA,EAAI;AAEb,EAAA,cAAA,CAAe,OAAA,CAAQ,CAAC,KAAA,KAAU;AAChC,IAAA,OAAO,IAAI,KAAK,CAAA;AAAA,EAClB,CAAC,CAAA;AAED,EAAA,OAAO,GAAA;AACT;AAKO,IAAM,UAAA,GAAa,CACxB,GAAA,EACA,YAAA,KACsB;AACtB,EAAA,IAAI,CAAC,KAAK,OAAO,IAAA;AAEjB,EAAA,MAAM,SAAqB,EAAC;AAE5B,EAAA,YAAA,CAAa,OAAA,CAAQ,CAAC,KAAA,KAAU;AAC9B,IAAA,IAAI,SAAS,GAAA,EAAK;AAChB,MAAA,MAAA,CAAO,KAAK,CAAA,GAAI,GAAA,CAAI,KAAK,CAAA;AAAA,IAC3B;AAAA,EACF,CAAC,CAAA;AAED,EAAA,OAAO,MAAA;AACT;AAKO,IAAM,UAAA,GAAa,CACxB,GAAA,EACA,YAAA,KACsB;AACtB,EAAA,IAAI,CAAC,KAAK,OAAO,IAAA;AAEjB,EAAA,MAAM,MAAA,GAAS,EAAE,GAAG,GAAA,EAAI;AAExB,EAAA,YAAA,CAAa,OAAA,CAAQ,CAAC,KAAA,KAAU;AAC9B,IAAA,OAAO,OAAO,KAAK,CAAA;AAAA,EACrB,CAAC,CAAA;AAED,EAAA,OAAO,MAAA;AACT","file":"index.mjs","sourcesContent":["/**\r\n * Filter Builder Options\r\n */\r\nexport interface FilterOptions {\r\n organizationId?: string;\r\n search?: string;\r\n searchFields?: string[];\r\n dateField?: string;\r\n startDate?: string;\r\n endDate?: string;\r\n status?: string;\r\n isActive?: boolean;\r\n [key: string]: unknown;\r\n}\r\n\r\n/**\r\n * Pagination Options\r\n */\r\nexport interface PaginationOptions {\r\n page?: number;\r\n limit?: number;\r\n defaultLimit?: number;\r\n maxLimit?: number;\r\n}\r\n\r\n/**\r\n * Pagination Result\r\n */\r\nexport interface PaginationResult {\r\n skip: number;\r\n limit: number;\r\n page: number;\r\n}\r\n\r\n/**\r\n * Build MongoDB filter query dynamically\r\n */\r\nexport const buildFilter = (options: FilterOptions): Record<string, unknown> => {\r\n const {\r\n organizationId,\r\n search,\r\n searchFields = [],\r\n dateField = 'createdAt',\r\n startDate,\r\n endDate,\r\n status,\r\n isActive,\r\n ...additionalFilters\r\n } = options;\r\n\r\n const filter: Record<string, unknown> = {};\r\n\r\n // Add organizationId if provided\r\n if (organizationId) {\r\n filter.organizationId = organizationId;\r\n }\r\n\r\n // Handle text search with regex (min 2 characters)\r\n if (search && search.trim().length >= 2 && searchFields.length > 0) {\r\n const searchRegex = new RegExp(search.trim(), 'i');\r\n filter.$or = searchFields.map((field) => ({ [field]: searchRegex }));\r\n }\r\n\r\n // Handle date range filtering\r\n if (startDate || endDate) {\r\n filter[dateField] = {};\r\n if (startDate) {\r\n (filter[dateField] as Record<string, unknown>).$gte = new Date(startDate);\r\n }\r\n if (endDate) {\r\n (filter[dateField] as Record<string, unknown>).$lte = new Date(endDate);\r\n }\r\n }\r\n\r\n // Handle status filter\r\n if (status !== undefined) {\r\n filter.status = status;\r\n }\r\n\r\n // Handle isActive filter\r\n if (isActive !== undefined) {\r\n filter.isActive = isActive;\r\n }\r\n\r\n // Add any additional filters\r\n Object.entries(additionalFilters).forEach(([key, value]) => {\r\n if (value !== undefined && value !== null && value !== '') {\r\n filter[key] = value;\r\n }\r\n });\r\n\r\n return filter;\r\n};\r\n\r\n/**\r\n * Calculate pagination values\r\n */\r\nexport const buildPagination = (options: PaginationOptions): PaginationResult => {\r\n const { page = 1, limit, defaultLimit = 10, maxLimit = 100 } = options;\r\n\r\n const finalPage = Math.max(1, page);\r\n const finalLimit = Math.min(maxLimit, Math.max(1, limit || defaultLimit));\r\n const skip = (finalPage - 1) * finalLimit;\r\n\r\n return {\r\n skip,\r\n limit: finalLimit,\r\n page: finalPage,\r\n };\r\n};\r\n\r\n/**\r\n * Calculate pagination metadata for response\r\n */\r\nexport const buildPaginationMeta = (\r\n total: number,\r\n page: number,\r\n limit: number\r\n): {\r\n total: number;\r\n page: number;\r\n limit: number;\r\n totalPages: number;\r\n hasNextPage: boolean;\r\n hasPrevPage: boolean;\r\n} => {\r\n const totalPages = Math.ceil(total / limit);\r\n\r\n return {\r\n total,\r\n page,\r\n limit,\r\n totalPages,\r\n hasNextPage: page < totalPages,\r\n hasPrevPage: page > 1,\r\n };\r\n};\r\n\r\nexport default {\r\n buildFilter,\r\n buildPagination,\r\n buildPaginationMeta,\r\n};\r\n","/**\r\n * Sanitize user object by removing sensitive fields\r\n */\r\nexport const sanitizeUser = <T extends Record<string, unknown>>(\r\n user: T | null | undefined,\r\n additionalFieldsToRemove: string[] = []\r\n): Omit<T, 'password' | '__v' | '_id'> | null => {\r\n if (!user) return null;\r\n\r\n const fieldsToRemove = ['password', '__v', '_id', ...additionalFieldsToRemove];\r\n\r\n // Handle mongoose documents\r\n const obj = typeof (user as any).toObject === 'function' \r\n ? (user as any).toObject() \r\n : { ...user };\r\n\r\n fieldsToRemove.forEach((field) => {\r\n delete obj[field];\r\n });\r\n\r\n return obj;\r\n};\r\n\r\n/**\r\n * Sanitize document by removing specified fields\r\n */\r\nexport const sanitizeDocument = <T extends Record<string, unknown>>(\r\n doc: T | null | undefined,\r\n fieldsToRemove: string[]\r\n): Partial<T> | null => {\r\n if (!doc) return null;\r\n\r\n // Handle mongoose documents\r\n const obj = typeof (doc as any).toObject === 'function' \r\n ? (doc as any).toObject() \r\n : { ...doc };\r\n\r\n fieldsToRemove.forEach((field) => {\r\n delete obj[field];\r\n });\r\n\r\n return obj;\r\n};\r\n\r\n/**\r\n * Pick specific fields from an object\r\n */\r\nexport const pickFields = <T extends Record<string, unknown>>(\r\n obj: T | null | undefined,\r\n fieldsToPick: (keyof T)[]\r\n): Partial<T> | null => {\r\n if (!obj) return null;\r\n\r\n const result: Partial<T> = {};\r\n\r\n fieldsToPick.forEach((field) => {\r\n if (field in obj) {\r\n result[field] = obj[field];\r\n }\r\n });\r\n\r\n return result;\r\n};\r\n\r\n/**\r\n * Omit specific fields from an object\r\n */\r\nexport const omitFields = <T extends Record<string, unknown>, K extends keyof T>(\r\n obj: T | null | undefined,\r\n fieldsToOmit: K[]\r\n): Omit<T, K> | null => {\r\n if (!obj) return null;\r\n\r\n const result = { ...obj };\r\n\r\n fieldsToOmit.forEach((field) => {\r\n delete result[field];\r\n });\r\n\r\n return result as Omit<T, K>;\r\n};\r\n\r\nexport default {\r\n sanitizeUser,\r\n sanitizeDocument,\r\n pickFields,\r\n omitFields,\r\n};\r\n"]}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { A as ApiErrorResponse, a as ApiResponse, b as ApiSuccessResponse, B as BaseFilterParams, C as CreateResponse, D as DeleteResponse, F as FilterWithPagination, G as GetResponse, L as ListResponse, P as PaginatedResponse, c as PaginationMeta, d as PaginationParams, U as UpdateResponse } from '../response.types-D--UhLJq.mjs';
|
|
2
|
+
export { e as AuditableEntity, b as AuthResponse, A as AuthTokens, d as BaseEntity, B as BaseUser, C as ChangePasswordRequest, W as DATE_FORMATS, M as DateInput, E as EnvConfig, F as ForgotPasswordRequest, H as HTTP_STATUS, s as HTTP_STATUS_MESSAGES, r as HttpStatusCode, I as ID, J as JwtPayload, K as KeyValuePair, L as LoginCredentials, N as Nullable, f as ObjectId, g as Optional, O as OrganizationEntity, P as PAGINATION, y as ROLES, R as RegisterCredentials, h as RequiredFields, c as ResetPasswordRequest, z as RoleValue, t as STATUS, j as SelectOption, S as SoftDeleteEntity, l as SortConfig, k as SortOrder, u as StatusValue, D as TOKEN_TYPES, T as Timestamps, G as TokenType, w as USER_STATUS, a as UserRole, x as UserStatusValue, U as UserWithRole, az as VALIDATION_MESSAGES, as as VALIDATION_PATTERNS, aA as VALIDATION_RULES, a6 as addTime, ar as combineDateAndTime, _ as dateTime, am as daysSince, al as daysUntil, ah as doDateRangesOverlap, X as formatDate, Z as formatDateInTimezone, a1 as formatDateRange, Y as formatDateTime, $ as formatRelativeTime, a0 as formatSmartDate, a3 as fromTimezone, ai as getAge, a8 as getDateDifference, ac as getDayBoundaries, a9 as getDaysInRange, m as getEnv, n as getEnvOptional, ae as getMonthBoundaries, ab as getMonthsInRange, a5 as getTimezoneDifference, ad as getWeekBoundaries, aa as getWeeksInRange, af as getYearBoundaries, ag as isDateBetween, p as isDev, o as isProd, q as isTest, V as isValidDate, at as isValidEmail, au as isValidPassword, av as isValidPhone, ay as isValidSlug, aw as isValidUrl, ax as isValidUsername, ak as isWeekday, aj as isWeekend, a4 as nowInTimezone, Q as parseDate, aq as setTime, a7 as subtractTime, an as toDateInputValue, ao as toDateTimeInputValue, ap as toTimeInputValue, a2 as toTimezone, v as validateEnv } from '../index-DSW6JfD-.mjs';
|
|
3
|
+
export { addDays, addHours, addMinutes, addMonths, addWeeks, addYears, differenceInDays, differenceInHours, differenceInMinutes, differenceInMonths, differenceInSeconds, differenceInWeeks, differenceInYears, eachDayOfInterval, eachMonthOfInterval, eachWeekOfInterval, endOfDay, endOfMonth, endOfWeek, endOfYear, format, formatDistance, formatDistanceToNow, formatDuration, formatRelative, getDate, getDay, getHours, getMinutes, getMonth, getSeconds, getYear, intervalToDuration, isAfter, isBefore, isEqual, isFuture, isPast, isSameDay, isSameMonth, isSameWeek, isSameYear, isThisMonth, isThisWeek, isThisYear, isToday, isTomorrow, isValid, isYesterday, parseISO, setHours, setMinutes, setSeconds, startOfDay, startOfMonth, startOfWeek, startOfYear, subDays, subHours, subMinutes, subMonths, subWeeks, subYears } from 'date-fns';
|
|
4
|
+
export { formatInTimeZone, fromZonedTime, toZonedTime } from 'date-fns-tz';
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { A as ApiErrorResponse, a as ApiResponse, b as ApiSuccessResponse, B as BaseFilterParams, C as CreateResponse, D as DeleteResponse, F as FilterWithPagination, G as GetResponse, L as ListResponse, P as PaginatedResponse, c as PaginationMeta, d as PaginationParams, U as UpdateResponse } from '../response.types-D--UhLJq.js';
|
|
2
|
+
export { e as AuditableEntity, b as AuthResponse, A as AuthTokens, d as BaseEntity, B as BaseUser, C as ChangePasswordRequest, W as DATE_FORMATS, M as DateInput, E as EnvConfig, F as ForgotPasswordRequest, H as HTTP_STATUS, s as HTTP_STATUS_MESSAGES, r as HttpStatusCode, I as ID, J as JwtPayload, K as KeyValuePair, L as LoginCredentials, N as Nullable, f as ObjectId, g as Optional, O as OrganizationEntity, P as PAGINATION, y as ROLES, R as RegisterCredentials, h as RequiredFields, c as ResetPasswordRequest, z as RoleValue, t as STATUS, j as SelectOption, S as SoftDeleteEntity, l as SortConfig, k as SortOrder, u as StatusValue, D as TOKEN_TYPES, T as Timestamps, G as TokenType, w as USER_STATUS, a as UserRole, x as UserStatusValue, U as UserWithRole, az as VALIDATION_MESSAGES, as as VALIDATION_PATTERNS, aA as VALIDATION_RULES, a6 as addTime, ar as combineDateAndTime, _ as dateTime, am as daysSince, al as daysUntil, ah as doDateRangesOverlap, X as formatDate, Z as formatDateInTimezone, a1 as formatDateRange, Y as formatDateTime, $ as formatRelativeTime, a0 as formatSmartDate, a3 as fromTimezone, ai as getAge, a8 as getDateDifference, ac as getDayBoundaries, a9 as getDaysInRange, m as getEnv, n as getEnvOptional, ae as getMonthBoundaries, ab as getMonthsInRange, a5 as getTimezoneDifference, ad as getWeekBoundaries, aa as getWeeksInRange, af as getYearBoundaries, ag as isDateBetween, p as isDev, o as isProd, q as isTest, V as isValidDate, at as isValidEmail, au as isValidPassword, av as isValidPhone, ay as isValidSlug, aw as isValidUrl, ax as isValidUsername, ak as isWeekday, aj as isWeekend, a4 as nowInTimezone, Q as parseDate, aq as setTime, a7 as subtractTime, an as toDateInputValue, ao as toDateTimeInputValue, ap as toTimeInputValue, a2 as toTimezone, v as validateEnv } from '../index-ClWtDfwk.js';
|
|
3
|
+
export { addDays, addHours, addMinutes, addMonths, addWeeks, addYears, differenceInDays, differenceInHours, differenceInMinutes, differenceInMonths, differenceInSeconds, differenceInWeeks, differenceInYears, eachDayOfInterval, eachMonthOfInterval, eachWeekOfInterval, endOfDay, endOfMonth, endOfWeek, endOfYear, format, formatDistance, formatDistanceToNow, formatDuration, formatRelative, getDate, getDay, getHours, getMinutes, getMonth, getSeconds, getYear, intervalToDuration, isAfter, isBefore, isEqual, isFuture, isPast, isSameDay, isSameMonth, isSameWeek, isSameYear, isThisMonth, isThisWeek, isThisYear, isToday, isTomorrow, isValid, isYesterday, parseISO, setHours, setMinutes, setSeconds, startOfDay, startOfMonth, startOfWeek, startOfYear, subDays, subHours, subMinutes, subMonths, subWeeks, subYears } from 'date-fns';
|
|
4
|
+
export { formatInTimeZone, fromZonedTime, toZonedTime } from 'date-fns-tz';
|