nextjs-cms 0.5.9 → 0.5.10
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 +2 -3
|
@@ -1,99 +1,99 @@
|
|
|
1
|
-
import { entityKind } from
|
|
2
|
-
import type { BaseSectionOptions } from
|
|
3
|
-
import { Section } from
|
|
4
|
-
import { FieldGroupConfig,
|
|
5
|
-
import * as z from 'zod';
|
|
6
|
-
declare const configSchema: z.ZodObject<{
|
|
7
|
-
title: z.ZodString;
|
|
8
|
-
db: z.ZodObject<{
|
|
9
|
-
table: z.ZodString;
|
|
10
|
-
}, z.core.$strict>;
|
|
11
|
-
}, z.core.$strict>;
|
|
12
|
-
type Config = z.infer<typeof configSchema>;
|
|
13
|
-
export declare class SimpleSection extends Section<Config> {
|
|
14
|
-
static readonly [entityKind] = "SimpleSection";
|
|
15
|
-
readonly type = "simple";
|
|
16
|
-
title: string;
|
|
17
|
-
constructor(config: BaseSectionOptions<Config>);
|
|
18
|
-
}
|
|
19
|
-
declare const optionsSchema: z.ZodObject<{
|
|
20
|
-
title: z.ZodString;
|
|
21
|
-
db: z.ZodObject<{
|
|
22
|
-
table: z.ZodString;
|
|
23
|
-
}, z.core.$strict>;
|
|
24
|
-
fields: z.ZodUnion<[z.ZodArray<z.ZodCustom<FieldConfig, FieldConfig>>, z.ZodArray<z.ZodCustom<FieldGroupConfig, FieldGroupConfig>>]>;
|
|
25
|
-
name: z.ZodString;
|
|
26
|
-
variants: z.ZodOptional<z.ZodArray<z.ZodCustom<import("../types.js").Variant, import("../types.js").Variant>>>;
|
|
27
|
-
order: z.ZodNumber;
|
|
28
|
-
readonly: z.ZodOptional<z.ZodDefault<z.ZodBoolean>>;
|
|
29
|
-
icon: z.ZodOptional<z.ZodString>;
|
|
30
|
-
gallery: z.ZodOptional<z.ZodObject<{
|
|
31
|
-
db: z.ZodObject<{
|
|
32
|
-
tableName: z.ZodString;
|
|
33
|
-
identifierField: z.ZodOptional<z.ZodString>;
|
|
34
|
-
photoNameField: z.ZodOptional<z.ZodString>;
|
|
35
|
-
metaField: z.ZodOptional<z.ZodString>;
|
|
36
|
-
}, z.core.$strict>;
|
|
37
|
-
watermark: z.ZodOptional<z.ZodBoolean>;
|
|
38
|
-
thumbnail: z.ZodOptional<z.ZodObject<{
|
|
39
|
-
width: z.ZodNumber;
|
|
40
|
-
height: z.ZodNumber;
|
|
41
|
-
crop: z.ZodBoolean;
|
|
42
|
-
quality: z.ZodNumber;
|
|
43
|
-
}, z.core.$strict>>;
|
|
44
|
-
}, z.core.$strict>>;
|
|
45
|
-
hooks: z.ZodOptional<z.ZodCustom<import("./section.js").Hooks, import("./section.js").Hooks>>;
|
|
46
|
-
}, z.core.$strict>;
|
|
47
|
-
declare const simpleSectionConfigSchema: z.ZodObject<{
|
|
48
|
-
type: z.ZodLiteral<"simple">;
|
|
49
|
-
fields: z.ZodArray<z.ZodCustom<FieldConfig, FieldConfig>>;
|
|
50
|
-
build: z.ZodFunction<z.core.$ZodFunctionArgs, z.ZodCustom<SimpleSection, SimpleSection>>;
|
|
51
|
-
fieldGroups: z.ZodOptional<z.ZodArray<z.ZodCustom<FieldGroupConfig, FieldGroupConfig>>>;
|
|
52
|
-
title: z.ZodString;
|
|
53
|
-
db: z.ZodObject<{
|
|
54
|
-
table: z.ZodString;
|
|
55
|
-
}, z.core.$strict>;
|
|
56
|
-
name: z.ZodString;
|
|
57
|
-
variants: z.ZodOptional<z.ZodArray<z.ZodCustom<import("../types.js").Variant, import("../types.js").Variant>>>;
|
|
58
|
-
order: z.ZodNumber;
|
|
59
|
-
readonly: z.ZodOptional<z.ZodDefault<z.ZodBoolean>>;
|
|
60
|
-
icon: z.ZodOptional<z.ZodString>;
|
|
61
|
-
gallery: z.ZodOptional<z.ZodObject<{
|
|
62
|
-
db: z.ZodObject<{
|
|
63
|
-
tableName: z.ZodString;
|
|
64
|
-
identifierField: z.ZodOptional<z.ZodString>;
|
|
65
|
-
photoNameField: z.ZodOptional<z.ZodString>;
|
|
66
|
-
metaField: z.ZodOptional<z.ZodString>;
|
|
67
|
-
}, z.core.$strict>;
|
|
68
|
-
watermark: z.ZodOptional<z.ZodBoolean>;
|
|
69
|
-
thumbnail: z.ZodOptional<z.ZodObject<{
|
|
70
|
-
width: z.ZodNumber;
|
|
71
|
-
height: z.ZodNumber;
|
|
72
|
-
crop: z.ZodBoolean;
|
|
73
|
-
quality: z.ZodNumber;
|
|
74
|
-
}, z.core.$strict>>;
|
|
75
|
-
}, z.core.$strict>>;
|
|
76
|
-
hooks: z.ZodOptional<z.ZodCustom<import("./section.js").Hooks, import("./section.js").Hooks>>;
|
|
77
|
-
}, z.core.$strict>;
|
|
78
|
-
export type SimpleSectionOptions = z.infer<typeof optionsSchema>;
|
|
79
|
-
/**
|
|
80
|
-
* Simple section configuration
|
|
81
|
-
* This is the output of the simpleSection() helper function, it that can be serialized and used anywhere
|
|
82
|
-
* The build() method allows creating a SimpleSection instance when needed
|
|
83
|
-
*/
|
|
84
|
-
export type SimpleSectionConfig = z.infer<typeof simpleSectionConfigSchema>;
|
|
85
|
-
/**
|
|
86
|
-
* Helper function to create a simple section configuration
|
|
87
|
-
* Returns a config object with a build() method that can be serialized and used anywhere
|
|
88
|
-
*
|
|
89
|
-
* @example
|
|
90
|
-
* ```typescript
|
|
91
|
-
* const sectionConfig = simpleSection({ name: 'settings', ... })
|
|
92
|
-
* const sectionInstance = sectionConfig.build()
|
|
93
|
-
* ```
|
|
94
|
-
*
|
|
95
|
-
* @param section
|
|
96
|
-
*/
|
|
97
|
-
export declare function simpleSection(section: SimpleSectionOptions): SimpleSectionConfig;
|
|
98
|
-
export {};
|
|
1
|
+
import { entityKind } from '../helpers/index.js';
|
|
2
|
+
import type { BaseSectionOptions } from './section.js';
|
|
3
|
+
import { Section } from './section.js';
|
|
4
|
+
import type { FieldGroupConfig, FieldConfig } from '../fields/index.js';
|
|
5
|
+
import * as z from 'zod';
|
|
6
|
+
declare const configSchema: z.ZodObject<{
|
|
7
|
+
title: z.ZodString;
|
|
8
|
+
db: z.ZodObject<{
|
|
9
|
+
table: z.ZodString;
|
|
10
|
+
}, z.core.$strict>;
|
|
11
|
+
}, z.core.$strict>;
|
|
12
|
+
type Config = z.infer<typeof configSchema>;
|
|
13
|
+
export declare class SimpleSection extends Section<Config> {
|
|
14
|
+
static readonly [entityKind] = "SimpleSection";
|
|
15
|
+
readonly type = "simple";
|
|
16
|
+
title: string;
|
|
17
|
+
constructor(config: BaseSectionOptions<Config>);
|
|
18
|
+
}
|
|
19
|
+
declare const optionsSchema: z.ZodObject<{
|
|
20
|
+
title: z.ZodString;
|
|
21
|
+
db: z.ZodObject<{
|
|
22
|
+
table: z.ZodString;
|
|
23
|
+
}, z.core.$strict>;
|
|
24
|
+
fields: z.ZodUnion<[z.ZodArray<z.ZodCustom<FieldConfig, FieldConfig>>, z.ZodArray<z.ZodCustom<FieldGroupConfig, FieldGroupConfig>>]>;
|
|
25
|
+
name: z.ZodString;
|
|
26
|
+
variants: z.ZodOptional<z.ZodArray<z.ZodCustom<import("../types/index.js").Variant, import("../types/index.js").Variant>>>;
|
|
27
|
+
order: z.ZodNumber;
|
|
28
|
+
readonly: z.ZodOptional<z.ZodDefault<z.ZodBoolean>>;
|
|
29
|
+
icon: z.ZodOptional<z.ZodString>;
|
|
30
|
+
gallery: z.ZodOptional<z.ZodObject<{
|
|
31
|
+
db: z.ZodObject<{
|
|
32
|
+
tableName: z.ZodString;
|
|
33
|
+
identifierField: z.ZodOptional<z.ZodString>;
|
|
34
|
+
photoNameField: z.ZodOptional<z.ZodString>;
|
|
35
|
+
metaField: z.ZodOptional<z.ZodString>;
|
|
36
|
+
}, z.core.$strict>;
|
|
37
|
+
watermark: z.ZodOptional<z.ZodBoolean>;
|
|
38
|
+
thumbnail: z.ZodOptional<z.ZodObject<{
|
|
39
|
+
width: z.ZodNumber;
|
|
40
|
+
height: z.ZodNumber;
|
|
41
|
+
crop: z.ZodBoolean;
|
|
42
|
+
quality: z.ZodNumber;
|
|
43
|
+
}, z.core.$strict>>;
|
|
44
|
+
}, z.core.$strict>>;
|
|
45
|
+
hooks: z.ZodOptional<z.ZodCustom<import("./section.js").Hooks, import("./section.js").Hooks>>;
|
|
46
|
+
}, z.core.$strict>;
|
|
47
|
+
declare const simpleSectionConfigSchema: z.ZodObject<{
|
|
48
|
+
type: z.ZodLiteral<"simple">;
|
|
49
|
+
fields: z.ZodArray<z.ZodCustom<FieldConfig, FieldConfig>>;
|
|
50
|
+
build: z.ZodFunction<z.core.$ZodFunctionArgs, z.ZodCustom<SimpleSection, SimpleSection>>;
|
|
51
|
+
fieldGroups: z.ZodOptional<z.ZodArray<z.ZodCustom<FieldGroupConfig, FieldGroupConfig>>>;
|
|
52
|
+
title: z.ZodString;
|
|
53
|
+
db: z.ZodObject<{
|
|
54
|
+
table: z.ZodString;
|
|
55
|
+
}, z.core.$strict>;
|
|
56
|
+
name: z.ZodString;
|
|
57
|
+
variants: z.ZodOptional<z.ZodArray<z.ZodCustom<import("../types/index.js").Variant, import("../types/index.js").Variant>>>;
|
|
58
|
+
order: z.ZodNumber;
|
|
59
|
+
readonly: z.ZodOptional<z.ZodDefault<z.ZodBoolean>>;
|
|
60
|
+
icon: z.ZodOptional<z.ZodString>;
|
|
61
|
+
gallery: z.ZodOptional<z.ZodObject<{
|
|
62
|
+
db: z.ZodObject<{
|
|
63
|
+
tableName: z.ZodString;
|
|
64
|
+
identifierField: z.ZodOptional<z.ZodString>;
|
|
65
|
+
photoNameField: z.ZodOptional<z.ZodString>;
|
|
66
|
+
metaField: z.ZodOptional<z.ZodString>;
|
|
67
|
+
}, z.core.$strict>;
|
|
68
|
+
watermark: z.ZodOptional<z.ZodBoolean>;
|
|
69
|
+
thumbnail: z.ZodOptional<z.ZodObject<{
|
|
70
|
+
width: z.ZodNumber;
|
|
71
|
+
height: z.ZodNumber;
|
|
72
|
+
crop: z.ZodBoolean;
|
|
73
|
+
quality: z.ZodNumber;
|
|
74
|
+
}, z.core.$strict>>;
|
|
75
|
+
}, z.core.$strict>>;
|
|
76
|
+
hooks: z.ZodOptional<z.ZodCustom<import("./section.js").Hooks, import("./section.js").Hooks>>;
|
|
77
|
+
}, z.core.$strict>;
|
|
78
|
+
export type SimpleSectionOptions = z.infer<typeof optionsSchema>;
|
|
79
|
+
/**
|
|
80
|
+
* Simple section configuration
|
|
81
|
+
* This is the output of the simpleSection() helper function, it that can be serialized and used anywhere
|
|
82
|
+
* The build() method allows creating a SimpleSection instance when needed
|
|
83
|
+
*/
|
|
84
|
+
export type SimpleSectionConfig = z.infer<typeof simpleSectionConfigSchema>;
|
|
85
|
+
/**
|
|
86
|
+
* Helper function to create a simple section configuration
|
|
87
|
+
* Returns a config object with a build() method that can be serialized and used anywhere
|
|
88
|
+
*
|
|
89
|
+
* @example
|
|
90
|
+
* ```typescript
|
|
91
|
+
* const sectionConfig = simpleSection({ name: 'settings', ... })
|
|
92
|
+
* const sectionInstance = sectionConfig.build()
|
|
93
|
+
* ```
|
|
94
|
+
*
|
|
95
|
+
* @param section
|
|
96
|
+
*/
|
|
97
|
+
export declare function simpleSection(section: SimpleSectionOptions): SimpleSectionConfig;
|
|
98
|
+
export {};
|
|
99
99
|
//# sourceMappingURL=simple.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"simple.d.ts","sourceRoot":"","sources":["../../../src/core/sections/simple.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"simple.d.ts","sourceRoot":"","sources":["../../../src/core/sections/simple.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAChD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAA;AACtD,OAAO,EAAE,OAAO,EAAmC,MAAM,cAAc,CAAA;AACvE,OAAO,KAAK,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AACvE,OAAO,KAAK,CAAC,MAAM,KAAK,CAAA;AAGxB,QAAA,MAAM,YAAY;;;;;kBAiBhB,CAAA;AAEF,KAAK,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAA;AAE1C,qBAAa,aAAc,SAAQ,OAAO,CAAC,MAAM,CAAC;IAC9C,gBAAyB,CAAC,UAAU,CAAC,mBAAkB;IACvD,SAAkB,IAAI,YAAW;IACxB,KAAK,EAAE,MAAM,CAAA;gBAEV,MAAM,EAAE,kBAAkB,CAAC,MAAM,CAAC;CAIjD;AAED,QAAA,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAGjB,CAAA;AAOF,QAAA,MAAM,yBAAyB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAK7B,CAAA;AAEF,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,CAAA;AAEhE;;;;GAIG;AACH,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAA;AAE3E;;;;;;;;;;;GAWG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,oBAAoB,GAAG,mBAAmB,CA6ChF"}
|
|
@@ -1,95 +1,95 @@
|
|
|
1
|
-
import { entityKind } from
|
|
2
|
-
import {
|
|
3
|
-
import * as z from 'zod';
|
|
4
|
-
import { FieldGroupConfigSchema, fieldConfigSchema } from
|
|
5
|
-
const configSchema = z.strictObject({
|
|
6
|
-
title: z.string('Section title is required').describe('The title of the section'),
|
|
7
|
-
db: z
|
|
8
|
-
.strictObject({
|
|
9
|
-
table: z
|
|
10
|
-
.string('Table name is required')
|
|
11
|
-
.describe('The name of the database table to use for this section'),
|
|
12
|
-
}, {
|
|
13
|
-
error: 'DB configuration is required',
|
|
14
|
-
})
|
|
15
|
-
.describe('In simple sections, the identifier field is a number field with the name `id`, and always has the value of 1 in the database table')
|
|
16
|
-
.describe('The database configuration for this section'),
|
|
17
|
-
});
|
|
18
|
-
export class SimpleSection extends Section {
|
|
19
|
-
static [entityKind] = 'SimpleSection';
|
|
20
|
-
type = 'simple';
|
|
21
|
-
title;
|
|
22
|
-
constructor(config) {
|
|
23
|
-
super(config);
|
|
24
|
-
this.title = config.title;
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
const optionsSchema = z.strictObject({
|
|
28
|
-
...baseHelperFunctionOptionsSchema.shape,
|
|
29
|
-
...configSchema.shape,
|
|
30
|
-
});
|
|
31
|
-
const compiledOptionsSchema = z.strictObject({
|
|
32
|
-
...optionsSchema.shape,
|
|
33
|
-
fieldGroups: z.array(FieldGroupConfigSchema).optional().describe('The field groups of the section if provided'),
|
|
34
|
-
});
|
|
35
|
-
const simpleSectionConfigSchema = z.strictObject({
|
|
36
|
-
...compiledOptionsSchema.shape,
|
|
37
|
-
type: z.literal('simple').describe('The type of the section'),
|
|
38
|
-
fields: z.array(fieldConfigSchema).describe('The fields of the section'),
|
|
39
|
-
build: z.function().output(z.instanceof(SimpleSection)).describe('Build a SimpleSection instance from this config'),
|
|
40
|
-
});
|
|
41
|
-
/**
|
|
42
|
-
* Helper function to create a simple section configuration
|
|
43
|
-
* Returns a config object with a build() method that can be serialized and used anywhere
|
|
44
|
-
*
|
|
45
|
-
* @example
|
|
46
|
-
* ```typescript
|
|
47
|
-
* const sectionConfig = simpleSection({ name: 'settings', ... })
|
|
48
|
-
* const sectionInstance = sectionConfig.build()
|
|
49
|
-
* ```
|
|
50
|
-
*
|
|
51
|
-
* @param section
|
|
52
|
-
*/
|
|
53
|
-
export function simpleSection(section) {
|
|
54
|
-
/**
|
|
55
|
-
* Validate the section config
|
|
56
|
-
*/
|
|
57
|
-
const result = optionsSchema.safeParse(section);
|
|
58
|
-
if (!result.success) {
|
|
59
|
-
throw new Error(`[Section: ${section.name}]: ${z.prettifyError(result.error)}`);
|
|
60
|
-
}
|
|
61
|
-
/**
|
|
62
|
-
* Resolve fields and fieldGroups
|
|
63
|
-
*/
|
|
64
|
-
let fields = [];
|
|
65
|
-
let fieldGroups = [];
|
|
66
|
-
if (section.fields && section.fields.length > 0) {
|
|
67
|
-
const firstInput = section.fields[0];
|
|
68
|
-
/**
|
|
69
|
-
* Check if the first item is a field group.
|
|
70
|
-
* We don't need to check every item,
|
|
71
|
-
* because zod already validated the fields array.
|
|
72
|
-
*/
|
|
73
|
-
if (firstInput && 'fields' in firstInput) {
|
|
74
|
-
fieldGroups = section.fields;
|
|
75
|
-
fields = fieldGroups.flatMap((group) => group.fields);
|
|
76
|
-
}
|
|
77
|
-
else {
|
|
78
|
-
fields = section.fields;
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
const config = {
|
|
82
|
-
...section,
|
|
83
|
-
fields,
|
|
84
|
-
fieldGroups: fieldGroups.length > 0 ? fieldGroups : undefined,
|
|
85
|
-
type: 'simple',
|
|
86
|
-
build() {
|
|
87
|
-
return new SimpleSection({
|
|
88
|
-
...section,
|
|
89
|
-
fields,
|
|
90
|
-
fieldGroups: fieldGroups.length > 0 ? fieldGroups : undefined,
|
|
91
|
-
});
|
|
92
|
-
},
|
|
93
|
-
};
|
|
94
|
-
return config;
|
|
95
|
-
}
|
|
1
|
+
import { entityKind } from '../helpers/index.js';
|
|
2
|
+
import { Section, baseHelperFunctionOptionsSchema } from './section.js';
|
|
3
|
+
import * as z from 'zod';
|
|
4
|
+
import { FieldGroupConfigSchema, fieldConfigSchema } from './section.js';
|
|
5
|
+
const configSchema = z.strictObject({
|
|
6
|
+
title: z.string('Section title is required').describe('The title of the section'),
|
|
7
|
+
db: z
|
|
8
|
+
.strictObject({
|
|
9
|
+
table: z
|
|
10
|
+
.string('Table name is required')
|
|
11
|
+
.describe('The name of the database table to use for this section'),
|
|
12
|
+
}, {
|
|
13
|
+
error: 'DB configuration is required',
|
|
14
|
+
})
|
|
15
|
+
.describe('In simple sections, the identifier field is a number field with the name `id`, and always has the value of 1 in the database table')
|
|
16
|
+
.describe('The database configuration for this section'),
|
|
17
|
+
});
|
|
18
|
+
export class SimpleSection extends Section {
|
|
19
|
+
static [entityKind] = 'SimpleSection';
|
|
20
|
+
type = 'simple';
|
|
21
|
+
title;
|
|
22
|
+
constructor(config) {
|
|
23
|
+
super(config);
|
|
24
|
+
this.title = config.title;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
const optionsSchema = z.strictObject({
|
|
28
|
+
...baseHelperFunctionOptionsSchema.shape,
|
|
29
|
+
...configSchema.shape,
|
|
30
|
+
});
|
|
31
|
+
const compiledOptionsSchema = z.strictObject({
|
|
32
|
+
...optionsSchema.shape,
|
|
33
|
+
fieldGroups: z.array(FieldGroupConfigSchema).optional().describe('The field groups of the section if provided'),
|
|
34
|
+
});
|
|
35
|
+
const simpleSectionConfigSchema = z.strictObject({
|
|
36
|
+
...compiledOptionsSchema.shape,
|
|
37
|
+
type: z.literal('simple').describe('The type of the section'),
|
|
38
|
+
fields: z.array(fieldConfigSchema).describe('The fields of the section'),
|
|
39
|
+
build: z.function().output(z.instanceof(SimpleSection)).describe('Build a SimpleSection instance from this config'),
|
|
40
|
+
});
|
|
41
|
+
/**
|
|
42
|
+
* Helper function to create a simple section configuration
|
|
43
|
+
* Returns a config object with a build() method that can be serialized and used anywhere
|
|
44
|
+
*
|
|
45
|
+
* @example
|
|
46
|
+
* ```typescript
|
|
47
|
+
* const sectionConfig = simpleSection({ name: 'settings', ... })
|
|
48
|
+
* const sectionInstance = sectionConfig.build()
|
|
49
|
+
* ```
|
|
50
|
+
*
|
|
51
|
+
* @param section
|
|
52
|
+
*/
|
|
53
|
+
export function simpleSection(section) {
|
|
54
|
+
/**
|
|
55
|
+
* Validate the section config
|
|
56
|
+
*/
|
|
57
|
+
const result = optionsSchema.safeParse(section);
|
|
58
|
+
if (!result.success) {
|
|
59
|
+
throw new Error(`[Section: ${section.name}]: ${z.prettifyError(result.error)}`);
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Resolve fields and fieldGroups
|
|
63
|
+
*/
|
|
64
|
+
let fields = [];
|
|
65
|
+
let fieldGroups = [];
|
|
66
|
+
if (section.fields && section.fields.length > 0) {
|
|
67
|
+
const firstInput = section.fields[0];
|
|
68
|
+
/**
|
|
69
|
+
* Check if the first item is a field group.
|
|
70
|
+
* We don't need to check every item,
|
|
71
|
+
* because zod already validated the fields array.
|
|
72
|
+
*/
|
|
73
|
+
if (firstInput && 'fields' in firstInput) {
|
|
74
|
+
fieldGroups = section.fields;
|
|
75
|
+
fields = fieldGroups.flatMap((group) => group.fields);
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
fields = section.fields;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
const config = {
|
|
82
|
+
...section,
|
|
83
|
+
fields,
|
|
84
|
+
fieldGroups: fieldGroups.length > 0 ? fieldGroups : undefined,
|
|
85
|
+
type: 'simple',
|
|
86
|
+
build() {
|
|
87
|
+
return new SimpleSection({
|
|
88
|
+
...section,
|
|
89
|
+
fields,
|
|
90
|
+
fieldGroups: fieldGroups.length > 0 ? fieldGroups : undefined,
|
|
91
|
+
});
|
|
92
|
+
},
|
|
93
|
+
};
|
|
94
|
+
return config;
|
|
95
|
+
}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Escape a string so it can be safely injected into an HTML text context.
|
|
3
|
-
* Returns `undefined` when the input is `undefined` or `null` to preserve caller intent.
|
|
4
|
-
*/
|
|
5
|
-
export declare function escapeHTML(value: string | undefined | null): string | undefined;
|
|
6
|
-
/**
|
|
7
|
-
* Sanitize rich-text/HTML content using DOMPurify with a restrictive allow-list.
|
|
8
|
-
* Always returns a string (empty string when value is undefined or null).
|
|
9
|
-
*/
|
|
10
|
-
export declare function sanitizeRichText(value: string | undefined | null): string;
|
|
1
|
+
/**
|
|
2
|
+
* Escape a string so it can be safely injected into an HTML text context.
|
|
3
|
+
* Returns `undefined` when the input is `undefined` or `null` to preserve caller intent.
|
|
4
|
+
*/
|
|
5
|
+
export declare function escapeHTML(value: string | undefined | null): string | undefined;
|
|
6
|
+
/**
|
|
7
|
+
* Sanitize rich-text/HTML content using DOMPurify with a restrictive allow-list.
|
|
8
|
+
* Always returns a string (empty string when value is undefined or null).
|
|
9
|
+
*/
|
|
10
|
+
export declare function sanitizeRichText(value: string | undefined | null): string;
|
|
11
11
|
//# sourceMappingURL=dom.d.ts.map
|
|
@@ -1,92 +1,92 @@
|
|
|
1
|
-
import DOMPurify from 'isomorphic-dompurify';
|
|
2
|
-
const HTML_ESCAPE_LOOKUP = {
|
|
3
|
-
'&': '&',
|
|
4
|
-
'<': '<',
|
|
5
|
-
'>': '>',
|
|
6
|
-
'"': '"',
|
|
7
|
-
"'": ''',
|
|
8
|
-
'/': '/',
|
|
9
|
-
'`': '`',
|
|
10
|
-
'/\/': '/',
|
|
11
|
-
};
|
|
12
|
-
const HTML_ESCAPE_REGEX = /[&<>"'\/`\/\/]/g;
|
|
13
|
-
/**
|
|
14
|
-
* Escape a string so it can be safely injected into an HTML text context.
|
|
15
|
-
* Returns `undefined` when the input is `undefined` or `null` to preserve caller intent.
|
|
16
|
-
*/
|
|
17
|
-
export function escapeHTML(value) {
|
|
18
|
-
if (value === undefined || value === null) {
|
|
19
|
-
return value === null ? '' : undefined;
|
|
20
|
-
}
|
|
21
|
-
if (!HTML_ESCAPE_REGEX.test(value)) {
|
|
22
|
-
return value;
|
|
23
|
-
}
|
|
24
|
-
return value.replace(HTML_ESCAPE_REGEX, (char) => HTML_ESCAPE_LOOKUP[char]);
|
|
25
|
-
}
|
|
26
|
-
const RICH_TEXT_ALLOWED_TAGS = [
|
|
27
|
-
'a',
|
|
28
|
-
'abbr',
|
|
29
|
-
'b',
|
|
30
|
-
'blockquote',
|
|
31
|
-
'br',
|
|
32
|
-
'caption',
|
|
33
|
-
'code',
|
|
34
|
-
'div',
|
|
35
|
-
'em',
|
|
36
|
-
'strong',
|
|
37
|
-
'i',
|
|
38
|
-
'img',
|
|
39
|
-
'figure',
|
|
40
|
-
'figcaption',
|
|
41
|
-
'hr',
|
|
42
|
-
'li',
|
|
43
|
-
'ol',
|
|
44
|
-
'p',
|
|
45
|
-
'pre',
|
|
46
|
-
'span',
|
|
47
|
-
'sub',
|
|
48
|
-
'sup',
|
|
49
|
-
'table',
|
|
50
|
-
'tbody',
|
|
51
|
-
'td',
|
|
52
|
-
'tfoot',
|
|
53
|
-
'th',
|
|
54
|
-
'thead',
|
|
55
|
-
'tr',
|
|
56
|
-
'u',
|
|
57
|
-
'ul',
|
|
58
|
-
];
|
|
59
|
-
const RICH_TEXT_ALLOWED_ATTR = [
|
|
60
|
-
'align',
|
|
61
|
-
'alt',
|
|
62
|
-
'class',
|
|
63
|
-
'data*',
|
|
64
|
-
'height',
|
|
65
|
-
'href',
|
|
66
|
-
'id',
|
|
67
|
-
'name',
|
|
68
|
-
'rel',
|
|
69
|
-
'src',
|
|
70
|
-
'style',
|
|
71
|
-
'target',
|
|
72
|
-
'title',
|
|
73
|
-
'width',
|
|
74
|
-
];
|
|
75
|
-
const RICH_TEXT_URI_REGEXP = /^(?:(?:https?|mailto|tel|ftp|file):|data:image\/[a-z0-9.+-]+;base64,)/i;
|
|
76
|
-
const RICH_TEXT_SANITIZE_CONFIG = {
|
|
77
|
-
ALLOWED_TAGS: [...RICH_TEXT_ALLOWED_TAGS],
|
|
78
|
-
ALLOWED_ATTR: [...RICH_TEXT_ALLOWED_ATTR],
|
|
79
|
-
ALLOW_DATA_ATTR: true,
|
|
80
|
-
ALLOWED_URI_REGEXP: RICH_TEXT_URI_REGEXP,
|
|
81
|
-
FORBID_TAGS: ['style', 'script'],
|
|
82
|
-
};
|
|
83
|
-
/**
|
|
84
|
-
* Sanitize rich-text/HTML content using DOMPurify with a restrictive allow-list.
|
|
85
|
-
* Always returns a string (empty string when value is undefined or null).
|
|
86
|
-
*/
|
|
87
|
-
export function sanitizeRichText(value) {
|
|
88
|
-
if (value === undefined || value === null || value.trim().length === 0) {
|
|
89
|
-
return '';
|
|
90
|
-
}
|
|
91
|
-
return DOMPurify.sanitize(value, RICH_TEXT_SANITIZE_CONFIG);
|
|
92
|
-
}
|
|
1
|
+
import DOMPurify from 'isomorphic-dompurify';
|
|
2
|
+
const HTML_ESCAPE_LOOKUP = {
|
|
3
|
+
'&': '&',
|
|
4
|
+
'<': '<',
|
|
5
|
+
'>': '>',
|
|
6
|
+
'"': '"',
|
|
7
|
+
"'": ''',
|
|
8
|
+
'/': '/',
|
|
9
|
+
'`': '`',
|
|
10
|
+
'/\/': '/',
|
|
11
|
+
};
|
|
12
|
+
const HTML_ESCAPE_REGEX = /[&<>"'\/`\/\/]/g;
|
|
13
|
+
/**
|
|
14
|
+
* Escape a string so it can be safely injected into an HTML text context.
|
|
15
|
+
* Returns `undefined` when the input is `undefined` or `null` to preserve caller intent.
|
|
16
|
+
*/
|
|
17
|
+
export function escapeHTML(value) {
|
|
18
|
+
if (value === undefined || value === null) {
|
|
19
|
+
return value === null ? '' : undefined;
|
|
20
|
+
}
|
|
21
|
+
if (!HTML_ESCAPE_REGEX.test(value)) {
|
|
22
|
+
return value;
|
|
23
|
+
}
|
|
24
|
+
return value.replace(HTML_ESCAPE_REGEX, (char) => HTML_ESCAPE_LOOKUP[char]);
|
|
25
|
+
}
|
|
26
|
+
const RICH_TEXT_ALLOWED_TAGS = [
|
|
27
|
+
'a',
|
|
28
|
+
'abbr',
|
|
29
|
+
'b',
|
|
30
|
+
'blockquote',
|
|
31
|
+
'br',
|
|
32
|
+
'caption',
|
|
33
|
+
'code',
|
|
34
|
+
'div',
|
|
35
|
+
'em',
|
|
36
|
+
'strong',
|
|
37
|
+
'i',
|
|
38
|
+
'img',
|
|
39
|
+
'figure',
|
|
40
|
+
'figcaption',
|
|
41
|
+
'hr',
|
|
42
|
+
'li',
|
|
43
|
+
'ol',
|
|
44
|
+
'p',
|
|
45
|
+
'pre',
|
|
46
|
+
'span',
|
|
47
|
+
'sub',
|
|
48
|
+
'sup',
|
|
49
|
+
'table',
|
|
50
|
+
'tbody',
|
|
51
|
+
'td',
|
|
52
|
+
'tfoot',
|
|
53
|
+
'th',
|
|
54
|
+
'thead',
|
|
55
|
+
'tr',
|
|
56
|
+
'u',
|
|
57
|
+
'ul',
|
|
58
|
+
];
|
|
59
|
+
const RICH_TEXT_ALLOWED_ATTR = [
|
|
60
|
+
'align',
|
|
61
|
+
'alt',
|
|
62
|
+
'class',
|
|
63
|
+
'data*',
|
|
64
|
+
'height',
|
|
65
|
+
'href',
|
|
66
|
+
'id',
|
|
67
|
+
'name',
|
|
68
|
+
'rel',
|
|
69
|
+
'src',
|
|
70
|
+
'style',
|
|
71
|
+
'target',
|
|
72
|
+
'title',
|
|
73
|
+
'width',
|
|
74
|
+
];
|
|
75
|
+
const RICH_TEXT_URI_REGEXP = /^(?:(?:https?|mailto|tel|ftp|file):|data:image\/[a-z0-9.+-]+;base64,)/i;
|
|
76
|
+
const RICH_TEXT_SANITIZE_CONFIG = {
|
|
77
|
+
ALLOWED_TAGS: [...RICH_TEXT_ALLOWED_TAGS],
|
|
78
|
+
ALLOWED_ATTR: [...RICH_TEXT_ALLOWED_ATTR],
|
|
79
|
+
ALLOW_DATA_ATTR: true,
|
|
80
|
+
ALLOWED_URI_REGEXP: RICH_TEXT_URI_REGEXP,
|
|
81
|
+
FORBID_TAGS: ['style', 'script'],
|
|
82
|
+
};
|
|
83
|
+
/**
|
|
84
|
+
* Sanitize rich-text/HTML content using DOMPurify with a restrictive allow-list.
|
|
85
|
+
* Always returns a string (empty string when value is undefined or null).
|
|
86
|
+
*/
|
|
87
|
+
export function sanitizeRichText(value) {
|
|
88
|
+
if (value === undefined || value === null || value.trim().length === 0) {
|
|
89
|
+
return '';
|
|
90
|
+
}
|
|
91
|
+
return DOMPurify.sanitize(value, RICH_TEXT_SANITIZE_CONFIG);
|
|
92
|
+
}
|