nextjs-cms 0.0.1 → 0.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (302) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +289 -0
  3. package/dist/api/axios/axiosInstance.d.ts +2 -0
  4. package/dist/api/axios/axiosInstance.d.ts.map +1 -0
  5. package/dist/api/axios/axiosInstance.js +8 -0
  6. package/dist/api/index.d.ts +856 -0
  7. package/dist/api/index.d.ts.map +1 -0
  8. package/dist/api/index.js +12 -0
  9. package/dist/api/lib/serverActions.d.ts +240 -0
  10. package/dist/api/lib/serverActions.d.ts.map +1 -0
  11. package/dist/api/lib/serverActions.js +834 -0
  12. package/dist/api/root.d.ts +829 -0
  13. package/dist/api/root.d.ts.map +1 -0
  14. package/dist/api/root.js +30 -0
  15. package/dist/api/routers/accountSettings.d.ts +61 -0
  16. package/dist/api/routers/accountSettings.d.ts.map +1 -0
  17. package/dist/api/routers/accountSettings.js +108 -0
  18. package/dist/api/routers/admins.d.ts +106 -0
  19. package/dist/api/routers/admins.d.ts.map +1 -0
  20. package/dist/api/routers/admins.js +219 -0
  21. package/dist/api/routers/auth.d.ts +48 -0
  22. package/dist/api/routers/auth.d.ts.map +1 -0
  23. package/dist/api/routers/auth.js +25 -0
  24. package/dist/api/routers/categorySection.d.ts +104 -0
  25. package/dist/api/routers/categorySection.d.ts.map +1 -0
  26. package/dist/api/routers/categorySection.js +38 -0
  27. package/dist/api/routers/cmsSettings.d.ts +49 -0
  28. package/dist/api/routers/cmsSettings.d.ts.map +1 -0
  29. package/dist/api/routers/cmsSettings.js +51 -0
  30. package/dist/api/routers/cpanel.d.ts +84 -0
  31. package/dist/api/routers/cpanel.d.ts.map +1 -0
  32. package/dist/api/routers/cpanel.js +216 -0
  33. package/dist/api/routers/files.d.ts +48 -0
  34. package/dist/api/routers/files.d.ts.map +1 -0
  35. package/dist/api/routers/files.js +23 -0
  36. package/dist/api/routers/gallery.d.ts +36 -0
  37. package/dist/api/routers/gallery.d.ts.map +1 -0
  38. package/dist/api/routers/gallery.js +62 -0
  39. package/dist/api/routers/googleAnalytics.d.ts +31 -0
  40. package/dist/api/routers/googleAnalytics.d.ts.map +1 -0
  41. package/dist/api/routers/googleAnalytics.js +7 -0
  42. package/dist/api/routers/hasItemsSection.d.ts +140 -0
  43. package/dist/api/routers/hasItemsSection.d.ts.map +1 -0
  44. package/dist/api/routers/hasItemsSection.js +34 -0
  45. package/dist/api/routers/navigation.d.ts +52 -0
  46. package/dist/api/routers/navigation.d.ts.map +1 -0
  47. package/dist/api/routers/navigation.js +11 -0
  48. package/dist/api/routers/simpleSection.d.ts +58 -0
  49. package/dist/api/routers/simpleSection.d.ts.map +1 -0
  50. package/dist/api/routers/simpleSection.js +12 -0
  51. package/dist/api/trpc.d.ts +107 -0
  52. package/dist/api/trpc.d.ts.map +1 -0
  53. package/dist/api/trpc.js +72 -0
  54. package/dist/auth/axios/axiosInstance.d.ts +2 -0
  55. package/dist/auth/axios/axiosInstance.d.ts.map +1 -0
  56. package/dist/auth/axios/axiosInstance.js +8 -0
  57. package/dist/auth/csrf.d.ts +30 -0
  58. package/dist/auth/csrf.d.ts.map +1 -0
  59. package/dist/auth/csrf.js +76 -0
  60. package/dist/auth/hooks/index.d.ts +4 -0
  61. package/dist/auth/hooks/index.d.ts.map +1 -0
  62. package/dist/auth/hooks/index.js +3 -0
  63. package/dist/auth/hooks/useAxiosPrivate.d.ts +5 -0
  64. package/dist/auth/hooks/useAxiosPrivate.d.ts.map +1 -0
  65. package/dist/auth/hooks/useAxiosPrivate.js +74 -0
  66. package/dist/auth/hooks/useRefreshToken.d.ts +7 -0
  67. package/dist/auth/hooks/useRefreshToken.d.ts.map +1 -0
  68. package/dist/auth/hooks/useRefreshToken.js +79 -0
  69. package/dist/auth/index.d.ts +23 -0
  70. package/dist/auth/index.d.ts.map +1 -0
  71. package/dist/auth/index.js +44 -0
  72. package/dist/auth/jwt.d.ts +6 -0
  73. package/dist/auth/jwt.d.ts.map +1 -0
  74. package/dist/auth/jwt.js +25 -0
  75. package/dist/auth/lib/actions.d.ts +33 -0
  76. package/dist/auth/lib/actions.d.ts.map +1 -0
  77. package/dist/auth/lib/actions.js +209 -0
  78. package/dist/auth/lib/client.d.ts +4 -0
  79. package/dist/auth/lib/client.d.ts.map +1 -0
  80. package/dist/auth/lib/client.js +46 -0
  81. package/dist/auth/lib/index.d.ts +3 -0
  82. package/dist/auth/lib/index.d.ts.map +1 -0
  83. package/dist/auth/lib/index.js +2 -0
  84. package/dist/auth/react.d.ts +106 -0
  85. package/dist/auth/react.d.ts.map +1 -0
  86. package/dist/auth/react.js +347 -0
  87. package/dist/auth/trpc.d.ts +6 -0
  88. package/dist/auth/trpc.d.ts.map +1 -0
  89. package/dist/auth/trpc.js +81 -0
  90. package/dist/core/config/config-loader.d.ts +92 -0
  91. package/dist/core/config/config-loader.d.ts.map +1 -0
  92. package/dist/core/config/config-loader.js +230 -0
  93. package/dist/core/config/index.d.ts +3 -0
  94. package/dist/core/config/index.d.ts.map +1 -0
  95. package/dist/core/config/index.js +1 -0
  96. package/dist/core/config/loader.d.ts +2 -0
  97. package/dist/core/config/loader.d.ts.map +1 -0
  98. package/dist/core/config/loader.js +42 -0
  99. package/dist/core/db/index.d.ts +2 -0
  100. package/dist/core/db/index.d.ts.map +1 -0
  101. package/dist/core/db/index.js +1 -0
  102. package/dist/core/db/table-checker/DbTable.d.ts +6 -0
  103. package/dist/core/db/table-checker/DbTable.d.ts.map +1 -0
  104. package/dist/core/db/table-checker/DbTable.js +5 -0
  105. package/dist/core/db/table-checker/MysqlTable.d.ts +34 -0
  106. package/dist/core/db/table-checker/MysqlTable.d.ts.map +1 -0
  107. package/dist/core/db/table-checker/MysqlTable.js +102 -0
  108. package/dist/core/db/table-checker/index.d.ts +2 -0
  109. package/dist/core/db/table-checker/index.d.ts.map +1 -0
  110. package/dist/core/db/table-checker/index.js +1 -0
  111. package/dist/core/factories/FieldFactory.d.ts +124 -0
  112. package/dist/core/factories/FieldFactory.d.ts.map +1 -0
  113. package/dist/core/factories/FieldFactory.js +411 -0
  114. package/dist/core/factories/SectionFactory.d.ts +110 -0
  115. package/dist/core/factories/SectionFactory.d.ts.map +1 -0
  116. package/dist/core/factories/SectionFactory.js +415 -0
  117. package/dist/core/factories/index.d.ts +3 -0
  118. package/dist/core/factories/index.d.ts.map +1 -0
  119. package/dist/core/factories/index.js +2 -0
  120. package/dist/core/fields/checkbox.d.ts +63 -0
  121. package/dist/core/fields/checkbox.d.ts.map +1 -0
  122. package/dist/core/fields/checkbox.js +62 -0
  123. package/dist/core/fields/color.d.ts +84 -0
  124. package/dist/core/fields/color.d.ts.map +1 -0
  125. package/dist/core/fields/color.js +91 -0
  126. package/dist/core/fields/date.d.ts +100 -0
  127. package/dist/core/fields/date.d.ts.map +1 -0
  128. package/dist/core/fields/date.js +108 -0
  129. package/dist/core/fields/document.d.ts +180 -0
  130. package/dist/core/fields/document.d.ts.map +1 -0
  131. package/dist/core/fields/document.js +277 -0
  132. package/dist/core/fields/field-group.d.ts +18 -0
  133. package/dist/core/fields/field-group.d.ts.map +1 -0
  134. package/dist/core/fields/field-group.js +6 -0
  135. package/dist/core/fields/field.d.ts +126 -0
  136. package/dist/core/fields/field.d.ts.map +1 -0
  137. package/dist/core/fields/field.js +148 -0
  138. package/dist/core/fields/fileField.d.ts +15 -0
  139. package/dist/core/fields/fileField.d.ts.map +1 -0
  140. package/dist/core/fields/fileField.js +5 -0
  141. package/dist/core/fields/index.d.ts +65 -0
  142. package/dist/core/fields/index.d.ts.map +1 -0
  143. package/dist/core/fields/index.js +18 -0
  144. package/dist/core/fields/map.d.ts +167 -0
  145. package/dist/core/fields/map.d.ts.map +1 -0
  146. package/dist/core/fields/map.js +152 -0
  147. package/dist/core/fields/number.d.ts +186 -0
  148. package/dist/core/fields/number.d.ts.map +1 -0
  149. package/dist/core/fields/number.js +241 -0
  150. package/dist/core/fields/password.d.ts +109 -0
  151. package/dist/core/fields/password.d.ts.map +1 -0
  152. package/dist/core/fields/password.js +133 -0
  153. package/dist/core/fields/photo.d.ts +289 -0
  154. package/dist/core/fields/photo.d.ts.map +1 -0
  155. package/dist/core/fields/photo.js +410 -0
  156. package/dist/core/fields/richText.d.ts +295 -0
  157. package/dist/core/fields/richText.d.ts.map +1 -0
  158. package/dist/core/fields/richText.js +338 -0
  159. package/dist/core/fields/select.d.ts +366 -0
  160. package/dist/core/fields/select.d.ts.map +1 -0
  161. package/dist/core/fields/select.js +499 -0
  162. package/dist/core/fields/selectMultiple.d.ts +236 -0
  163. package/dist/core/fields/selectMultiple.d.ts.map +1 -0
  164. package/dist/core/fields/selectMultiple.js +417 -0
  165. package/dist/core/fields/tags.d.ts +131 -0
  166. package/dist/core/fields/tags.d.ts.map +1 -0
  167. package/dist/core/fields/tags.js +105 -0
  168. package/dist/core/fields/text.d.ts +136 -0
  169. package/dist/core/fields/text.d.ts.map +1 -0
  170. package/dist/core/fields/text.js +157 -0
  171. package/dist/core/fields/textArea.d.ts +107 -0
  172. package/dist/core/fields/textArea.d.ts.map +1 -0
  173. package/dist/core/fields/textArea.js +126 -0
  174. package/dist/core/fields/video.d.ts +148 -0
  175. package/dist/core/fields/video.d.ts.map +1 -0
  176. package/dist/core/fields/video.js +248 -0
  177. package/dist/core/helpers/entity.d.ts +8 -0
  178. package/dist/core/helpers/entity.d.ts.map +1 -0
  179. package/dist/core/helpers/entity.js +27 -0
  180. package/dist/core/helpers/index.d.ts +5 -0
  181. package/dist/core/helpers/index.d.ts.map +1 -0
  182. package/dist/core/helpers/index.js +3 -0
  183. package/dist/core/index.d.ts +8 -0
  184. package/dist/core/index.d.ts.map +1 -0
  185. package/dist/core/index.js +7 -0
  186. package/dist/core/sections/category.d.ts +283 -0
  187. package/dist/core/sections/category.d.ts.map +1 -0
  188. package/dist/core/sections/category.js +147 -0
  189. package/dist/core/sections/hasItems.d.ts +632 -0
  190. package/dist/core/sections/hasItems.d.ts.map +1 -0
  191. package/dist/core/sections/hasItems.js +144 -0
  192. package/dist/core/sections/index.d.ts +5 -0
  193. package/dist/core/sections/index.d.ts.map +1 -0
  194. package/dist/core/sections/index.js +4 -0
  195. package/dist/core/sections/section.d.ts +226 -0
  196. package/dist/core/sections/section.d.ts.map +1 -0
  197. package/dist/core/sections/section.js +341 -0
  198. package/dist/core/sections/simple.d.ts +99 -0
  199. package/dist/core/sections/simple.d.ts.map +1 -0
  200. package/dist/core/sections/simple.js +95 -0
  201. package/dist/core/security/dom.d.ts +11 -0
  202. package/dist/core/security/dom.d.ts.map +1 -0
  203. package/dist/core/security/dom.js +92 -0
  204. package/dist/core/submit/ItemEditSubmit.d.ts +76 -0
  205. package/dist/core/submit/ItemEditSubmit.d.ts.map +1 -0
  206. package/dist/core/submit/ItemEditSubmit.js +186 -0
  207. package/dist/core/submit/NewItemSubmit.d.ts +14 -0
  208. package/dist/core/submit/NewItemSubmit.d.ts.map +1 -0
  209. package/dist/core/submit/NewItemSubmit.js +93 -0
  210. package/dist/core/submit/SimpleSectionSubmit.d.ts +13 -0
  211. package/dist/core/submit/SimpleSectionSubmit.d.ts.map +1 -0
  212. package/dist/core/submit/SimpleSectionSubmit.js +93 -0
  213. package/dist/core/submit/index.d.ts +5 -0
  214. package/dist/core/submit/index.d.ts.map +1 -0
  215. package/dist/core/submit/index.js +4 -0
  216. package/dist/core/submit/submit.d.ts +116 -0
  217. package/dist/core/submit/submit.d.ts.map +1 -0
  218. package/dist/core/submit/submit.js +479 -0
  219. package/dist/core/types/index.d.ts +280 -0
  220. package/dist/core/types/index.d.ts.map +1 -0
  221. package/dist/core/types/index.js +1 -0
  222. package/dist/db/client.d.ts +9 -0
  223. package/dist/db/client.d.ts.map +1 -0
  224. package/dist/db/client.js +19 -0
  225. package/dist/db/config.d.ts +6 -0
  226. package/dist/db/config.d.ts.map +1 -0
  227. package/dist/db/config.js +22 -0
  228. package/dist/db/drizzle.config.d.ts +6 -0
  229. package/dist/db/drizzle.config.d.ts.map +1 -0
  230. package/dist/db/drizzle.config.js +18 -0
  231. package/dist/db/index.d.ts +3 -0
  232. package/dist/db/index.d.ts.map +1 -0
  233. package/dist/db/index.js +3 -0
  234. package/dist/db/schema.d.ts +639 -0
  235. package/dist/db/schema.d.ts.map +1 -0
  236. package/dist/db/schema.js +73 -0
  237. package/dist/index.d.ts +7 -1
  238. package/dist/index.d.ts.map +1 -1
  239. package/dist/index.js +7 -1
  240. package/dist/translations/dictionaries/ar.json +279 -0
  241. package/dist/translations/dictionaries/en.json +279 -0
  242. package/dist/translations/index.d.ts +3 -0
  243. package/dist/translations/index.d.ts.map +1 -0
  244. package/dist/translations/index.js +15 -0
  245. package/dist/utils/CpanelApi.d.ts +25 -0
  246. package/dist/utils/CpanelApi.d.ts.map +1 -0
  247. package/dist/utils/CpanelApi.js +64 -0
  248. package/dist/utils/constants.d.ts +14 -0
  249. package/dist/utils/constants.d.ts.map +1 -0
  250. package/dist/utils/constants.js +61 -0
  251. package/dist/utils/index.d.ts +5 -0
  252. package/dist/utils/index.d.ts.map +1 -0
  253. package/dist/utils/index.js +4 -0
  254. package/dist/utils/utils.d.ts +60 -0
  255. package/dist/utils/utils.d.ts.map +1 -0
  256. package/dist/utils/utils.js +132 -0
  257. package/dist/validators/checkbox.d.ts +4 -0
  258. package/dist/validators/checkbox.d.ts.map +1 -0
  259. package/dist/validators/checkbox.js +12 -0
  260. package/dist/validators/color.d.ts +4 -0
  261. package/dist/validators/color.d.ts.map +1 -0
  262. package/dist/validators/color.js +7 -0
  263. package/dist/validators/date.d.ts +4 -0
  264. package/dist/validators/date.d.ts.map +1 -0
  265. package/dist/validators/date.js +5 -0
  266. package/dist/validators/document.d.ts +4 -0
  267. package/dist/validators/document.d.ts.map +1 -0
  268. package/dist/validators/document.js +57 -0
  269. package/dist/validators/index.d.ts +15 -0
  270. package/dist/validators/index.d.ts.map +1 -0
  271. package/dist/validators/index.js +14 -0
  272. package/dist/validators/map.d.ts +4 -0
  273. package/dist/validators/map.d.ts.map +1 -0
  274. package/dist/validators/map.js +5 -0
  275. package/dist/validators/number.d.ts +4 -0
  276. package/dist/validators/number.d.ts.map +1 -0
  277. package/dist/validators/number.js +20 -0
  278. package/dist/validators/password.d.ts +4 -0
  279. package/dist/validators/password.d.ts.map +1 -0
  280. package/dist/validators/password.js +11 -0
  281. package/dist/validators/photo.d.ts +4 -0
  282. package/dist/validators/photo.d.ts.map +1 -0
  283. package/dist/validators/photo.js +100 -0
  284. package/dist/validators/richText.d.ts +4 -0
  285. package/dist/validators/richText.d.ts.map +1 -0
  286. package/dist/validators/richText.js +8 -0
  287. package/dist/validators/select-multiple.d.ts +10 -0
  288. package/dist/validators/select-multiple.d.ts.map +1 -0
  289. package/dist/validators/select-multiple.js +20 -0
  290. package/dist/validators/select.d.ts +4 -0
  291. package/dist/validators/select.d.ts.map +1 -0
  292. package/dist/validators/select.js +5 -0
  293. package/dist/validators/text.d.ts +4 -0
  294. package/dist/validators/text.d.ts.map +1 -0
  295. package/dist/validators/text.js +7 -0
  296. package/dist/validators/textarea.d.ts +4 -0
  297. package/dist/validators/textarea.d.ts.map +1 -0
  298. package/dist/validators/textarea.js +7 -0
  299. package/dist/validators/video.d.ts +4 -0
  300. package/dist/validators/video.d.ts.map +1 -0
  301. package/dist/validators/video.js +57 -0
  302. package/package.json +150 -6
@@ -0,0 +1,236 @@
1
+ import type { BaseFieldConfig } from './field';
2
+ import { Field } from './field';
3
+ import { entityKind } from '../helpers';
4
+ import type { SelectOption } from './select';
5
+ import type { HasItemsSection, CategorySection } from '../sections';
6
+ import * as z from 'zod';
7
+ declare const selectMultipleFieldConfigSchema: z.ZodUnion<readonly [z.ZodObject<{
8
+ destinationDb: z.ZodOptional<z.ZodObject<{
9
+ table: z.ZodString;
10
+ itemIdentifier: z.ZodString;
11
+ selectIdentifier: z.ZodString;
12
+ }, z.core.$strict>>;
13
+ checkValuesExist: z.ZodOptional<z.ZodBoolean>;
14
+ options: z.ZodOptional<z.ZodNever>;
15
+ db: z.ZodObject<{
16
+ table: z.ZodString;
17
+ identifier: z.ZodString;
18
+ label: z.ZodString;
19
+ orderBy: z.ZodOptional<z.ZodString>;
20
+ }, z.core.$strict>;
21
+ section: z.ZodOptional<z.ZodNever>;
22
+ }, z.core.$strict>, z.ZodObject<{
23
+ destinationDb: z.ZodOptional<z.ZodObject<{
24
+ table: z.ZodString;
25
+ itemIdentifier: z.ZodString;
26
+ selectIdentifier: z.ZodString;
27
+ }, z.core.$strict>>;
28
+ checkValuesExist: z.ZodOptional<z.ZodBoolean>;
29
+ options: z.ZodOptional<z.ZodArray<z.ZodObject<{
30
+ value: z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>;
31
+ label: z.ZodString;
32
+ }, z.core.$strict>>>;
33
+ db: z.ZodOptional<z.ZodNever>;
34
+ section: z.ZodCustom<{
35
+ type: "has_items" | "category";
36
+ name: string;
37
+ depth?: number;
38
+ build(): HasItemsSection | CategorySection;
39
+ }, {
40
+ type: "has_items" | "category";
41
+ name: string;
42
+ depth?: number;
43
+ build(): HasItemsSection | CategorySection;
44
+ }>;
45
+ }, z.core.$strict>, z.ZodObject<{
46
+ destinationDb: z.ZodOptional<z.ZodObject<{
47
+ table: z.ZodString;
48
+ itemIdentifier: z.ZodString;
49
+ selectIdentifier: z.ZodString;
50
+ }, z.core.$strict>>;
51
+ checkValuesExist: z.ZodOptional<z.ZodBoolean>;
52
+ options: z.ZodArray<z.ZodObject<{
53
+ value: z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>;
54
+ label: z.ZodString;
55
+ }, z.core.$strict>>;
56
+ db: z.ZodOptional<z.ZodNever>;
57
+ section: z.ZodOptional<z.ZodNever>;
58
+ }, z.core.$strict>]>;
59
+ type SelectMultipleFieldConfig = z.infer<typeof selectMultipleFieldConfigSchema>;
60
+ export declare class SelectMultipleField extends Field<'select_multiple', SelectMultipleFieldConfig> {
61
+ static readonly [entityKind]: string;
62
+ readonly checkValuesExist: boolean;
63
+ readonly optionsType: 'db' | 'section' | 'static';
64
+ readonly db: {
65
+ table: string;
66
+ identifier: string;
67
+ label: string;
68
+ orderBy?: string;
69
+ };
70
+ options: SelectOption[] | undefined;
71
+ readonly destinationDb?: {
72
+ table: string;
73
+ itemIdentifier: string;
74
+ selectIdentifier: string;
75
+ };
76
+ value: SelectOption[] | undefined;
77
+ private _itemIdentifier;
78
+ constructor(config: BaseFieldConfig<SelectMultipleFieldConfig>);
79
+ static getEntityKind(): string;
80
+ hasSqlNameAndValue(): boolean;
81
+ /**
82
+ * Get the value of the field
83
+ */
84
+ getValue(): {
85
+ value: string | number;
86
+ label: string;
87
+ }[] | undefined;
88
+ /**
89
+ * Get the value of the field when submitting to the database
90
+ */
91
+ getSubmitValue(): string | SelectOption[] | undefined;
92
+ /**
93
+ * Set the value of the field
94
+ * @param value can be a string of comma-separated values coming from the db table,
95
+ * or an array of `SelectOption` objects coming from the client
96
+ */
97
+ setValue(value: string | SelectOption[]): void;
98
+ exportForClient(): {
99
+ options: {
100
+ value: string | number;
101
+ label: string;
102
+ }[] | undefined;
103
+ value: {
104
+ value: string | number;
105
+ label: string;
106
+ }[] | undefined;
107
+ type: "select_multiple";
108
+ name: string;
109
+ label: string;
110
+ required: boolean;
111
+ conditionalFields: import("../types").ConditionalField[];
112
+ readonly: boolean;
113
+ defaultValue: any;
114
+ };
115
+ postSubmit(itemId: string): Promise<void>;
116
+ postSubmitRollback(): Promise<void>;
117
+ /**
118
+ * Build the field to be used in a form
119
+ */
120
+ build(): Promise<void>;
121
+ private fetchOptions;
122
+ /**
123
+ * Check if table and columns exist
124
+ * @private
125
+ */
126
+ private checkDBTableAndColumns;
127
+ /**
128
+ * Check if destination table and columns exist
129
+ * @private
130
+ */
131
+ private checkDestinationDBTableAndColumns;
132
+ /**
133
+ * Check the db config is set
134
+ * @private
135
+ */
136
+ private checkDBConfig;
137
+ /**
138
+ * Check the destination db config is set
139
+ * @private
140
+ */
141
+ private checkDestinationDBConfig;
142
+ checkRequired(): void;
143
+ /**
144
+ * Prepare the field for submission
145
+ */
146
+ prepareForSubmission(): Promise<void>;
147
+ }
148
+ export type SelectMultipleFieldClientConfig = ReturnType<SelectMultipleField['exportForClient']>;
149
+ declare const selectMultipleFieldHelperConfigSchema: z.ZodIntersection<z.ZodUnion<readonly [z.ZodObject<{
150
+ destinationDb: z.ZodOptional<z.ZodObject<{
151
+ table: z.ZodString;
152
+ itemIdentifier: z.ZodString;
153
+ selectIdentifier: z.ZodString;
154
+ }, z.core.$strict>>;
155
+ checkValuesExist: z.ZodOptional<z.ZodBoolean>;
156
+ options: z.ZodOptional<z.ZodNever>;
157
+ db: z.ZodObject<{
158
+ table: z.ZodString;
159
+ identifier: z.ZodString;
160
+ label: z.ZodString;
161
+ orderBy: z.ZodOptional<z.ZodString>;
162
+ }, z.core.$strict>;
163
+ section: z.ZodOptional<z.ZodNever>;
164
+ name: z.ZodString;
165
+ label: z.ZodOptional<z.ZodString>;
166
+ required: z.ZodOptional<z.ZodBoolean>;
167
+ defaultValue: z.ZodOptional<z.ZodAny>;
168
+ order: z.ZodOptional<z.ZodNumber>;
169
+ conditionalRules: z.ZodOptional<z.ZodArray<z.ZodCustom<import("../types").ConditionalRule, import("../types").ConditionalRule>>>;
170
+ adminGenerated: z.ZodOptional<z.ZodUnion<readonly [z.ZodLiteral<true>, z.ZodLiteral<false>, z.ZodLiteral<"readonly">]>>;
171
+ }, z.core.$strict>, z.ZodObject<{
172
+ destinationDb: z.ZodOptional<z.ZodObject<{
173
+ table: z.ZodString;
174
+ itemIdentifier: z.ZodString;
175
+ selectIdentifier: z.ZodString;
176
+ }, z.core.$strict>>;
177
+ checkValuesExist: z.ZodOptional<z.ZodBoolean>;
178
+ options: z.ZodOptional<z.ZodArray<z.ZodObject<{
179
+ value: z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>;
180
+ label: z.ZodString;
181
+ }, z.core.$strict>>>;
182
+ db: z.ZodOptional<z.ZodNever>;
183
+ section: z.ZodCustom<{
184
+ type: "has_items" | "category";
185
+ name: string;
186
+ depth?: number;
187
+ build(): HasItemsSection | CategorySection;
188
+ }, {
189
+ type: "has_items" | "category";
190
+ name: string;
191
+ depth?: number;
192
+ build(): HasItemsSection | CategorySection;
193
+ }>;
194
+ name: z.ZodString;
195
+ label: z.ZodOptional<z.ZodString>;
196
+ required: z.ZodOptional<z.ZodBoolean>;
197
+ defaultValue: z.ZodOptional<z.ZodAny>;
198
+ order: z.ZodOptional<z.ZodNumber>;
199
+ conditionalRules: z.ZodOptional<z.ZodArray<z.ZodCustom<import("../types").ConditionalRule, import("../types").ConditionalRule>>>;
200
+ adminGenerated: z.ZodOptional<z.ZodUnion<readonly [z.ZodLiteral<true>, z.ZodLiteral<false>, z.ZodLiteral<"readonly">]>>;
201
+ }, z.core.$strict>, z.ZodObject<{
202
+ destinationDb: z.ZodOptional<z.ZodObject<{
203
+ table: z.ZodString;
204
+ itemIdentifier: z.ZodString;
205
+ selectIdentifier: z.ZodString;
206
+ }, z.core.$strict>>;
207
+ checkValuesExist: z.ZodOptional<z.ZodBoolean>;
208
+ options: z.ZodArray<z.ZodObject<{
209
+ value: z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>;
210
+ label: z.ZodString;
211
+ }, z.core.$strict>>;
212
+ db: z.ZodOptional<z.ZodNever>;
213
+ section: z.ZodOptional<z.ZodNever>;
214
+ name: z.ZodString;
215
+ label: z.ZodOptional<z.ZodString>;
216
+ required: z.ZodOptional<z.ZodBoolean>;
217
+ defaultValue: z.ZodOptional<z.ZodAny>;
218
+ order: z.ZodOptional<z.ZodNumber>;
219
+ conditionalRules: z.ZodOptional<z.ZodArray<z.ZodCustom<import("../types").ConditionalRule, import("../types").ConditionalRule>>>;
220
+ adminGenerated: z.ZodOptional<z.ZodUnion<readonly [z.ZodLiteral<true>, z.ZodLiteral<false>, z.ZodLiteral<"readonly">]>>;
221
+ }, z.core.$strict>]>, z.ZodObject<{
222
+ type: z.ZodLiteral<"select_multiple">;
223
+ build: z.ZodFunction<z.core.$ZodFunctionArgs, z.ZodCustom<SelectMultipleField, SelectMultipleField>>;
224
+ }, z.core.$strict>>;
225
+ /**
226
+ * SelectMultiple field configuration type
227
+ * This is a plain object that can be serialized and used anywhere.
228
+ */
229
+ export type SelectMultipleFieldConfigType = z.infer<typeof selectMultipleFieldHelperConfigSchema>;
230
+ /**
231
+ * Helper function to create a multiple select field configuration
232
+ * Returns a config object with a build() method that can be serialized and used anywhere.
233
+ */
234
+ export declare function selectMultipleField(field: BaseFieldConfig<SelectMultipleFieldConfig>): SelectMultipleFieldConfigType;
235
+ export {};
236
+ //# sourceMappingURL=selectMultiple.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"selectMultiple.d.ts","sourceRoot":"","sources":["../../../src/core/fields/selectMultiple.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,417 @@
1
+ import { Field, baseFieldConfigSchema } from './field';
2
+ import { entityKind } from '../helpers';
3
+ import { selectFieldDestinationDbSchema, selectOptionSchema } from './select';
4
+ import { MysqlTableChecker } from '../db';
5
+ import { db } from '../../db/client';
6
+ import { sql } from 'drizzle-orm';
7
+ import chalk from 'chalk';
8
+ import * as z from 'zod';
9
+ /*export type SelectMultipleValue = {
10
+ value: string | number
11
+ label: string
12
+ }*/
13
+ const selectMultipleSharedExtrasSchema = z.strictObject({
14
+ /**
15
+ * A destination table where the select values will be saved
16
+ * When this is set, the value of the field will only be saved in the destination table as one row per each value
17
+ */
18
+ destinationDb: selectFieldDestinationDbSchema.optional(),
19
+ checkValuesExist: z.boolean().optional().describe('Validate submitted values exist in the options'),
20
+ });
21
+ const selectMultipleFieldDbConfigSchema = selectMultipleSharedExtrasSchema.extend({
22
+ options: z.never().optional(),
23
+ db: z
24
+ .strictObject({
25
+ table: z.string().min(1).describe('Database table to read select options from'),
26
+ identifier: z.string().min(1).describe('Identifier column for the option'),
27
+ label: z.string().min(1).describe('Label column for the option'),
28
+ orderBy: z.string().optional().describe('Optional order by column'),
29
+ })
30
+ .describe('Database configuration for select options'),
31
+ section: z.never().optional(),
32
+ });
33
+ const selectMultipleFieldSectionConfigSchema = selectMultipleSharedExtrasSchema.extend({
34
+ options: z.array(selectOptionSchema).optional(),
35
+ db: z.never().optional(),
36
+ section: z
37
+ .custom()
38
+ .describe('Section to derive select options from'),
39
+ });
40
+ const selectMultipleFieldStaticConfigSchema = selectMultipleSharedExtrasSchema.extend({
41
+ options: z.array(selectOptionSchema).min(1).describe('List of static select options'),
42
+ db: z.never().optional(),
43
+ section: z.never().optional(),
44
+ });
45
+ const selectMultipleFieldConfigSchema = z.union([
46
+ selectMultipleFieldDbConfigSchema,
47
+ selectMultipleFieldSectionConfigSchema,
48
+ selectMultipleFieldStaticConfigSchema,
49
+ ]);
50
+ export class SelectMultipleField extends Field {
51
+ static [entityKind] = 'SelectMultipleField';
52
+ checkValuesExist;
53
+ optionsType;
54
+ db;
55
+ /*protected*/ options;
56
+ destinationDb;
57
+ value = undefined;
58
+ _itemIdentifier;
59
+ constructor(config) {
60
+ super(config, 'select_multiple');
61
+ this.checkValuesExist = config.checkValuesExist ?? true;
62
+ this.destinationDb = config.destinationDb;
63
+ /**
64
+ * If options are static, set them
65
+ */
66
+ if (config.options && config.options?.length > 0) {
67
+ this.options = config.options;
68
+ this.optionsType = 'static';
69
+ this.db = null;
70
+ }
71
+ else if (config.db) {
72
+ /**
73
+ * Else, check if the db config is set
74
+ */
75
+ this.db = config.db;
76
+ this.optionsType = 'db';
77
+ }
78
+ else if (config.section) {
79
+ /**
80
+ * Else, check if the section config is set
81
+ */
82
+ /**
83
+ * Runtime validation: Ensure the section is a HasItemsSection or CategorySection
84
+ * TypeScript ensures type safety at compile time, but runtime data (from JSON/APIs)
85
+ * can violate types, so we validate here for safety.
86
+ */
87
+ const sectionType = config.section.type;
88
+ if (sectionType !== 'has_items' && sectionType !== 'category') {
89
+ const message = `[SelectMultipleField: ${this.label}]: Section must be a HasItemsSection or CategorySection, but got type: ${sectionType ?? 'undefined'}`;
90
+ console.error(chalk.red.bold(message));
91
+ console.error(chalk.yellow('Please make sure the section is a HasItemsSection or CategorySection'));
92
+ throw new Error(message);
93
+ }
94
+ /**
95
+ * Build the section and set the options type to section
96
+ */
97
+ let section = config.section.build();
98
+ this.optionsType = 'section';
99
+ this.db = {
100
+ table: section.db.table,
101
+ identifier: section.db.identifier.name,
102
+ label: section.headingField.name,
103
+ orderBy: section.db.orderByField ? section.db.orderByField.name : section.db.identifier.name,
104
+ };
105
+ /**
106
+ * Set the section instance to undefined to avoid memory leaks
107
+ */
108
+ section = undefined;
109
+ }
110
+ else {
111
+ throw new Error('Select field requires either db, section or an options array.');
112
+ }
113
+ }
114
+ static getEntityKind() {
115
+ return SelectMultipleField[entityKind];
116
+ }
117
+ hasSqlNameAndValue() {
118
+ return this.destinationDb === undefined;
119
+ }
120
+ /**
121
+ * Get the value of the field
122
+ */
123
+ getValue() {
124
+ return this.value;
125
+ }
126
+ /**
127
+ * Get the value of the field when submitting to the database
128
+ */
129
+ getSubmitValue() {
130
+ if (!this.hasSqlNameAndValue())
131
+ return;
132
+ /**
133
+ * Set the value as a comma separated string of the values
134
+ */
135
+ return this.value?.map((value) => value.value).join(',');
136
+ }
137
+ /**
138
+ * Set the value of the field
139
+ * @param value can be a string of comma-separated values coming from the db table,
140
+ * or an array of `SelectOption` objects coming from the client
141
+ */
142
+ setValue(value) {
143
+ if (typeof value === 'string') {
144
+ /**
145
+ * Value can be an encoded JSON string sent from the client,
146
+ * try parsing the value as a JSON string
147
+ */
148
+ let decoded;
149
+ try {
150
+ decoded = JSON.parse(value);
151
+ }
152
+ catch (error) {
153
+ decoded = undefined;
154
+ }
155
+ if (!Array.isArray(decoded)) {
156
+ /**
157
+ * If the decoded value is not an array (which means it should be a string coming from the db table),
158
+ * split the values by comma and set the value as an array of objects
159
+ */
160
+ const values = value.split(',');
161
+ values.map((value) => {
162
+ /**
163
+ * Check if the value exists in the options and return the value and text
164
+ */
165
+ const option = this.options?.find((option) => option.value.toString() === value.toString());
166
+ if (option) {
167
+ if (!this.value) {
168
+ this.value = [];
169
+ }
170
+ this.value.push(option);
171
+ }
172
+ });
173
+ }
174
+ else {
175
+ /**
176
+ * If the decoded value is an array, set the value as the decoded value
177
+ */
178
+ this.value = decoded;
179
+ }
180
+ }
181
+ else {
182
+ this.value = value;
183
+ }
184
+ }
185
+ exportForClient() {
186
+ return {
187
+ ...super.exportForClient(),
188
+ options: this.options,
189
+ value: this.value,
190
+ };
191
+ }
192
+ async postSubmit(itemId) {
193
+ if (!this.destinationDb)
194
+ return;
195
+ this._itemIdentifier = itemId;
196
+ try {
197
+ /**
198
+ * Delete the existing values
199
+ */
200
+ await db.execute(sql `DELETE FROM \`${sql.raw(this.destinationDb.table)}\` WHERE \`${sql.raw(this.destinationDb.itemIdentifier)}\` = ${this._itemIdentifier}`);
201
+ /**
202
+ * Prepare the sql statement
203
+ */
204
+ const sqlChunks = [];
205
+ sqlChunks.push(sql `INSERT INTO \`${sql.raw(this.destinationDb.table)}\` (\`${sql.raw(this.destinationDb.selectIdentifier)}\`, \`${sql.raw(this.destinationDb.itemIdentifier)}\`) VALUES `);
206
+ /**
207
+ * Loop through the values and add them to the sql statement values
208
+ */
209
+ if (this.value && this.value.length > 0) {
210
+ const count = this.value.length;
211
+ this.value.forEach((value, index) => {
212
+ sqlChunks.push(sql `(${value.value}, ${this._itemIdentifier})`);
213
+ if (index < count - 1) {
214
+ /**
215
+ * Add a comma to separate the values in the sql statement
216
+ */
217
+ sqlChunks.push(sql `, `);
218
+ }
219
+ });
220
+ }
221
+ /**
222
+ * Join the sql chunks
223
+ */
224
+ const finalSql = sql.join(sqlChunks);
225
+ /**
226
+ * Execute the sql statement
227
+ */
228
+ await db.execute(finalSql);
229
+ }
230
+ catch (error) {
231
+ throw new Error(`${this.label}: Error saving values to the destination table`);
232
+ }
233
+ }
234
+ async postSubmitRollback() {
235
+ if (!this.destinationDb)
236
+ return;
237
+ if (!this._itemIdentifier) {
238
+ throw new Error(`${this.label}: Item identifier is not set. Make sure to set the item identifier by calling postSubmit() before calling postSubmitRollback()`);
239
+ }
240
+ try {
241
+ await db.execute(sql `DELETE FROM \`${sql.raw(this.destinationDb.table)}\` WHERE \`${sql.raw(this.destinationDb.itemIdentifier)}\` = ${this._itemIdentifier}`);
242
+ }
243
+ catch (error) {
244
+ throw new Error(`${this.label}: Error deleting values from the destination table`);
245
+ }
246
+ }
247
+ /**
248
+ * Build the field to be used in a form
249
+ */
250
+ async build() {
251
+ if (this.destinationDb) {
252
+ this.checkDestinationDBConfig();
253
+ await this.checkDestinationDBTableAndColumns();
254
+ }
255
+ /**
256
+ * If options are already set, return
257
+ */
258
+ if (this.options && this.optionsType === 'static')
259
+ return;
260
+ /**
261
+ * Initialize the select db and options
262
+ */
263
+ this.checkDBConfig();
264
+ await this.checkDBTableAndColumns();
265
+ /**
266
+ * Fetch the options
267
+ */
268
+ await this.fetchOptions();
269
+ }
270
+ async fetchOptions() {
271
+ /**
272
+ * Let's get the options for the select input
273
+ */
274
+ let selectStatement = `select * from \`${this.db.table}\` ORDER BY \`${this.db.orderBy ?? this.db.identifier}\` DESC`;
275
+ /**
276
+ * Get the options from the table
277
+ */
278
+ const selectOptionsRows = await db.execute(sql.raw(selectStatement));
279
+ const rows = selectOptionsRows[0];
280
+ const inputSelectTableIdentifierField = this.db.identifier;
281
+ const inputSelectTableHeadingField = this.db.label;
282
+ /**
283
+ * Set the options
284
+ */
285
+ this.options = rows.map((row) => ({
286
+ value: row[inputSelectTableIdentifierField],
287
+ label: row[inputSelectTableHeadingField],
288
+ }));
289
+ }
290
+ /**
291
+ * Check if table and columns exist
292
+ * @private
293
+ */
294
+ async checkDBTableAndColumns() {
295
+ const columns = await MysqlTableChecker.getColumns(this.db.table);
296
+ if (!columns.includes(this.db.identifier) || !columns.includes(this.db.label)) {
297
+ throw new Error(`Field ${this.label}: Table ${this.db.table} and/or columns: ${this.db.identifier}, ${this.db.label} do not exist in the database!`);
298
+ }
299
+ }
300
+ /**
301
+ * Check if destination table and columns exist
302
+ * @private
303
+ */
304
+ async checkDestinationDBTableAndColumns() {
305
+ if (!this.destinationDb) {
306
+ throw new Error(`Field ${this.label}: Destination table, select identifier and item identifier are required`);
307
+ }
308
+ const columns = await MysqlTableChecker.getColumns(this.destinationDb.table);
309
+ if (!columns.includes(this.destinationDb.selectIdentifier) ||
310
+ !columns.includes(this.destinationDb.itemIdentifier)) {
311
+ throw new Error(`Field ${this.label}: Table ${this.destinationDb.table} and/or columns: ${this.destinationDb.selectIdentifier}, ${this.destinationDb.itemIdentifier} do not exist in the database!`);
312
+ }
313
+ }
314
+ /**
315
+ * Check the db config is set
316
+ * @private
317
+ */
318
+ checkDBConfig() {
319
+ if (this.db.table.trim().length === 0 ||
320
+ this.db.identifier.trim().length === 0 ||
321
+ this.db.label.trim().length === 0) {
322
+ throw new Error(`Field ${this.label}: Select table, identifier and label are required`);
323
+ }
324
+ }
325
+ /**
326
+ * Check the destination db config is set
327
+ * @private
328
+ */
329
+ checkDestinationDBConfig() {
330
+ if (this.destinationDb?.table.trim().length === 0 ||
331
+ this.destinationDb?.selectIdentifier.trim().length === 0 ||
332
+ this.destinationDb?.itemIdentifier.trim().length === 0) {
333
+ throw new Error(`Field ${this.label}: Destination table, select identifier and item identifier are required`);
334
+ }
335
+ }
336
+ checkRequired() {
337
+ /**
338
+ * Check if the field is required
339
+ */
340
+ if (this.required) {
341
+ if (!this.value || this.value.length === 0) {
342
+ throw new Error(`Field ${this.label} is required`);
343
+ }
344
+ }
345
+ }
346
+ /**
347
+ * Prepare the field for submission
348
+ */
349
+ async prepareForSubmission() {
350
+ if (this.optionsType !== 'static') {
351
+ this.checkDBConfig();
352
+ await this.checkDBTableAndColumns();
353
+ /**
354
+ * Fetch the options
355
+ */
356
+ await this.fetchOptions();
357
+ }
358
+ if (this.destinationDb) {
359
+ this.checkDestinationDBConfig();
360
+ await this.checkDestinationDBTableAndColumns();
361
+ }
362
+ if (this.checkValuesExist && this.value && this.value.length > 0) {
363
+ /**
364
+ * Check if the values exist in the table
365
+ * This is now safe because we have verified the table and columns exist in the database
366
+ */
367
+ this.value.forEach((value) => {
368
+ if (!this.options?.find((option) => option.value.toString() === value.value.toString())) {
369
+ throw new Error(`Field ${this.label}: Option ${value.label} does not exist in the options`);
370
+ }
371
+ });
372
+ }
373
+ }
374
+ }
375
+ const selectMultipleFieldDbOptionsSchema = z.strictObject({
376
+ ...baseFieldConfigSchema.shape,
377
+ ...selectMultipleFieldDbConfigSchema.shape,
378
+ });
379
+ const selectMultipleFieldSectionOptionsSchema = z.strictObject({
380
+ ...baseFieldConfigSchema.shape,
381
+ ...selectMultipleFieldSectionConfigSchema.shape,
382
+ });
383
+ const selectMultipleFieldStaticOptionsSchema = z.strictObject({
384
+ ...baseFieldConfigSchema.shape,
385
+ ...selectMultipleFieldStaticConfigSchema.shape,
386
+ });
387
+ const selectMultipleFieldOptionsSchema = z.union([
388
+ selectMultipleFieldDbOptionsSchema,
389
+ selectMultipleFieldSectionOptionsSchema,
390
+ selectMultipleFieldStaticOptionsSchema,
391
+ ]);
392
+ const selectMultipleFieldHelperConfigSchema = z.intersection(selectMultipleFieldOptionsSchema, z.strictObject({
393
+ type: z.literal('select_multiple').describe('The type of the field'),
394
+ build: z
395
+ .function()
396
+ .output(z.instanceof(SelectMultipleField))
397
+ .describe('Build a SelectMultipleField instance from this config'),
398
+ }));
399
+ /**
400
+ * Helper function to create a multiple select field configuration
401
+ * Returns a config object with a build() method that can be serialized and used anywhere.
402
+ */
403
+ export function selectMultipleField(field) {
404
+ const result = selectMultipleFieldOptionsSchema.safeParse(field);
405
+ if (!result.success) {
406
+ throw new Error(`[Field: ${field.name}]: ${z.prettifyError(result.error)}`);
407
+ }
408
+ const parsedField = result.data;
409
+ const config = {
410
+ ...parsedField,
411
+ type: 'select_multiple',
412
+ build() {
413
+ return new SelectMultipleField(parsedField);
414
+ },
415
+ };
416
+ return config;
417
+ }