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.
Files changed (258) hide show
  1. package/dist/api/axios/axiosInstance.d.ts +1 -1
  2. package/dist/api/axios/axiosInstance.js +8 -8
  3. package/dist/api/index.d.ts +855 -855
  4. package/dist/api/index.d.ts.map +1 -1
  5. package/dist/api/index.js +12 -12
  6. package/dist/api/lib/serverActions.d.ts +239 -239
  7. package/dist/api/lib/serverActions.d.ts.map +1 -1
  8. package/dist/api/lib/serverActions.js +834 -834
  9. package/dist/api/root.d.ts +828 -828
  10. package/dist/api/root.js +30 -30
  11. package/dist/api/routers/accountSettings.d.ts +60 -60
  12. package/dist/api/routers/accountSettings.js +108 -108
  13. package/dist/api/routers/admins.d.ts +105 -105
  14. package/dist/api/routers/admins.js +219 -219
  15. package/dist/api/routers/auth.d.ts +47 -47
  16. package/dist/api/routers/auth.js +25 -25
  17. package/dist/api/routers/categorySection.d.ts +103 -103
  18. package/dist/api/routers/categorySection.js +38 -38
  19. package/dist/api/routers/cmsSettings.d.ts +48 -48
  20. package/dist/api/routers/cmsSettings.js +51 -51
  21. package/dist/api/routers/cpanel.d.ts +83 -83
  22. package/dist/api/routers/cpanel.js +216 -216
  23. package/dist/api/routers/files.d.ts +47 -47
  24. package/dist/api/routers/files.js +23 -23
  25. package/dist/api/routers/gallery.d.ts +35 -35
  26. package/dist/api/routers/gallery.js +62 -62
  27. package/dist/api/routers/googleAnalytics.d.ts +30 -30
  28. package/dist/api/routers/googleAnalytics.js +7 -7
  29. package/dist/api/routers/hasItemsSection.d.ts +139 -139
  30. package/dist/api/routers/hasItemsSection.js +34 -34
  31. package/dist/api/routers/navigation.d.ts +51 -51
  32. package/dist/api/routers/navigation.js +11 -11
  33. package/dist/api/routers/simpleSection.d.ts +57 -57
  34. package/dist/api/routers/simpleSection.js +12 -12
  35. package/dist/api/trpc.d.ts +106 -106
  36. package/dist/api/trpc.js +72 -72
  37. package/dist/auth/axios/axiosInstance.d.ts +1 -1
  38. package/dist/auth/axios/axiosInstance.js +8 -8
  39. package/dist/auth/csrf.d.ts +29 -29
  40. package/dist/auth/csrf.js +76 -76
  41. package/dist/auth/hooks/index.d.ts +3 -3
  42. package/dist/auth/hooks/index.d.ts.map +1 -1
  43. package/dist/auth/hooks/index.js +3 -3
  44. package/dist/auth/hooks/useAxiosPrivate.d.ts +4 -4
  45. package/dist/auth/hooks/useAxiosPrivate.js +74 -74
  46. package/dist/auth/hooks/useRefreshToken.d.ts +6 -6
  47. package/dist/auth/hooks/useRefreshToken.js +79 -79
  48. package/dist/auth/index.d.ts +22 -22
  49. package/dist/auth/index.js +44 -44
  50. package/dist/auth/jwt.d.ts +5 -5
  51. package/dist/auth/jwt.js +25 -25
  52. package/dist/auth/lib/actions.d.ts +32 -32
  53. package/dist/auth/lib/actions.d.ts.map +1 -1
  54. package/dist/auth/lib/actions.js +209 -209
  55. package/dist/auth/lib/client.d.ts +3 -3
  56. package/dist/auth/lib/client.js +46 -46
  57. package/dist/auth/lib/index.d.ts +2 -2
  58. package/dist/auth/lib/index.d.ts.map +1 -1
  59. package/dist/auth/lib/index.js +2 -2
  60. package/dist/auth/react.d.ts +105 -105
  61. package/dist/auth/react.d.ts.map +1 -1
  62. package/dist/auth/react.js +347 -347
  63. package/dist/auth/trpc.d.ts +5 -5
  64. package/dist/auth/trpc.d.ts.map +1 -1
  65. package/dist/auth/trpc.js +81 -81
  66. package/dist/core/config/config-loader.d.ts +91 -91
  67. package/dist/core/config/config-loader.js +230 -230
  68. package/dist/core/config/index.d.ts +2 -2
  69. package/dist/core/config/index.d.ts.map +1 -1
  70. package/dist/core/config/index.js +1 -1
  71. package/dist/core/config/loader.d.ts +1 -1
  72. package/dist/core/config/loader.js +42 -42
  73. package/dist/core/db/index.d.ts +1 -1
  74. package/dist/core/db/index.d.ts.map +1 -1
  75. package/dist/core/db/index.js +1 -1
  76. package/dist/core/db/table-checker/DbTable.d.ts +5 -5
  77. package/dist/core/db/table-checker/DbTable.js +5 -5
  78. package/dist/core/db/table-checker/MysqlTable.d.ts +33 -33
  79. package/dist/core/db/table-checker/MysqlTable.d.ts.map +1 -1
  80. package/dist/core/db/table-checker/MysqlTable.js +94 -94
  81. package/dist/core/db/table-checker/index.d.ts +1 -1
  82. package/dist/core/db/table-checker/index.d.ts.map +1 -1
  83. package/dist/core/db/table-checker/index.js +1 -1
  84. package/dist/core/factories/FieldFactory.d.ts +123 -123
  85. package/dist/core/factories/FieldFactory.d.ts.map +1 -1
  86. package/dist/core/factories/FieldFactory.js +411 -411
  87. package/dist/core/factories/SectionFactory.d.ts +109 -109
  88. package/dist/core/factories/SectionFactory.d.ts.map +1 -1
  89. package/dist/core/factories/SectionFactory.js +415 -415
  90. package/dist/core/factories/index.d.ts +2 -2
  91. package/dist/core/factories/index.d.ts.map +1 -1
  92. package/dist/core/factories/index.js +2 -2
  93. package/dist/core/fields/checkbox.d.ts +62 -62
  94. package/dist/core/fields/checkbox.d.ts.map +1 -1
  95. package/dist/core/fields/checkbox.js +62 -62
  96. package/dist/core/fields/color.d.ts +83 -83
  97. package/dist/core/fields/color.d.ts.map +1 -1
  98. package/dist/core/fields/color.js +91 -91
  99. package/dist/core/fields/date.d.ts +99 -99
  100. package/dist/core/fields/date.d.ts.map +1 -1
  101. package/dist/core/fields/date.js +108 -108
  102. package/dist/core/fields/document.d.ts +179 -179
  103. package/dist/core/fields/document.d.ts.map +1 -1
  104. package/dist/core/fields/document.js +277 -277
  105. package/dist/core/fields/field-group.d.ts +17 -17
  106. package/dist/core/fields/field-group.d.ts.map +1 -1
  107. package/dist/core/fields/field-group.js +6 -6
  108. package/dist/core/fields/field.d.ts +125 -125
  109. package/dist/core/fields/field.d.ts.map +1 -1
  110. package/dist/core/fields/field.js +148 -148
  111. package/dist/core/fields/fileField.d.ts +14 -14
  112. package/dist/core/fields/fileField.d.ts.map +1 -1
  113. package/dist/core/fields/fileField.js +5 -5
  114. package/dist/core/fields/index.d.ts +64 -64
  115. package/dist/core/fields/index.d.ts.map +1 -1
  116. package/dist/core/fields/index.js +18 -18
  117. package/dist/core/fields/map.d.ts +166 -166
  118. package/dist/core/fields/map.d.ts.map +1 -1
  119. package/dist/core/fields/map.js +152 -152
  120. package/dist/core/fields/number.d.ts +185 -185
  121. package/dist/core/fields/number.d.ts.map +1 -1
  122. package/dist/core/fields/number.js +241 -241
  123. package/dist/core/fields/password.d.ts +108 -108
  124. package/dist/core/fields/password.d.ts.map +1 -1
  125. package/dist/core/fields/password.js +133 -133
  126. package/dist/core/fields/photo.d.ts +288 -288
  127. package/dist/core/fields/photo.d.ts.map +1 -1
  128. package/dist/core/fields/photo.js +410 -410
  129. package/dist/core/fields/richText.d.ts +294 -294
  130. package/dist/core/fields/richText.d.ts.map +1 -1
  131. package/dist/core/fields/richText.js +338 -338
  132. package/dist/core/fields/select.d.ts +365 -365
  133. package/dist/core/fields/select.d.ts.map +1 -1
  134. package/dist/core/fields/select.js +499 -499
  135. package/dist/core/fields/selectMultiple.d.ts +235 -235
  136. package/dist/core/fields/selectMultiple.d.ts.map +1 -1
  137. package/dist/core/fields/selectMultiple.js +417 -417
  138. package/dist/core/fields/tags.d.ts +130 -130
  139. package/dist/core/fields/tags.d.ts.map +1 -1
  140. package/dist/core/fields/tags.js +105 -105
  141. package/dist/core/fields/text.d.ts +135 -135
  142. package/dist/core/fields/text.d.ts.map +1 -1
  143. package/dist/core/fields/text.js +157 -157
  144. package/dist/core/fields/textArea.d.ts +106 -106
  145. package/dist/core/fields/textArea.d.ts.map +1 -1
  146. package/dist/core/fields/textArea.js +126 -126
  147. package/dist/core/fields/video.d.ts +147 -147
  148. package/dist/core/fields/video.d.ts.map +1 -1
  149. package/dist/core/fields/video.js +248 -248
  150. package/dist/core/helpers/entity.d.ts +7 -7
  151. package/dist/core/helpers/entity.js +27 -27
  152. package/dist/core/helpers/index.d.ts +4 -4
  153. package/dist/core/helpers/index.d.ts.map +1 -1
  154. package/dist/core/helpers/index.js +3 -3
  155. package/dist/core/index.d.ts +7 -7
  156. package/dist/core/index.d.ts.map +1 -1
  157. package/dist/core/index.js +7 -7
  158. package/dist/core/sections/category.d.ts +282 -282
  159. package/dist/core/sections/category.d.ts.map +1 -1
  160. package/dist/core/sections/category.js +147 -147
  161. package/dist/core/sections/hasItems.d.ts +631 -631
  162. package/dist/core/sections/hasItems.d.ts.map +1 -1
  163. package/dist/core/sections/hasItems.js +144 -144
  164. package/dist/core/sections/index.d.ts +4 -4
  165. package/dist/core/sections/index.d.ts.map +1 -1
  166. package/dist/core/sections/index.js +4 -4
  167. package/dist/core/sections/section.d.ts +225 -225
  168. package/dist/core/sections/section.d.ts.map +1 -1
  169. package/dist/core/sections/section.js +341 -341
  170. package/dist/core/sections/simple.d.ts +98 -98
  171. package/dist/core/sections/simple.d.ts.map +1 -1
  172. package/dist/core/sections/simple.js +95 -95
  173. package/dist/core/security/dom.d.ts +10 -10
  174. package/dist/core/security/dom.js +92 -92
  175. package/dist/core/submit/ItemEditSubmit.d.ts +75 -75
  176. package/dist/core/submit/ItemEditSubmit.js +186 -186
  177. package/dist/core/submit/NewItemSubmit.d.ts +13 -13
  178. package/dist/core/submit/NewItemSubmit.js +93 -93
  179. package/dist/core/submit/SimpleSectionSubmit.d.ts +12 -12
  180. package/dist/core/submit/SimpleSectionSubmit.js +93 -93
  181. package/dist/core/submit/index.d.ts +4 -4
  182. package/dist/core/submit/index.js +4 -4
  183. package/dist/core/submit/submit.d.ts +115 -115
  184. package/dist/core/submit/submit.js +479 -479
  185. package/dist/core/types/index.d.ts +279 -279
  186. package/dist/core/types/index.d.ts.map +1 -1
  187. package/dist/core/types/index.js +1 -1
  188. package/dist/db/client.d.ts +8 -8
  189. package/dist/db/client.d.ts.map +1 -1
  190. package/dist/db/client.js +19 -19
  191. package/dist/db/config.d.ts +5 -5
  192. package/dist/db/config.js +22 -22
  193. package/dist/db/drizzle.config.d.ts +5 -5
  194. package/dist/db/drizzle.config.js +18 -18
  195. package/dist/db/index.d.ts +2 -2
  196. package/dist/db/index.js +3 -3
  197. package/dist/db/schema.d.ts +638 -638
  198. package/dist/db/schema.js +73 -73
  199. package/dist/index.d.ts +7 -7
  200. package/dist/index.d.ts.map +1 -1
  201. package/dist/index.js +7 -7
  202. package/dist/translations/index.d.ts +2 -2
  203. package/dist/translations/index.js +15 -15
  204. package/dist/utils/CpanelApi.d.ts +24 -24
  205. package/dist/utils/CpanelApi.js +64 -64
  206. package/dist/utils/constants.d.ts +13 -13
  207. package/dist/utils/constants.js +61 -61
  208. package/dist/utils/index.d.ts +4 -4
  209. package/dist/utils/index.d.ts.map +1 -1
  210. package/dist/utils/index.js +4 -4
  211. package/dist/utils/utils.d.ts +59 -59
  212. package/dist/utils/utils.js +132 -132
  213. package/dist/validators/checkbox.d.ts +3 -3
  214. package/dist/validators/checkbox.d.ts.map +1 -1
  215. package/dist/validators/checkbox.js +12 -12
  216. package/dist/validators/color.d.ts +3 -3
  217. package/dist/validators/color.d.ts.map +1 -1
  218. package/dist/validators/color.js +7 -7
  219. package/dist/validators/date.d.ts +3 -3
  220. package/dist/validators/date.d.ts.map +1 -1
  221. package/dist/validators/date.js +5 -5
  222. package/dist/validators/document.d.ts +3 -3
  223. package/dist/validators/document.d.ts.map +1 -1
  224. package/dist/validators/document.js +57 -57
  225. package/dist/validators/index.d.ts +14 -14
  226. package/dist/validators/index.d.ts.map +1 -1
  227. package/dist/validators/index.js +14 -14
  228. package/dist/validators/map.d.ts +3 -3
  229. package/dist/validators/map.d.ts.map +1 -1
  230. package/dist/validators/map.js +5 -5
  231. package/dist/validators/number.d.ts +3 -3
  232. package/dist/validators/number.d.ts.map +1 -1
  233. package/dist/validators/number.js +20 -20
  234. package/dist/validators/password.d.ts +3 -3
  235. package/dist/validators/password.d.ts.map +1 -1
  236. package/dist/validators/password.js +11 -11
  237. package/dist/validators/photo.d.ts +3 -3
  238. package/dist/validators/photo.d.ts.map +1 -1
  239. package/dist/validators/photo.js +100 -100
  240. package/dist/validators/richText.d.ts +3 -3
  241. package/dist/validators/richText.d.ts.map +1 -1
  242. package/dist/validators/richText.js +8 -8
  243. package/dist/validators/select-multiple.d.ts +9 -9
  244. package/dist/validators/select-multiple.d.ts.map +1 -1
  245. package/dist/validators/select-multiple.js +20 -20
  246. package/dist/validators/select.d.ts +3 -3
  247. package/dist/validators/select.d.ts.map +1 -1
  248. package/dist/validators/select.js +5 -5
  249. package/dist/validators/text.d.ts +3 -3
  250. package/dist/validators/text.d.ts.map +1 -1
  251. package/dist/validators/text.js +7 -7
  252. package/dist/validators/textarea.d.ts +3 -3
  253. package/dist/validators/textarea.d.ts.map +1 -1
  254. package/dist/validators/textarea.js +7 -7
  255. package/dist/validators/video.d.ts +3 -3
  256. package/dist/validators/video.d.ts.map +1 -1
  257. package/dist/validators/video.js +57 -57
  258. package/package.json +4 -5
@@ -1,241 +1,241 @@
1
- import { Field, baseFieldConfigSchema } from "./field.js";
2
- import { entityKind } from "../helpers.js";
3
- import * as z from 'zod';
4
- const numberFieldAutoIncConfigSchema = z.strictObject({
5
- hasAutoIncrement: z.literal(true).describe('Enable auto-increment for this field'),
6
- /** Auto-increment is always integer. Allowing override to 'int' only (optional). */
7
- format: z.literal('int').optional().describe('Format for auto-increment (must be int)'),
8
- adminGenerated: z.never().optional(),
9
- placeholder: z.never().optional(),
10
- minValue: z.never().optional(),
11
- maxValue: z.never().optional(),
12
- minLength: z.never().optional(),
13
- maxLength: z.never().optional(),
14
- defaultValue: z.never().optional(),
15
- });
16
- const numberFieldManualConfigSchema = z.strictObject({
17
- hasAutoIncrement: z.literal(false).optional().describe('Disable auto-increment (manual input)'),
18
- format: z.enum(['int', 'float', 'double']).optional().describe('Number format'),
19
- adminGenerated: z.union([z.literal(true), z.literal(false), z.literal('readonly')]).optional(),
20
- placeholder: z.string().optional().describe('Placeholder text for the input'),
21
- minValue: z.number().optional().describe('Minimum allowed value'),
22
- maxValue: z.number().optional().describe('Maximum allowed value'),
23
- minLength: z.number().optional().describe('Minimum string length of the number'),
24
- maxLength: z.number().optional().describe('Maximum string length of the number'),
25
- /**
26
- * The default value of the field.
27
- * If set, the field will be pre-populated with this value when the form is loaded.
28
- * If `adminGenerated` is not true, the field will be included when submitting the form with this value.
29
- */
30
- defaultValue: z.number().optional().describe('Default value for the field'),
31
- });
32
- const configSchema = z.discriminatedUnion('hasAutoIncrement', [
33
- numberFieldAutoIncConfigSchema,
34
- numberFieldManualConfigSchema,
35
- ]);
36
- export class NumberField extends Field {
37
- static [entityKind] = 'NumberField';
38
- format;
39
- minValue;
40
- maxValue;
41
- placeholder;
42
- hasAutoIncrement;
43
- minLength;
44
- maxLength;
45
- _defaultValue;
46
- value;
47
- constructor(config) {
48
- super(config, 'number');
49
- this.hasAutoIncrement = config.hasAutoIncrement;
50
- this.minValue = config.minValue;
51
- this.maxValue = config.maxValue;
52
- this.placeholder = config.placeholder;
53
- this.minLength = config.minLength;
54
- this.maxLength = config.maxLength;
55
- // default to 'int' whether auto-increment or not
56
- this.format = this.hasAutoIncrement ? (config.format ?? 'int') : (config.format ?? 'int');
57
- /**
58
- * Logic: if auto-increment and format not 'int', force it.
59
- */
60
- if (this.hasAutoIncrement && this.format !== 'int') {
61
- console.warn(`[NumberField:${this.label}] auto-increment forces format 'int'. Received '${config.format}'. Coercing to 'int'.`);
62
- }
63
- /**
64
- * Apply initial value from default
65
- */
66
- this.value = config.defaultValue;
67
- this._defaultValue = config.defaultValue;
68
- /**
69
- * Force the userGenerated to false if the field has auto increment
70
- */
71
- if (this.hasAutoIncrement === true) {
72
- this.adminGenerated = false;
73
- }
74
- /**
75
- * Basic structural logic checks
76
- */
77
- if (this.minValue !== undefined && this.maxValue !== undefined && this.minValue > this.maxValue) {
78
- throw new Error(`Field ${this.label} has minValue > maxValue`);
79
- }
80
- if (this.minLength !== undefined && this.maxLength !== undefined && this.minLength > this.maxLength) {
81
- throw new Error(`Field ${this.label} has minLength > maxLength`);
82
- }
83
- /**
84
- * Attempt to coerce the value
85
- */
86
- this.coerceValue();
87
- }
88
- /**
89
- * Coerce the value to a number
90
- */
91
- coerceValue() {
92
- /**
93
- * Check if the value is not undefined
94
- */
95
- if (this.value !== undefined) {
96
- /**
97
- * Coerce the value
98
- */
99
- this.value = Number(this.value);
100
- }
101
- }
102
- exportForClient() {
103
- return {
104
- ...super.exportForClient(),
105
- format: this.format,
106
- placeholder: this.placeholder,
107
- minValue: this.minValue,
108
- maxValue: this.maxValue,
109
- minLength: this.minLength,
110
- maxLength: this.maxLength,
111
- };
112
- }
113
- /**
114
- * Get the value of the field
115
- */
116
- getValue() {
117
- return Number.isNaN(this.value) ? undefined : this.value;
118
- }
119
- hasSqlNameAndValue() {
120
- /**
121
- * Skip if the field has auto increment enabled in the database
122
- */
123
- if (this.hasAutoIncrement) {
124
- return false;
125
- }
126
- /**
127
- * Include the field in the SQL if it is admin-generated, or not admin-generated but has a default value
128
- */
129
- return this.adminGenerated === true || this._defaultValue !== undefined;
130
- }
131
- checkRequired() {
132
- /**
133
- * Skip if the field has auto increment enabled,
134
- * because it will be auto generated in the database
135
- */
136
- if (this.hasAutoIncrement)
137
- return;
138
- /**
139
- * Check if the field is required
140
- * Note: We explicitly check for undefined/null instead of using !this.value
141
- * because 0 is a valid number value but falsy in JavaScript
142
- */
143
- if (this.required) {
144
- if (this.value === undefined || this.value === null || Number.isNaN(this.value)) {
145
- throw new Error(`Field ${this.label} is required`);
146
- }
147
- }
148
- }
149
- /**
150
- * Prepare the field for submission
151
- */
152
- async prepareForSubmission() {
153
- /**
154
- * Check if the field has auto increment enabled
155
- * If it does, we don't need to do anything
156
- */
157
- if (this.hasAutoIncrement) {
158
- return;
159
- }
160
- if (this.value) {
161
- /**
162
- * Check min
163
- */
164
- if (this.minValue) {
165
- if (this.minValue > this.value) {
166
- throw new Error(`Field ${this.label} must be ${this.minValue} and above`);
167
- }
168
- }
169
- /**
170
- * Check max
171
- */
172
- if (this.maxValue) {
173
- if (this.maxValue < this.value) {
174
- throw new Error(`Field ${this.label} must be ${this.maxValue} and below`);
175
- }
176
- }
177
- /**
178
- * Check minimum length
179
- */
180
- if (this.minLength) {
181
- if (this.minLength > this.value.toString().length) {
182
- throw new Error(`Field ${this.label} must be at least ${this.minLength} characters long`);
183
- }
184
- }
185
- /**
186
- * Check maximum length
187
- */
188
- if (this.maxLength) {
189
- if (this.maxLength < this.value.toString().length) {
190
- throw new Error(`Field ${this.label} must be at most ${this.maxLength} characters long`);
191
- }
192
- }
193
- }
194
- }
195
- }
196
- const numberFieldAutoIncOptionsSchema = z.strictObject({
197
- ...baseFieldConfigSchema.shape,
198
- ...numberFieldAutoIncConfigSchema.shape,
199
- });
200
- const numberFieldManualOptionsSchema = z.strictObject({
201
- ...baseFieldConfigSchema.shape,
202
- ...numberFieldManualConfigSchema.shape,
203
- });
204
- const optionsSchema = z.discriminatedUnion('hasAutoIncrement', [
205
- numberFieldAutoIncOptionsSchema,
206
- numberFieldManualOptionsSchema,
207
- ]);
208
- const numberFieldConfigSchema = z.intersection(optionsSchema, z.strictObject({
209
- type: z.literal('number').describe('The type of the field'),
210
- build: z.function().output(z.instanceof(NumberField)).describe('Build a NumberField instance from this config'),
211
- }));
212
- /**
213
- * Helper function to create a number field configuration
214
- * Returns a config object with a build() method that can be serialized and used anywhere
215
- *
216
- * @example
217
- * ```typescript
218
- * const fieldConfig = numberField({ name: 'age', label: 'Age', required: true, order: 1 })
219
- * const fieldInstance = fieldConfig.build()
220
- * ```
221
- *
222
- * @param field
223
- */
224
- export function numberField(field) {
225
- /**
226
- * Validate the field config
227
- */
228
- const result = optionsSchema.safeParse(field);
229
- if (!result.success) {
230
- throw new Error(`[Field: ${field.name}]: ${z.prettifyError(result.error)}`);
231
- }
232
- const config = {
233
- ...field,
234
- type: 'number',
235
- build() {
236
- // Use the original field config directly (it doesn't have build() method)
237
- return new NumberField(field);
238
- },
239
- };
240
- return config;
241
- }
1
+ import { Field, baseFieldConfigSchema } from './field.js';
2
+ import { entityKind } from '../helpers/index.js';
3
+ import * as z from 'zod';
4
+ const numberFieldAutoIncConfigSchema = z.strictObject({
5
+ hasAutoIncrement: z.literal(true).describe('Enable auto-increment for this field'),
6
+ /** Auto-increment is always integer. Allowing override to 'int' only (optional). */
7
+ format: z.literal('int').optional().describe('Format for auto-increment (must be int)'),
8
+ adminGenerated: z.never().optional(),
9
+ placeholder: z.never().optional(),
10
+ minValue: z.never().optional(),
11
+ maxValue: z.never().optional(),
12
+ minLength: z.never().optional(),
13
+ maxLength: z.never().optional(),
14
+ defaultValue: z.never().optional(),
15
+ });
16
+ const numberFieldManualConfigSchema = z.strictObject({
17
+ hasAutoIncrement: z.literal(false).optional().describe('Disable auto-increment (manual input)'),
18
+ format: z.enum(['int', 'float', 'double']).optional().describe('Number format'),
19
+ adminGenerated: z.union([z.literal(true), z.literal(false), z.literal('readonly')]).optional(),
20
+ placeholder: z.string().optional().describe('Placeholder text for the input'),
21
+ minValue: z.number().optional().describe('Minimum allowed value'),
22
+ maxValue: z.number().optional().describe('Maximum allowed value'),
23
+ minLength: z.number().optional().describe('Minimum string length of the number'),
24
+ maxLength: z.number().optional().describe('Maximum string length of the number'),
25
+ /**
26
+ * The default value of the field.
27
+ * If set, the field will be pre-populated with this value when the form is loaded.
28
+ * If `adminGenerated` is not true, the field will be included when submitting the form with this value.
29
+ */
30
+ defaultValue: z.number().optional().describe('Default value for the field'),
31
+ });
32
+ const configSchema = z.discriminatedUnion('hasAutoIncrement', [
33
+ numberFieldAutoIncConfigSchema,
34
+ numberFieldManualConfigSchema,
35
+ ]);
36
+ export class NumberField extends Field {
37
+ static [entityKind] = 'NumberField';
38
+ format;
39
+ minValue;
40
+ maxValue;
41
+ placeholder;
42
+ hasAutoIncrement;
43
+ minLength;
44
+ maxLength;
45
+ _defaultValue;
46
+ value;
47
+ constructor(config) {
48
+ super(config, 'number');
49
+ this.hasAutoIncrement = config.hasAutoIncrement;
50
+ this.minValue = config.minValue;
51
+ this.maxValue = config.maxValue;
52
+ this.placeholder = config.placeholder;
53
+ this.minLength = config.minLength;
54
+ this.maxLength = config.maxLength;
55
+ // default to 'int' whether auto-increment or not
56
+ this.format = this.hasAutoIncrement ? (config.format ?? 'int') : (config.format ?? 'int');
57
+ /**
58
+ * Logic: if auto-increment and format not 'int', force it.
59
+ */
60
+ if (this.hasAutoIncrement && this.format !== 'int') {
61
+ console.warn(`[NumberField:${this.label}] auto-increment forces format 'int'. Received '${config.format}'. Coercing to 'int'.`);
62
+ }
63
+ /**
64
+ * Apply initial value from default
65
+ */
66
+ this.value = config.defaultValue;
67
+ this._defaultValue = config.defaultValue;
68
+ /**
69
+ * Force the userGenerated to false if the field has auto increment
70
+ */
71
+ if (this.hasAutoIncrement === true) {
72
+ this.adminGenerated = false;
73
+ }
74
+ /**
75
+ * Basic structural logic checks
76
+ */
77
+ if (this.minValue !== undefined && this.maxValue !== undefined && this.minValue > this.maxValue) {
78
+ throw new Error(`Field ${this.label} has minValue > maxValue`);
79
+ }
80
+ if (this.minLength !== undefined && this.maxLength !== undefined && this.minLength > this.maxLength) {
81
+ throw new Error(`Field ${this.label} has minLength > maxLength`);
82
+ }
83
+ /**
84
+ * Attempt to coerce the value
85
+ */
86
+ this.coerceValue();
87
+ }
88
+ /**
89
+ * Coerce the value to a number
90
+ */
91
+ coerceValue() {
92
+ /**
93
+ * Check if the value is not undefined
94
+ */
95
+ if (this.value !== undefined) {
96
+ /**
97
+ * Coerce the value
98
+ */
99
+ this.value = Number(this.value);
100
+ }
101
+ }
102
+ exportForClient() {
103
+ return {
104
+ ...super.exportForClient(),
105
+ format: this.format,
106
+ placeholder: this.placeholder,
107
+ minValue: this.minValue,
108
+ maxValue: this.maxValue,
109
+ minLength: this.minLength,
110
+ maxLength: this.maxLength,
111
+ };
112
+ }
113
+ /**
114
+ * Get the value of the field
115
+ */
116
+ getValue() {
117
+ return Number.isNaN(this.value) ? undefined : this.value;
118
+ }
119
+ hasSqlNameAndValue() {
120
+ /**
121
+ * Skip if the field has auto increment enabled in the database
122
+ */
123
+ if (this.hasAutoIncrement) {
124
+ return false;
125
+ }
126
+ /**
127
+ * Include the field in the SQL if it is admin-generated, or not admin-generated but has a default value
128
+ */
129
+ return this.adminGenerated === true || this._defaultValue !== undefined;
130
+ }
131
+ checkRequired() {
132
+ /**
133
+ * Skip if the field has auto increment enabled,
134
+ * because it will be auto generated in the database
135
+ */
136
+ if (this.hasAutoIncrement)
137
+ return;
138
+ /**
139
+ * Check if the field is required
140
+ * Note: We explicitly check for undefined/null instead of using !this.value
141
+ * because 0 is a valid number value but falsy in JavaScript
142
+ */
143
+ if (this.required) {
144
+ if (this.value === undefined || this.value === null || Number.isNaN(this.value)) {
145
+ throw new Error(`Field ${this.label} is required`);
146
+ }
147
+ }
148
+ }
149
+ /**
150
+ * Prepare the field for submission
151
+ */
152
+ async prepareForSubmission() {
153
+ /**
154
+ * Check if the field has auto increment enabled
155
+ * If it does, we don't need to do anything
156
+ */
157
+ if (this.hasAutoIncrement) {
158
+ return;
159
+ }
160
+ if (this.value) {
161
+ /**
162
+ * Check min
163
+ */
164
+ if (this.minValue) {
165
+ if (this.minValue > this.value) {
166
+ throw new Error(`Field ${this.label} must be ${this.minValue} and above`);
167
+ }
168
+ }
169
+ /**
170
+ * Check max
171
+ */
172
+ if (this.maxValue) {
173
+ if (this.maxValue < this.value) {
174
+ throw new Error(`Field ${this.label} must be ${this.maxValue} and below`);
175
+ }
176
+ }
177
+ /**
178
+ * Check minimum length
179
+ */
180
+ if (this.minLength) {
181
+ if (this.minLength > this.value.toString().length) {
182
+ throw new Error(`Field ${this.label} must be at least ${this.minLength} characters long`);
183
+ }
184
+ }
185
+ /**
186
+ * Check maximum length
187
+ */
188
+ if (this.maxLength) {
189
+ if (this.maxLength < this.value.toString().length) {
190
+ throw new Error(`Field ${this.label} must be at most ${this.maxLength} characters long`);
191
+ }
192
+ }
193
+ }
194
+ }
195
+ }
196
+ const numberFieldAutoIncOptionsSchema = z.strictObject({
197
+ ...baseFieldConfigSchema.shape,
198
+ ...numberFieldAutoIncConfigSchema.shape,
199
+ });
200
+ const numberFieldManualOptionsSchema = z.strictObject({
201
+ ...baseFieldConfigSchema.shape,
202
+ ...numberFieldManualConfigSchema.shape,
203
+ });
204
+ const optionsSchema = z.discriminatedUnion('hasAutoIncrement', [
205
+ numberFieldAutoIncOptionsSchema,
206
+ numberFieldManualOptionsSchema,
207
+ ]);
208
+ const numberFieldConfigSchema = z.intersection(optionsSchema, z.strictObject({
209
+ type: z.literal('number').describe('The type of the field'),
210
+ build: z.function().output(z.instanceof(NumberField)).describe('Build a NumberField instance from this config'),
211
+ }));
212
+ /**
213
+ * Helper function to create a number field configuration
214
+ * Returns a config object with a build() method that can be serialized and used anywhere
215
+ *
216
+ * @example
217
+ * ```typescript
218
+ * const fieldConfig = numberField({ name: 'age', label: 'Age', required: true, order: 1 })
219
+ * const fieldInstance = fieldConfig.build()
220
+ * ```
221
+ *
222
+ * @param field
223
+ */
224
+ export function numberField(field) {
225
+ /**
226
+ * Validate the field config
227
+ */
228
+ const result = optionsSchema.safeParse(field);
229
+ if (!result.success) {
230
+ throw new Error(`[Field: ${field.name}]: ${z.prettifyError(result.error)}`);
231
+ }
232
+ const config = {
233
+ ...field,
234
+ type: 'number',
235
+ build() {
236
+ // Use the original field config directly (it doesn't have build() method)
237
+ return new NumberField(field);
238
+ },
239
+ };
240
+ return config;
241
+ }