nextjs-cms 0.5.9 → 0.5.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/api/axios/axiosInstance.d.ts +1 -1
- package/dist/api/axios/axiosInstance.js +8 -8
- package/dist/api/index.d.ts +855 -855
- package/dist/api/index.d.ts.map +1 -1
- package/dist/api/index.js +12 -12
- package/dist/api/lib/serverActions.d.ts +239 -239
- package/dist/api/lib/serverActions.d.ts.map +1 -1
- package/dist/api/lib/serverActions.js +834 -834
- package/dist/api/root.d.ts +828 -828
- package/dist/api/root.js +30 -30
- package/dist/api/routers/accountSettings.d.ts +60 -60
- package/dist/api/routers/accountSettings.js +108 -108
- package/dist/api/routers/admins.d.ts +105 -105
- package/dist/api/routers/admins.js +219 -219
- package/dist/api/routers/auth.d.ts +47 -47
- package/dist/api/routers/auth.js +25 -25
- package/dist/api/routers/categorySection.d.ts +103 -103
- package/dist/api/routers/categorySection.js +38 -38
- package/dist/api/routers/cmsSettings.d.ts +48 -48
- package/dist/api/routers/cmsSettings.js +51 -51
- package/dist/api/routers/cpanel.d.ts +83 -83
- package/dist/api/routers/cpanel.js +216 -216
- package/dist/api/routers/files.d.ts +47 -47
- package/dist/api/routers/files.js +23 -23
- package/dist/api/routers/gallery.d.ts +35 -35
- package/dist/api/routers/gallery.js +62 -62
- package/dist/api/routers/googleAnalytics.d.ts +30 -30
- package/dist/api/routers/googleAnalytics.js +7 -7
- package/dist/api/routers/hasItemsSection.d.ts +139 -139
- package/dist/api/routers/hasItemsSection.js +34 -34
- package/dist/api/routers/navigation.d.ts +51 -51
- package/dist/api/routers/navigation.js +11 -11
- package/dist/api/routers/simpleSection.d.ts +57 -57
- package/dist/api/routers/simpleSection.js +12 -12
- package/dist/api/trpc.d.ts +106 -106
- package/dist/api/trpc.js +72 -72
- package/dist/auth/axios/axiosInstance.d.ts +1 -1
- package/dist/auth/axios/axiosInstance.js +8 -8
- package/dist/auth/csrf.d.ts +29 -29
- package/dist/auth/csrf.js +76 -76
- package/dist/auth/hooks/index.d.ts +3 -3
- package/dist/auth/hooks/index.d.ts.map +1 -1
- package/dist/auth/hooks/index.js +3 -3
- package/dist/auth/hooks/useAxiosPrivate.d.ts +4 -4
- package/dist/auth/hooks/useAxiosPrivate.js +74 -74
- package/dist/auth/hooks/useRefreshToken.d.ts +6 -6
- package/dist/auth/hooks/useRefreshToken.js +79 -79
- package/dist/auth/index.d.ts +22 -22
- package/dist/auth/index.js +44 -44
- package/dist/auth/jwt.d.ts +5 -5
- package/dist/auth/jwt.js +25 -25
- package/dist/auth/lib/actions.d.ts +32 -32
- package/dist/auth/lib/actions.d.ts.map +1 -1
- package/dist/auth/lib/actions.js +209 -209
- package/dist/auth/lib/client.d.ts +3 -3
- package/dist/auth/lib/client.js +46 -46
- package/dist/auth/lib/index.d.ts +2 -2
- package/dist/auth/lib/index.d.ts.map +1 -1
- package/dist/auth/lib/index.js +2 -2
- package/dist/auth/react.d.ts +105 -105
- package/dist/auth/react.d.ts.map +1 -1
- package/dist/auth/react.js +347 -347
- package/dist/auth/trpc.d.ts +5 -5
- package/dist/auth/trpc.d.ts.map +1 -1
- package/dist/auth/trpc.js +81 -81
- package/dist/core/config/config-loader.d.ts +91 -91
- package/dist/core/config/config-loader.js +230 -230
- package/dist/core/config/index.d.ts +2 -2
- package/dist/core/config/index.d.ts.map +1 -1
- package/dist/core/config/index.js +1 -1
- package/dist/core/config/loader.d.ts +1 -1
- package/dist/core/config/loader.js +42 -42
- package/dist/core/db/index.d.ts +1 -1
- package/dist/core/db/index.d.ts.map +1 -1
- package/dist/core/db/index.js +1 -1
- package/dist/core/db/table-checker/DbTable.d.ts +5 -5
- package/dist/core/db/table-checker/DbTable.js +5 -5
- package/dist/core/db/table-checker/MysqlTable.d.ts +33 -33
- package/dist/core/db/table-checker/MysqlTable.d.ts.map +1 -1
- package/dist/core/db/table-checker/MysqlTable.js +94 -94
- package/dist/core/db/table-checker/index.d.ts +1 -1
- package/dist/core/db/table-checker/index.d.ts.map +1 -1
- package/dist/core/db/table-checker/index.js +1 -1
- package/dist/core/factories/FieldFactory.d.ts +123 -123
- package/dist/core/factories/FieldFactory.d.ts.map +1 -1
- package/dist/core/factories/FieldFactory.js +411 -411
- package/dist/core/factories/SectionFactory.d.ts +109 -109
- package/dist/core/factories/SectionFactory.d.ts.map +1 -1
- package/dist/core/factories/SectionFactory.js +415 -415
- package/dist/core/factories/index.d.ts +2 -2
- package/dist/core/factories/index.d.ts.map +1 -1
- package/dist/core/factories/index.js +2 -2
- package/dist/core/fields/checkbox.d.ts +62 -62
- package/dist/core/fields/checkbox.d.ts.map +1 -1
- package/dist/core/fields/checkbox.js +62 -62
- package/dist/core/fields/color.d.ts +83 -83
- package/dist/core/fields/color.d.ts.map +1 -1
- package/dist/core/fields/color.js +91 -91
- package/dist/core/fields/date.d.ts +99 -99
- package/dist/core/fields/date.d.ts.map +1 -1
- package/dist/core/fields/date.js +108 -108
- package/dist/core/fields/document.d.ts +179 -179
- package/dist/core/fields/document.d.ts.map +1 -1
- package/dist/core/fields/document.js +277 -277
- package/dist/core/fields/field-group.d.ts +17 -17
- package/dist/core/fields/field-group.d.ts.map +1 -1
- package/dist/core/fields/field-group.js +6 -6
- package/dist/core/fields/field.d.ts +125 -125
- package/dist/core/fields/field.d.ts.map +1 -1
- package/dist/core/fields/field.js +148 -148
- package/dist/core/fields/fileField.d.ts +14 -14
- package/dist/core/fields/fileField.d.ts.map +1 -1
- package/dist/core/fields/fileField.js +5 -5
- package/dist/core/fields/index.d.ts +64 -64
- package/dist/core/fields/index.d.ts.map +1 -1
- package/dist/core/fields/index.js +18 -18
- package/dist/core/fields/map.d.ts +166 -166
- package/dist/core/fields/map.d.ts.map +1 -1
- package/dist/core/fields/map.js +152 -152
- package/dist/core/fields/number.d.ts +185 -185
- package/dist/core/fields/number.d.ts.map +1 -1
- package/dist/core/fields/number.js +241 -241
- package/dist/core/fields/password.d.ts +108 -108
- package/dist/core/fields/password.d.ts.map +1 -1
- package/dist/core/fields/password.js +133 -133
- package/dist/core/fields/photo.d.ts +288 -288
- package/dist/core/fields/photo.d.ts.map +1 -1
- package/dist/core/fields/photo.js +410 -410
- package/dist/core/fields/richText.d.ts +294 -294
- package/dist/core/fields/richText.d.ts.map +1 -1
- package/dist/core/fields/richText.js +338 -338
- package/dist/core/fields/select.d.ts +365 -365
- package/dist/core/fields/select.d.ts.map +1 -1
- package/dist/core/fields/select.js +499 -499
- package/dist/core/fields/selectMultiple.d.ts +235 -235
- package/dist/core/fields/selectMultiple.d.ts.map +1 -1
- package/dist/core/fields/selectMultiple.js +417 -417
- package/dist/core/fields/tags.d.ts +130 -130
- package/dist/core/fields/tags.d.ts.map +1 -1
- package/dist/core/fields/tags.js +105 -105
- package/dist/core/fields/text.d.ts +135 -135
- package/dist/core/fields/text.d.ts.map +1 -1
- package/dist/core/fields/text.js +157 -157
- package/dist/core/fields/textArea.d.ts +106 -106
- package/dist/core/fields/textArea.d.ts.map +1 -1
- package/dist/core/fields/textArea.js +126 -126
- package/dist/core/fields/video.d.ts +147 -147
- package/dist/core/fields/video.d.ts.map +1 -1
- package/dist/core/fields/video.js +248 -248
- package/dist/core/helpers/entity.d.ts +7 -7
- package/dist/core/helpers/entity.js +27 -27
- package/dist/core/helpers/index.d.ts +4 -4
- package/dist/core/helpers/index.d.ts.map +1 -1
- package/dist/core/helpers/index.js +3 -3
- package/dist/core/index.d.ts +7 -7
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +7 -7
- package/dist/core/sections/category.d.ts +282 -282
- package/dist/core/sections/category.d.ts.map +1 -1
- package/dist/core/sections/category.js +147 -147
- package/dist/core/sections/hasItems.d.ts +631 -631
- package/dist/core/sections/hasItems.d.ts.map +1 -1
- package/dist/core/sections/hasItems.js +144 -144
- package/dist/core/sections/index.d.ts +4 -4
- package/dist/core/sections/index.d.ts.map +1 -1
- package/dist/core/sections/index.js +4 -4
- package/dist/core/sections/section.d.ts +225 -225
- package/dist/core/sections/section.d.ts.map +1 -1
- package/dist/core/sections/section.js +341 -341
- package/dist/core/sections/simple.d.ts +98 -98
- package/dist/core/sections/simple.d.ts.map +1 -1
- package/dist/core/sections/simple.js +95 -95
- package/dist/core/security/dom.d.ts +10 -10
- package/dist/core/security/dom.js +92 -92
- package/dist/core/submit/ItemEditSubmit.d.ts +75 -75
- package/dist/core/submit/ItemEditSubmit.js +186 -186
- package/dist/core/submit/NewItemSubmit.d.ts +13 -13
- package/dist/core/submit/NewItemSubmit.js +93 -93
- package/dist/core/submit/SimpleSectionSubmit.d.ts +12 -12
- package/dist/core/submit/SimpleSectionSubmit.js +93 -93
- package/dist/core/submit/index.d.ts +4 -4
- package/dist/core/submit/index.js +4 -4
- package/dist/core/submit/submit.d.ts +115 -115
- package/dist/core/submit/submit.js +479 -479
- package/dist/core/types/index.d.ts +279 -279
- package/dist/core/types/index.d.ts.map +1 -1
- package/dist/core/types/index.js +1 -1
- package/dist/db/client.d.ts +8 -8
- package/dist/db/client.d.ts.map +1 -1
- package/dist/db/client.js +19 -19
- package/dist/db/config.d.ts +5 -5
- package/dist/db/config.js +22 -22
- package/dist/db/drizzle.config.d.ts +5 -5
- package/dist/db/drizzle.config.js +18 -18
- package/dist/db/index.d.ts +2 -2
- package/dist/db/index.js +3 -3
- package/dist/db/schema.d.ts +638 -638
- package/dist/db/schema.js +73 -73
- package/dist/index.d.ts +7 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -7
- package/dist/translations/index.d.ts +2 -2
- package/dist/translations/index.js +15 -15
- package/dist/utils/CpanelApi.d.ts +24 -24
- package/dist/utils/CpanelApi.js +64 -64
- package/dist/utils/constants.d.ts +13 -13
- package/dist/utils/constants.js +61 -61
- package/dist/utils/index.d.ts +4 -4
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +4 -4
- package/dist/utils/utils.d.ts +59 -59
- package/dist/utils/utils.js +132 -132
- package/dist/validators/checkbox.d.ts +3 -3
- package/dist/validators/checkbox.d.ts.map +1 -1
- package/dist/validators/checkbox.js +12 -12
- package/dist/validators/color.d.ts +3 -3
- package/dist/validators/color.d.ts.map +1 -1
- package/dist/validators/color.js +7 -7
- package/dist/validators/date.d.ts +3 -3
- package/dist/validators/date.d.ts.map +1 -1
- package/dist/validators/date.js +5 -5
- package/dist/validators/document.d.ts +3 -3
- package/dist/validators/document.d.ts.map +1 -1
- package/dist/validators/document.js +57 -57
- package/dist/validators/index.d.ts +14 -14
- package/dist/validators/index.d.ts.map +1 -1
- package/dist/validators/index.js +14 -14
- package/dist/validators/map.d.ts +3 -3
- package/dist/validators/map.d.ts.map +1 -1
- package/dist/validators/map.js +5 -5
- package/dist/validators/number.d.ts +3 -3
- package/dist/validators/number.d.ts.map +1 -1
- package/dist/validators/number.js +20 -20
- package/dist/validators/password.d.ts +3 -3
- package/dist/validators/password.d.ts.map +1 -1
- package/dist/validators/password.js +11 -11
- package/dist/validators/photo.d.ts +3 -3
- package/dist/validators/photo.d.ts.map +1 -1
- package/dist/validators/photo.js +100 -100
- package/dist/validators/richText.d.ts +3 -3
- package/dist/validators/richText.d.ts.map +1 -1
- package/dist/validators/richText.js +8 -8
- package/dist/validators/select-multiple.d.ts +9 -9
- package/dist/validators/select-multiple.d.ts.map +1 -1
- package/dist/validators/select-multiple.js +20 -20
- package/dist/validators/select.d.ts +3 -3
- package/dist/validators/select.d.ts.map +1 -1
- package/dist/validators/select.js +5 -5
- package/dist/validators/text.d.ts +3 -3
- package/dist/validators/text.d.ts.map +1 -1
- package/dist/validators/text.js +7 -7
- package/dist/validators/textarea.d.ts +3 -3
- package/dist/validators/textarea.d.ts.map +1 -1
- package/dist/validators/textarea.js +7 -7
- package/dist/validators/video.d.ts +3 -3
- package/dist/validators/video.d.ts.map +1 -1
- package/dist/validators/video.js +57 -57
- package/package.json +4 -5
package/dist/utils/utils.d.ts
CHANGED
|
@@ -1,60 +1,60 @@
|
|
|
1
|
-
import type { ClassValue } from 'clsx';
|
|
2
|
-
/**
|
|
3
|
-
* Function to merge Tailwind CSS classes
|
|
4
|
-
* @param inputs
|
|
5
|
-
*/
|
|
6
|
-
export declare function cn(...inputs: ClassValue[]): string;
|
|
7
|
-
/**
|
|
8
|
-
* Function to sanitize folder names
|
|
9
|
-
* @param string
|
|
10
|
-
*/
|
|
11
|
-
export declare const sanitizeFolderOrFileName: (string: string) => string;
|
|
12
|
-
/**
|
|
13
|
-
* Function to sanitize file names
|
|
14
|
-
* @param string
|
|
15
|
-
*/
|
|
16
|
-
export declare const sanitizeFileName: (string: string) => string;
|
|
17
|
-
/**
|
|
18
|
-
* Function to format a number with commas
|
|
19
|
-
* @param number
|
|
20
|
-
*/
|
|
21
|
-
export declare const formatNumber: (number: number) => string;
|
|
22
|
-
/**
|
|
23
|
-
* Function to convert a base64 string to a Blob
|
|
24
|
-
* @param base64
|
|
25
|
-
* @param contentType
|
|
26
|
-
* @param stripHeader
|
|
27
|
-
*/
|
|
28
|
-
export declare function base64ToBlob({ base64, contentType, stripHeader, }: {
|
|
29
|
-
base64: string;
|
|
30
|
-
contentType: string;
|
|
31
|
-
stripHeader?: boolean;
|
|
32
|
-
}): Blob;
|
|
33
|
-
/**
|
|
34
|
-
* Function to display a date in a human-readable format from a string
|
|
35
|
-
* @param string
|
|
36
|
-
* @param lang
|
|
37
|
-
* @param displayWeekday
|
|
38
|
-
* @param separator
|
|
39
|
-
*/
|
|
40
|
-
export declare const displayDateFromString: (string: string, lang: string, displayWeekday: boolean, separator: "/" | ",") => string;
|
|
41
|
-
/**
|
|
42
|
-
* Function to display a date in a human-readable format from a Date object
|
|
43
|
-
* @param date
|
|
44
|
-
* @param lang
|
|
45
|
-
* @param displayWeekday
|
|
46
|
-
* @param separator
|
|
47
|
-
*/
|
|
48
|
-
export declare const displayDateFromDate: (date: Date, lang: string, displayWeekday: boolean, separator: "/" | ",") => string;
|
|
49
|
-
/**
|
|
50
|
-
* Function to capitalize the first letter of a string or all words
|
|
51
|
-
* @param input
|
|
52
|
-
* @param allWords
|
|
53
|
-
*/
|
|
54
|
-
export declare function capitalizeWords(input: string, allWords?: boolean): string;
|
|
55
|
-
/**
|
|
56
|
-
* Function to display a file size in a human-readable format
|
|
57
|
-
* @param sizeInBytes
|
|
58
|
-
*/
|
|
59
|
-
export declare function humanReadableFileSize(sizeInBytes: number, decimals?: number): string;
|
|
1
|
+
import type { ClassValue } from 'clsx';
|
|
2
|
+
/**
|
|
3
|
+
* Function to merge Tailwind CSS classes
|
|
4
|
+
* @param inputs
|
|
5
|
+
*/
|
|
6
|
+
export declare function cn(...inputs: ClassValue[]): string;
|
|
7
|
+
/**
|
|
8
|
+
* Function to sanitize folder names
|
|
9
|
+
* @param string
|
|
10
|
+
*/
|
|
11
|
+
export declare const sanitizeFolderOrFileName: (string: string) => string;
|
|
12
|
+
/**
|
|
13
|
+
* Function to sanitize file names
|
|
14
|
+
* @param string
|
|
15
|
+
*/
|
|
16
|
+
export declare const sanitizeFileName: (string: string) => string;
|
|
17
|
+
/**
|
|
18
|
+
* Function to format a number with commas
|
|
19
|
+
* @param number
|
|
20
|
+
*/
|
|
21
|
+
export declare const formatNumber: (number: number) => string;
|
|
22
|
+
/**
|
|
23
|
+
* Function to convert a base64 string to a Blob
|
|
24
|
+
* @param base64
|
|
25
|
+
* @param contentType
|
|
26
|
+
* @param stripHeader
|
|
27
|
+
*/
|
|
28
|
+
export declare function base64ToBlob({ base64, contentType, stripHeader, }: {
|
|
29
|
+
base64: string;
|
|
30
|
+
contentType: string;
|
|
31
|
+
stripHeader?: boolean;
|
|
32
|
+
}): Blob;
|
|
33
|
+
/**
|
|
34
|
+
* Function to display a date in a human-readable format from a string
|
|
35
|
+
* @param string
|
|
36
|
+
* @param lang
|
|
37
|
+
* @param displayWeekday
|
|
38
|
+
* @param separator
|
|
39
|
+
*/
|
|
40
|
+
export declare const displayDateFromString: (string: string, lang: string, displayWeekday: boolean, separator: "/" | ",") => string;
|
|
41
|
+
/**
|
|
42
|
+
* Function to display a date in a human-readable format from a Date object
|
|
43
|
+
* @param date
|
|
44
|
+
* @param lang
|
|
45
|
+
* @param displayWeekday
|
|
46
|
+
* @param separator
|
|
47
|
+
*/
|
|
48
|
+
export declare const displayDateFromDate: (date: Date, lang: string, displayWeekday: boolean, separator: "/" | ",") => string;
|
|
49
|
+
/**
|
|
50
|
+
* Function to capitalize the first letter of a string or all words
|
|
51
|
+
* @param input
|
|
52
|
+
* @param allWords
|
|
53
|
+
*/
|
|
54
|
+
export declare function capitalizeWords(input: string, allWords?: boolean): string;
|
|
55
|
+
/**
|
|
56
|
+
* Function to display a file size in a human-readable format
|
|
57
|
+
* @param sizeInBytes
|
|
58
|
+
*/
|
|
59
|
+
export declare function humanReadableFileSize(sizeInBytes: number, decimals?: number): string;
|
|
60
60
|
//# sourceMappingURL=utils.d.ts.map
|
package/dist/utils/utils.js
CHANGED
|
@@ -1,132 +1,132 @@
|
|
|
1
|
-
import { arabicMonths, arabicWeekDays } from
|
|
2
|
-
import { clsx } from 'clsx';
|
|
3
|
-
import { twMerge } from 'tailwind-merge';
|
|
4
|
-
/**
|
|
5
|
-
* Function to merge Tailwind CSS classes
|
|
6
|
-
* @param inputs
|
|
7
|
-
*/
|
|
8
|
-
export function cn(...inputs) {
|
|
9
|
-
return twMerge(clsx(inputs));
|
|
10
|
-
}
|
|
11
|
-
/**
|
|
12
|
-
* Function to sanitize folder names
|
|
13
|
-
* @param string
|
|
14
|
-
*/
|
|
15
|
-
export const sanitizeFolderOrFileName = (string) => {
|
|
16
|
-
// Replace any character that is not a letter, number, hyphen, or underscore with an empty string
|
|
17
|
-
return string.replace(/[^a-zA-Z0-9-_]/g, '');
|
|
18
|
-
};
|
|
19
|
-
/**
|
|
20
|
-
* Function to sanitize file names
|
|
21
|
-
* @param string
|
|
22
|
-
*/
|
|
23
|
-
export const sanitizeFileName = (string) => {
|
|
24
|
-
// Replace any character that is not a letter, number, hyphen, underscore or a dot with an empty string
|
|
25
|
-
return string.replace(/[^a-zA-Z0-9-_.]/g, '');
|
|
26
|
-
};
|
|
27
|
-
/**
|
|
28
|
-
* Function to format a number with commas
|
|
29
|
-
* @param number
|
|
30
|
-
*/
|
|
31
|
-
export const formatNumber = (number) => {
|
|
32
|
-
return Intl.NumberFormat('en-US', { maximumFractionDigits: 2 }).format(number);
|
|
33
|
-
};
|
|
34
|
-
// Nice approach too!
|
|
35
|
-
/*export const b64toBlob = (base64: string, contentType = 'application/octet-stream') =>
|
|
36
|
-
fetch(`data:${contentType};base64,${base64}`).then((res) => res.blob())*/
|
|
37
|
-
/**
|
|
38
|
-
* Function to convert a base64 string to a Blob
|
|
39
|
-
* @param base64
|
|
40
|
-
* @param contentType
|
|
41
|
-
* @param stripHeader
|
|
42
|
-
*/
|
|
43
|
-
export function base64ToBlob({ base64, contentType, stripHeader, }) {
|
|
44
|
-
if (stripHeader) {
|
|
45
|
-
// remove data:image/*;base64 at the beginning of the string
|
|
46
|
-
base64 = base64.split(',')[1] || base64;
|
|
47
|
-
}
|
|
48
|
-
try {
|
|
49
|
-
const binaryString = atob(base64);
|
|
50
|
-
const len = binaryString.length;
|
|
51
|
-
const bytes = new Uint8Array(len);
|
|
52
|
-
for (let i = 0; i < len; i++) {
|
|
53
|
-
bytes[i] = binaryString.charCodeAt(i);
|
|
54
|
-
}
|
|
55
|
-
return new Blob([bytes], { type: contentType });
|
|
56
|
-
}
|
|
57
|
-
catch (e) {
|
|
58
|
-
return new Blob();
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
/**
|
|
62
|
-
* Function to display a date in a human-readable format from a string
|
|
63
|
-
* @param string
|
|
64
|
-
* @param lang
|
|
65
|
-
* @param displayWeekday
|
|
66
|
-
* @param separator
|
|
67
|
-
*/
|
|
68
|
-
export const displayDateFromString = (string, lang, displayWeekday, separator) => {
|
|
69
|
-
const date = new Date(string);
|
|
70
|
-
return displayDateFromDate(date, lang, displayWeekday, separator);
|
|
71
|
-
};
|
|
72
|
-
/**
|
|
73
|
-
* Function to display a date in a human-readable format from a Date object
|
|
74
|
-
* @param date
|
|
75
|
-
* @param lang
|
|
76
|
-
* @param displayWeekday
|
|
77
|
-
* @param separator
|
|
78
|
-
*/
|
|
79
|
-
export const displayDateFromDate = (date, lang, displayWeekday, separator) => {
|
|
80
|
-
const month = date.toLocaleString('en-US', { month: 'short' });
|
|
81
|
-
const weekDay = date.toLocaleString('en-US', { weekday: 'short' });
|
|
82
|
-
const day = date.toLocaleString('en-US', { day: '2-digit' });
|
|
83
|
-
const year = date.getFullYear();
|
|
84
|
-
let result = '';
|
|
85
|
-
if (separator === ',') {
|
|
86
|
-
result = `${lang === 'ar' ? arabicMonths[month] : month} ${displayWeekday ? (lang === 'ar' ? arabicWeekDays[weekDay] : weekDay) : ''} ${day}, ${year}`;
|
|
87
|
-
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
|
|
88
|
-
}
|
|
89
|
-
else if (separator === '/') {
|
|
90
|
-
result = `${lang === 'ar' ? arabicMonths[month] : month} / ${displayWeekday ? (lang === 'ar' ? arabicWeekDays[weekDay] : weekDay) : ''} ${day} / ${year}`;
|
|
91
|
-
}
|
|
92
|
-
return result;
|
|
93
|
-
};
|
|
94
|
-
/**
|
|
95
|
-
* Function to capitalize the first letter of a string or all words
|
|
96
|
-
* @param input
|
|
97
|
-
* @param allWords
|
|
98
|
-
*/
|
|
99
|
-
export function capitalizeWords(input, allWords = true) {
|
|
100
|
-
if (allWords) {
|
|
101
|
-
// Capitalize all words
|
|
102
|
-
return input
|
|
103
|
-
.split(' ')
|
|
104
|
-
.map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())
|
|
105
|
-
.join(' ');
|
|
106
|
-
}
|
|
107
|
-
else {
|
|
108
|
-
// Capitalize only the first word
|
|
109
|
-
return input.charAt(0).toUpperCase() + input.slice(1).toLowerCase();
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
/**
|
|
113
|
-
* Function to display a file size in a human-readable format
|
|
114
|
-
* @param sizeInBytes
|
|
115
|
-
*/
|
|
116
|
-
export function humanReadableFileSize(sizeInBytes, decimals = 2) {
|
|
117
|
-
const units = ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];
|
|
118
|
-
let index = 0;
|
|
119
|
-
// Scale down the size until it's less than 1024
|
|
120
|
-
while (sizeInBytes >= 1024 && index < units.length - 1) {
|
|
121
|
-
sizeInBytes /= 1024;
|
|
122
|
-
index++;
|
|
123
|
-
}
|
|
124
|
-
// Handle zero case
|
|
125
|
-
if (sizeInBytes === 0) {
|
|
126
|
-
return `0 ${units[index]}`;
|
|
127
|
-
}
|
|
128
|
-
// Round to specified decimal places and remove trailing zeros
|
|
129
|
-
const formatted = sizeInBytes.toFixed(decimals);
|
|
130
|
-
const withoutTrailingZeros = parseFloat(formatted).toString();
|
|
131
|
-
return `${withoutTrailingZeros} ${units[index]}`;
|
|
132
|
-
}
|
|
1
|
+
import { arabicMonths, arabicWeekDays } from './constants.js';
|
|
2
|
+
import { clsx } from 'clsx';
|
|
3
|
+
import { twMerge } from 'tailwind-merge';
|
|
4
|
+
/**
|
|
5
|
+
* Function to merge Tailwind CSS classes
|
|
6
|
+
* @param inputs
|
|
7
|
+
*/
|
|
8
|
+
export function cn(...inputs) {
|
|
9
|
+
return twMerge(clsx(inputs));
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Function to sanitize folder names
|
|
13
|
+
* @param string
|
|
14
|
+
*/
|
|
15
|
+
export const sanitizeFolderOrFileName = (string) => {
|
|
16
|
+
// Replace any character that is not a letter, number, hyphen, or underscore with an empty string
|
|
17
|
+
return string.replace(/[^a-zA-Z0-9-_]/g, '');
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* Function to sanitize file names
|
|
21
|
+
* @param string
|
|
22
|
+
*/
|
|
23
|
+
export const sanitizeFileName = (string) => {
|
|
24
|
+
// Replace any character that is not a letter, number, hyphen, underscore or a dot with an empty string
|
|
25
|
+
return string.replace(/[^a-zA-Z0-9-_.]/g, '');
|
|
26
|
+
};
|
|
27
|
+
/**
|
|
28
|
+
* Function to format a number with commas
|
|
29
|
+
* @param number
|
|
30
|
+
*/
|
|
31
|
+
export const formatNumber = (number) => {
|
|
32
|
+
return Intl.NumberFormat('en-US', { maximumFractionDigits: 2 }).format(number);
|
|
33
|
+
};
|
|
34
|
+
// Nice approach too!
|
|
35
|
+
/*export const b64toBlob = (base64: string, contentType = 'application/octet-stream') =>
|
|
36
|
+
fetch(`data:${contentType};base64,${base64}`).then((res) => res.blob())*/
|
|
37
|
+
/**
|
|
38
|
+
* Function to convert a base64 string to a Blob
|
|
39
|
+
* @param base64
|
|
40
|
+
* @param contentType
|
|
41
|
+
* @param stripHeader
|
|
42
|
+
*/
|
|
43
|
+
export function base64ToBlob({ base64, contentType, stripHeader, }) {
|
|
44
|
+
if (stripHeader) {
|
|
45
|
+
// remove data:image/*;base64 at the beginning of the string
|
|
46
|
+
base64 = base64.split(',')[1] || base64;
|
|
47
|
+
}
|
|
48
|
+
try {
|
|
49
|
+
const binaryString = atob(base64);
|
|
50
|
+
const len = binaryString.length;
|
|
51
|
+
const bytes = new Uint8Array(len);
|
|
52
|
+
for (let i = 0; i < len; i++) {
|
|
53
|
+
bytes[i] = binaryString.charCodeAt(i);
|
|
54
|
+
}
|
|
55
|
+
return new Blob([bytes], { type: contentType });
|
|
56
|
+
}
|
|
57
|
+
catch (e) {
|
|
58
|
+
return new Blob();
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Function to display a date in a human-readable format from a string
|
|
63
|
+
* @param string
|
|
64
|
+
* @param lang
|
|
65
|
+
* @param displayWeekday
|
|
66
|
+
* @param separator
|
|
67
|
+
*/
|
|
68
|
+
export const displayDateFromString = (string, lang, displayWeekday, separator) => {
|
|
69
|
+
const date = new Date(string);
|
|
70
|
+
return displayDateFromDate(date, lang, displayWeekday, separator);
|
|
71
|
+
};
|
|
72
|
+
/**
|
|
73
|
+
* Function to display a date in a human-readable format from a Date object
|
|
74
|
+
* @param date
|
|
75
|
+
* @param lang
|
|
76
|
+
* @param displayWeekday
|
|
77
|
+
* @param separator
|
|
78
|
+
*/
|
|
79
|
+
export const displayDateFromDate = (date, lang, displayWeekday, separator) => {
|
|
80
|
+
const month = date.toLocaleString('en-US', { month: 'short' });
|
|
81
|
+
const weekDay = date.toLocaleString('en-US', { weekday: 'short' });
|
|
82
|
+
const day = date.toLocaleString('en-US', { day: '2-digit' });
|
|
83
|
+
const year = date.getFullYear();
|
|
84
|
+
let result = '';
|
|
85
|
+
if (separator === ',') {
|
|
86
|
+
result = `${lang === 'ar' ? arabicMonths[month] : month} ${displayWeekday ? (lang === 'ar' ? arabicWeekDays[weekDay] : weekDay) : ''} ${day}, ${year}`;
|
|
87
|
+
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
|
|
88
|
+
}
|
|
89
|
+
else if (separator === '/') {
|
|
90
|
+
result = `${lang === 'ar' ? arabicMonths[month] : month} / ${displayWeekday ? (lang === 'ar' ? arabicWeekDays[weekDay] : weekDay) : ''} ${day} / ${year}`;
|
|
91
|
+
}
|
|
92
|
+
return result;
|
|
93
|
+
};
|
|
94
|
+
/**
|
|
95
|
+
* Function to capitalize the first letter of a string or all words
|
|
96
|
+
* @param input
|
|
97
|
+
* @param allWords
|
|
98
|
+
*/
|
|
99
|
+
export function capitalizeWords(input, allWords = true) {
|
|
100
|
+
if (allWords) {
|
|
101
|
+
// Capitalize all words
|
|
102
|
+
return input
|
|
103
|
+
.split(' ')
|
|
104
|
+
.map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())
|
|
105
|
+
.join(' ');
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
// Capitalize only the first word
|
|
109
|
+
return input.charAt(0).toUpperCase() + input.slice(1).toLowerCase();
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Function to display a file size in a human-readable format
|
|
114
|
+
* @param sizeInBytes
|
|
115
|
+
*/
|
|
116
|
+
export function humanReadableFileSize(sizeInBytes, decimals = 2) {
|
|
117
|
+
const units = ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];
|
|
118
|
+
let index = 0;
|
|
119
|
+
// Scale down the size until it's less than 1024
|
|
120
|
+
while (sizeInBytes >= 1024 && index < units.length - 1) {
|
|
121
|
+
sizeInBytes /= 1024;
|
|
122
|
+
index++;
|
|
123
|
+
}
|
|
124
|
+
// Handle zero case
|
|
125
|
+
if (sizeInBytes === 0) {
|
|
126
|
+
return `0 ${units[index]}`;
|
|
127
|
+
}
|
|
128
|
+
// Round to specified decimal places and remove trailing zeros
|
|
129
|
+
const formatted = sizeInBytes.toFixed(decimals);
|
|
130
|
+
const withoutTrailingZeros = parseFloat(formatted).toString();
|
|
131
|
+
return `${withoutTrailingZeros} ${units[index]}`;
|
|
132
|
+
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import * as z from 'zod';
|
|
2
|
-
import type { CheckboxFieldClientConfig } from
|
|
3
|
-
export declare const checkboxFieldSchema: (field: CheckboxFieldClientConfig) => z.ZodPipe<z.ZodTransform<{} | undefined, unknown>, z.ZodOptional<z.ZodBoolean>>;
|
|
1
|
+
import * as z from 'zod';
|
|
2
|
+
import type { CheckboxFieldClientConfig } from '../core/fields/index.js';
|
|
3
|
+
export declare const checkboxFieldSchema: (field: CheckboxFieldClientConfig) => z.ZodPipe<z.ZodTransform<{} | undefined, unknown>, z.ZodOptional<z.ZodBoolean>>;
|
|
4
4
|
//# sourceMappingURL=checkbox.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"checkbox.d.ts","sourceRoot":"","sources":["../../src/validators/checkbox.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,KAAK,CAAA;AACxB,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"checkbox.d.ts","sourceRoot":"","sources":["../../src/validators/checkbox.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,KAAK,CAAA;AACxB,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAA;AAExE,eAAO,MAAM,mBAAmB,GAAI,OAAO,yBAAyB,oFASnE,CAAA"}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import * as z from 'zod';
|
|
2
|
-
export const checkboxFieldSchema = (field) => {
|
|
3
|
-
// Normalize typical form values
|
|
4
|
-
const normalized = z.preprocess((v) => {
|
|
5
|
-
if (v === 'on')
|
|
6
|
-
return true; // HTML checked checkbox
|
|
7
|
-
if (v === '' || v === null)
|
|
8
|
-
return undefined; // treat as missing
|
|
9
|
-
return v;
|
|
10
|
-
}, z.boolean().optional());
|
|
11
|
-
return field.required ? normalized.refine((v) => v === true, { message: 'Checkbox is required' }) : normalized; // allows undefined (unchecked) or a boolean if sent explicitly
|
|
12
|
-
};
|
|
1
|
+
import * as z from 'zod';
|
|
2
|
+
export const checkboxFieldSchema = (field) => {
|
|
3
|
+
// Normalize typical form values
|
|
4
|
+
const normalized = z.preprocess((v) => {
|
|
5
|
+
if (v === 'on')
|
|
6
|
+
return true; // HTML checked checkbox
|
|
7
|
+
if (v === '' || v === null)
|
|
8
|
+
return undefined; // treat as missing
|
|
9
|
+
return v;
|
|
10
|
+
}, z.boolean().optional());
|
|
11
|
+
return field.required ? normalized.refine((v) => v === true, { message: 'Checkbox is required' }) : normalized; // allows undefined (unchecked) or a boolean if sent explicitly
|
|
12
|
+
};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import * as z from 'zod';
|
|
2
|
-
import type { ColorFieldClientConfig } from
|
|
3
|
-
export declare const colorFieldSchema: (field: ColorFieldClientConfig) => z.ZodString | z.ZodOptional<z.ZodUnion<readonly [z.ZodLiteral<"">, z.ZodString]>>;
|
|
1
|
+
import * as z from 'zod';
|
|
2
|
+
import type { ColorFieldClientConfig } from '../core/fields/index.js';
|
|
3
|
+
export declare const colorFieldSchema: (field: ColorFieldClientConfig) => z.ZodString | z.ZodOptional<z.ZodUnion<readonly [z.ZodLiteral<"">, z.ZodString]>>;
|
|
4
4
|
//# sourceMappingURL=color.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"color.d.ts","sourceRoot":"","sources":["../../src/validators/color.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,KAAK,CAAA;AACxB,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"color.d.ts","sourceRoot":"","sources":["../../src/validators/color.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,KAAK,CAAA;AACxB,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAA;AAErE,eAAO,MAAM,gBAAgB,GAAI,OAAO,sBAAsB,sFAM7D,CAAA"}
|
package/dist/validators/color.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import * as z from 'zod';
|
|
2
|
-
export const colorFieldSchema = (field) => {
|
|
3
|
-
const base = z.string().regex(/^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/, {
|
|
4
|
-
message: 'Invalid color format, must be in hex format (#xxxxxx or #xxx)',
|
|
5
|
-
});
|
|
6
|
-
return field.required ? base : z.union([z.literal(''), base]).optional();
|
|
7
|
-
};
|
|
1
|
+
import * as z from 'zod';
|
|
2
|
+
export const colorFieldSchema = (field) => {
|
|
3
|
+
const base = z.string().regex(/^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/, {
|
|
4
|
+
message: 'Invalid color format, must be in hex format (#xxxxxx or #xxx)',
|
|
5
|
+
});
|
|
6
|
+
return field.required ? base : z.union([z.literal(''), base]).optional();
|
|
7
|
+
};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import * as z from 'zod';
|
|
2
|
-
import type { DateFieldClientConfig } from
|
|
3
|
-
export declare const dateFieldSchema: (field: DateFieldClientConfig) => z.ZodDate | z.ZodOptional<z.ZodUnion<readonly [z.ZodLiteral<"">, z.ZodDate]>>;
|
|
1
|
+
import * as z from 'zod';
|
|
2
|
+
import type { DateFieldClientConfig } from '../core/fields/index.js';
|
|
3
|
+
export declare const dateFieldSchema: (field: DateFieldClientConfig) => z.ZodDate | z.ZodOptional<z.ZodUnion<readonly [z.ZodLiteral<"">, z.ZodDate]>>;
|
|
4
4
|
//# sourceMappingURL=date.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"date.d.ts","sourceRoot":"","sources":["../../src/validators/date.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,KAAK,CAAA;AACxB,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"date.d.ts","sourceRoot":"","sources":["../../src/validators/date.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,KAAK,CAAA;AACxB,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAA;AAEpE,eAAO,MAAM,eAAe,GAAI,OAAO,qBAAqB,kFAI3D,CAAA"}
|
package/dist/validators/date.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import * as z from 'zod';
|
|
2
|
-
export const dateFieldSchema = (field) => {
|
|
3
|
-
const base = z.date();
|
|
4
|
-
return field.required ? base : z.union([z.literal(''), base]).optional();
|
|
5
|
-
};
|
|
1
|
+
import * as z from 'zod';
|
|
2
|
+
export const dateFieldSchema = (field) => {
|
|
3
|
+
const base = z.date();
|
|
4
|
+
return field.required ? base : z.union([z.literal(''), base]).optional();
|
|
5
|
+
};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import * as z from 'zod';
|
|
2
|
-
import type { DocumentFieldClientConfig } from
|
|
3
|
-
export declare const documentFieldSchema: (field: DocumentFieldClientConfig) => z.ZodCustom<File, File> | z.ZodOptional<z.ZodUnion<readonly [z.ZodNull, z.ZodUndefined, z.ZodCustom<File, File>]>>;
|
|
1
|
+
import * as z from 'zod';
|
|
2
|
+
import type { DocumentFieldClientConfig } from '../core/fields/index.js';
|
|
3
|
+
export declare const documentFieldSchema: (field: DocumentFieldClientConfig) => z.ZodCustom<File, File> | z.ZodOptional<z.ZodUnion<readonly [z.ZodNull, z.ZodUndefined, z.ZodCustom<File, File>]>>;
|
|
4
4
|
//# sourceMappingURL=document.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"document.d.ts","sourceRoot":"","sources":["../../src/validators/document.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,KAAK,CAAA;AACxB,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"document.d.ts","sourceRoot":"","sources":["../../src/validators/document.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,KAAK,CAAA;AACxB,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAA;AAExE,eAAO,MAAM,mBAAmB,GAAI,OAAO,yBAAyB,uHA4DnE,CAAA"}
|
|
@@ -1,57 +1,57 @@
|
|
|
1
|
-
import * as z from 'zod';
|
|
2
|
-
export const documentFieldSchema = (field) => {
|
|
3
|
-
/**
|
|
4
|
-
* Construct a custom schema for the photo field
|
|
5
|
-
*/
|
|
6
|
-
const base = z.instanceof(File).superRefine(async (file, ctx) => {
|
|
7
|
-
if (!file) {
|
|
8
|
-
// If empty but the field is required, add an issue
|
|
9
|
-
if (field.required) {
|
|
10
|
-
ctx.addIssue({
|
|
11
|
-
code: z.ZodIssueCode.custom,
|
|
12
|
-
message: 'No file selected',
|
|
13
|
-
});
|
|
14
|
-
}
|
|
15
|
-
return; // If it's not required, do nothing (no issue).
|
|
16
|
-
}
|
|
17
|
-
/**
|
|
18
|
-
* File extension
|
|
19
|
-
*/
|
|
20
|
-
if (!field.extensions.includes(file.name.split('.').pop())) {
|
|
21
|
-
ctx.addIssue({
|
|
22
|
-
code: z.ZodIssueCode.custom,
|
|
23
|
-
message: `Invalid file extension. Supported extensions are: ${field.extensions.join(', ')}`,
|
|
24
|
-
});
|
|
25
|
-
}
|
|
26
|
-
/**
|
|
27
|
-
* File size
|
|
28
|
-
* SECURITY: We read the actual blob size instead of relying on file.size
|
|
29
|
-
* property, which can be overridden using Object.defineProperty()
|
|
30
|
-
*/
|
|
31
|
-
const actualSize = await file.arrayBuffer().then((buf) => buf.byteLength);
|
|
32
|
-
const maxSizeBytes = field.maxFileSize.size * (field.maxFileSize.unit === 'kb' ? 1024 : 1024 * 1024);
|
|
33
|
-
if (actualSize > maxSizeBytes) {
|
|
34
|
-
ctx.addIssue({
|
|
35
|
-
code: 'too_big',
|
|
36
|
-
maximum: maxSizeBytes,
|
|
37
|
-
origin: 'number',
|
|
38
|
-
inclusive: true,
|
|
39
|
-
type: 'number',
|
|
40
|
-
message: `File size should not exceed the maximum allowed size of ${field.maxFileSize.size} ${field.maxFileSize.unit}`,
|
|
41
|
-
});
|
|
42
|
-
}
|
|
43
|
-
/**
|
|
44
|
-
* Mime types
|
|
45
|
-
*/
|
|
46
|
-
if (!field.mimeType.includes(file.type)) {
|
|
47
|
-
ctx.addIssue({
|
|
48
|
-
code: 'custom',
|
|
49
|
-
message: `Invalid file type. Supported types are: ${field.mimeType.join(', ')}`,
|
|
50
|
-
});
|
|
51
|
-
}
|
|
52
|
-
});
|
|
53
|
-
/**
|
|
54
|
-
* If not required, allow `undefined` (meaning "no file was provided at all").
|
|
55
|
-
*/
|
|
56
|
-
return field.required ? base : z.union([z.null(), z.undefined(), base]).optional();
|
|
57
|
-
};
|
|
1
|
+
import * as z from 'zod';
|
|
2
|
+
export const documentFieldSchema = (field) => {
|
|
3
|
+
/**
|
|
4
|
+
* Construct a custom schema for the photo field
|
|
5
|
+
*/
|
|
6
|
+
const base = z.instanceof(File).superRefine(async (file, ctx) => {
|
|
7
|
+
if (!file) {
|
|
8
|
+
// If empty but the field is required, add an issue
|
|
9
|
+
if (field.required) {
|
|
10
|
+
ctx.addIssue({
|
|
11
|
+
code: z.ZodIssueCode.custom,
|
|
12
|
+
message: 'No file selected',
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
return; // If it's not required, do nothing (no issue).
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* File extension
|
|
19
|
+
*/
|
|
20
|
+
if (!field.extensions.includes(file.name.split('.').pop())) {
|
|
21
|
+
ctx.addIssue({
|
|
22
|
+
code: z.ZodIssueCode.custom,
|
|
23
|
+
message: `Invalid file extension. Supported extensions are: ${field.extensions.join(', ')}`,
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* File size
|
|
28
|
+
* SECURITY: We read the actual blob size instead of relying on file.size
|
|
29
|
+
* property, which can be overridden using Object.defineProperty()
|
|
30
|
+
*/
|
|
31
|
+
const actualSize = await file.arrayBuffer().then((buf) => buf.byteLength);
|
|
32
|
+
const maxSizeBytes = field.maxFileSize.size * (field.maxFileSize.unit === 'kb' ? 1024 : 1024 * 1024);
|
|
33
|
+
if (actualSize > maxSizeBytes) {
|
|
34
|
+
ctx.addIssue({
|
|
35
|
+
code: 'too_big',
|
|
36
|
+
maximum: maxSizeBytes,
|
|
37
|
+
origin: 'number',
|
|
38
|
+
inclusive: true,
|
|
39
|
+
type: 'number',
|
|
40
|
+
message: `File size should not exceed the maximum allowed size of ${field.maxFileSize.size} ${field.maxFileSize.unit}`,
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Mime types
|
|
45
|
+
*/
|
|
46
|
+
if (!field.mimeType.includes(file.type)) {
|
|
47
|
+
ctx.addIssue({
|
|
48
|
+
code: 'custom',
|
|
49
|
+
message: `Invalid file type. Supported types are: ${field.mimeType.join(', ')}`,
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
});
|
|
53
|
+
/**
|
|
54
|
+
* If not required, allow `undefined` (meaning "no file was provided at all").
|
|
55
|
+
*/
|
|
56
|
+
return field.required ? base : z.union([z.null(), z.undefined(), base]).optional();
|
|
57
|
+
};
|
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
export * from
|
|
2
|
-
export * from
|
|
3
|
-
export * from
|
|
4
|
-
export * from
|
|
5
|
-
export * from
|
|
6
|
-
export * from
|
|
7
|
-
export * from
|
|
8
|
-
export * from
|
|
9
|
-
export * from
|
|
10
|
-
export * from
|
|
11
|
-
export * from
|
|
12
|
-
export * from
|
|
13
|
-
export * from
|
|
14
|
-
export * from
|
|
1
|
+
export * from './checkbox.js';
|
|
2
|
+
export * from './color.js';
|
|
3
|
+
export * from './date.js';
|
|
4
|
+
export * from './document.js';
|
|
5
|
+
export * from './map.js';
|
|
6
|
+
export * from './number.js';
|
|
7
|
+
export * from './password.js';
|
|
8
|
+
export * from './photo.js';
|
|
9
|
+
export * from './richText.js';
|
|
10
|
+
export * from './select.js';
|
|
11
|
+
export * from './select-multiple.js';
|
|
12
|
+
export * from './text.js';
|
|
13
|
+
export * from './textarea.js';
|
|
14
|
+
export * from './video.js';
|
|
15
15
|
//# sourceMappingURL=index.d.ts.map
|