@aws-amplify/data-schema 1.19.0 → 1.20.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (198) hide show
  1. package/dist/cjs/Authorization.js.map +1 -1
  2. package/dist/cjs/ClientSchema/utilities/index.js.map +1 -1
  3. package/dist/cjs/CombineSchema.js +2 -2
  4. package/dist/cjs/CombineSchema.js.map +1 -1
  5. package/dist/cjs/CustomOperation.js +5 -5
  6. package/dist/cjs/CustomOperation.js.map +1 -1
  7. package/dist/cjs/CustomType.js +1 -2
  8. package/dist/cjs/CustomType.js.map +1 -1
  9. package/dist/cjs/EnumType.js +1 -2
  10. package/dist/cjs/EnumType.js.map +1 -1
  11. package/dist/cjs/Handler.js +2 -2
  12. package/dist/cjs/Handler.js.map +1 -1
  13. package/dist/cjs/ModelField.js +24 -17
  14. package/dist/cjs/ModelField.js.map +1 -1
  15. package/dist/cjs/ModelIndex.js +1 -2
  16. package/dist/cjs/ModelIndex.js.map +1 -1
  17. package/dist/cjs/ModelRelationshipField.js +4 -4
  18. package/dist/cjs/ModelRelationshipField.js.map +1 -1
  19. package/dist/cjs/ModelSchema.js +3 -3
  20. package/dist/cjs/ModelSchema.js.map +1 -1
  21. package/dist/cjs/ModelType.js +2 -2
  22. package/dist/cjs/ModelType.js.map +1 -1
  23. package/dist/cjs/RefType.js +1 -2
  24. package/dist/cjs/RefType.js.map +1 -1
  25. package/dist/cjs/SchemaProcessor.js +12 -3
  26. package/dist/cjs/SchemaProcessor.js.map +1 -1
  27. package/dist/cjs/Validate.js +145 -0
  28. package/dist/cjs/Validate.js.map +1 -0
  29. package/dist/cjs/a.js.map +1 -1
  30. package/dist/cjs/ai/ConversationSchemaGraphQLTypes.js.map +1 -1
  31. package/dist/cjs/ai/ConversationSchemaProcessor.js.map +1 -1
  32. package/dist/cjs/ai/ConversationType.js +3 -3
  33. package/dist/cjs/ai/ConversationType.js.map +1 -1
  34. package/dist/cjs/ai/ModelType.js +1 -2
  35. package/dist/cjs/ai/ModelType.js.map +1 -1
  36. package/dist/cjs/index.js.map +1 -1
  37. package/dist/cjs/internals/index.js.map +1 -1
  38. package/dist/cjs/runtime/addSchemaToClient.js +1 -2
  39. package/dist/cjs/runtime/addSchemaToClient.js.map +1 -1
  40. package/dist/cjs/runtime/addSchemaToClientWithInstance.js +1 -2
  41. package/dist/cjs/runtime/addSchemaToClientWithInstance.js.map +1 -1
  42. package/dist/cjs/runtime/bridge-types.js.map +1 -1
  43. package/dist/cjs/runtime/client/index.js.map +1 -1
  44. package/dist/cjs/runtime/client/index.v3.js.map +1 -1
  45. package/dist/cjs/runtime/index.js.map +1 -1
  46. package/dist/cjs/runtime/index.v3.js.map +1 -1
  47. package/dist/cjs/runtime/internals/APIClient.js +10 -10
  48. package/dist/cjs/runtime/internals/APIClient.js.map +1 -1
  49. package/dist/cjs/runtime/internals/ai/conversationMessageDeserializers.js.map +1 -1
  50. package/dist/cjs/runtime/internals/ai/conversationMessageSerializers.js.map +1 -1
  51. package/dist/cjs/runtime/internals/ai/conversationStreamEventDeserializers.js.map +1 -1
  52. package/dist/cjs/runtime/internals/ai/convertItemToConversation.js.map +1 -1
  53. package/dist/cjs/runtime/internals/ai/convertItemToConversationMessage.js.map +1 -1
  54. package/dist/cjs/runtime/internals/ai/createCreateConversationFunction.js.map +1 -1
  55. package/dist/cjs/runtime/internals/ai/createDeleteConversationFunction.js.map +1 -1
  56. package/dist/cjs/runtime/internals/ai/createGetConversationFunction.js.map +1 -1
  57. package/dist/cjs/runtime/internals/ai/createListConversationsFunction.js.map +1 -1
  58. package/dist/cjs/runtime/internals/ai/createListMessagesFunction.js.map +1 -1
  59. package/dist/cjs/runtime/internals/ai/createOnStreamEventFunction.js.map +1 -1
  60. package/dist/cjs/runtime/internals/ai/createSendMessageFunction.js.map +1 -1
  61. package/dist/cjs/runtime/internals/ai/createUpdateConversationFunction.js.map +1 -1
  62. package/dist/cjs/runtime/internals/ai/getCustomUserAgentDetails.js +2 -2
  63. package/dist/cjs/runtime/internals/ai/getCustomUserAgentDetails.js.map +1 -1
  64. package/dist/cjs/runtime/internals/cancellation.js +2 -3
  65. package/dist/cjs/runtime/internals/cancellation.js.map +1 -1
  66. package/dist/cjs/runtime/internals/clientUtils.js.map +1 -1
  67. package/dist/cjs/runtime/internals/generateCustomOperationsProperty.js +4 -5
  68. package/dist/cjs/runtime/internals/generateCustomOperationsProperty.js.map +1 -1
  69. package/dist/cjs/runtime/internals/index.js.map +1 -1
  70. package/dist/cjs/runtime/internals/operations/custom.js +1 -2
  71. package/dist/cjs/runtime/internals/operations/custom.js.map +1 -1
  72. package/dist/cjs/runtime/internals/operations/get.js +1 -2
  73. package/dist/cjs/runtime/internals/operations/get.js.map +1 -1
  74. package/dist/cjs/runtime/internals/operations/indexQuery.js +1 -2
  75. package/dist/cjs/runtime/internals/operations/indexQuery.js.map +1 -1
  76. package/dist/cjs/runtime/internals/operations/list.js +1 -2
  77. package/dist/cjs/runtime/internals/operations/list.js.map +1 -1
  78. package/dist/cjs/runtime/internals/operations/observeQuery.js +1 -2
  79. package/dist/cjs/runtime/internals/operations/observeQuery.js.map +1 -1
  80. package/dist/cjs/runtime/internals/operations/subscription.js +1 -2
  81. package/dist/cjs/runtime/internals/operations/subscription.js.map +1 -1
  82. package/dist/cjs/runtime/internals/operations/utils.js +2 -3
  83. package/dist/cjs/runtime/internals/operations/utils.js.map +1 -1
  84. package/dist/cjs/runtime/internals/server/generateModelsProperty.js +1 -2
  85. package/dist/cjs/runtime/internals/server/generateModelsProperty.js.map +1 -1
  86. package/dist/cjs/runtime/internals/server/index.js.map +1 -1
  87. package/dist/cjs/runtime/internals/utils/clientProperties/generateConversationsProperty.js +1 -2
  88. package/dist/cjs/runtime/internals/utils/clientProperties/generateConversationsProperty.js.map +1 -1
  89. package/dist/cjs/runtime/internals/utils/clientProperties/generateEnumsProperty.js.map +1 -1
  90. package/dist/cjs/runtime/internals/utils/clientProperties/generateGenerationsProperty.js +1 -2
  91. package/dist/cjs/runtime/internals/utils/clientProperties/generateGenerationsProperty.js.map +1 -1
  92. package/dist/cjs/runtime/internals/utils/clientProperties/generateModelsProperty.js +1 -2
  93. package/dist/cjs/runtime/internals/utils/clientProperties/generateModelsProperty.js.map +1 -1
  94. package/dist/cjs/runtime/internals/utils/runtimeTypeGuards/isApiGraphQLProviderConfig.js +1 -2
  95. package/dist/cjs/runtime/internals/utils/runtimeTypeGuards/isApiGraphQLProviderConfig.js.map +1 -1
  96. package/dist/cjs/runtime/internals/utils/runtimeTypeGuards/isConfigureEventWithResourceConfig.js +1 -2
  97. package/dist/cjs/runtime/internals/utils/runtimeTypeGuards/isConfigureEventWithResourceConfig.js.map +1 -1
  98. package/dist/cjs/runtime/internals/utils/runtimeTypeGuards/isGraphQLResponseWithErrors.js +1 -2
  99. package/dist/cjs/runtime/internals/utils/runtimeTypeGuards/isGraphQLResponseWithErrors.js.map +1 -1
  100. package/dist/cjs/runtime/utils/findIndexByFields.js +1 -2
  101. package/dist/cjs/runtime/utils/findIndexByFields.js.map +1 -1
  102. package/dist/cjs/runtime/utils/index.js.map +1 -1
  103. package/dist/cjs/runtime/utils/resolveOwnerFields.js +1 -2
  104. package/dist/cjs/runtime/utils/resolveOwnerFields.js.map +1 -1
  105. package/dist/cjs/runtime/utils/resolvePKFields.js +1 -2
  106. package/dist/cjs/runtime/utils/resolvePKFields.js.map +1 -1
  107. package/dist/cjs/runtime/utils/selfAwareAsync.js +1 -2
  108. package/dist/cjs/runtime/utils/selfAwareAsync.js.map +1 -1
  109. package/dist/cjs/runtime/utils/stringTransformation.js +1 -2
  110. package/dist/cjs/runtime/utils/stringTransformation.js.map +1 -1
  111. package/dist/cjs/util/Brand.js +3 -3
  112. package/dist/cjs/util/Brand.js.map +1 -1
  113. package/dist/cjs/util/index.js.map +1 -1
  114. package/dist/esm/Authorization.d.ts +8 -8
  115. package/dist/esm/Authorization.mjs.map +1 -1
  116. package/dist/esm/CombineSchema.mjs.map +1 -1
  117. package/dist/esm/CustomOperation.mjs.map +1 -1
  118. package/dist/esm/CustomType.mjs.map +1 -1
  119. package/dist/esm/EnumType.mjs.map +1 -1
  120. package/dist/esm/Handler.mjs.map +1 -1
  121. package/dist/esm/ModelField.d.ts +39 -24
  122. package/dist/esm/ModelField.mjs +9 -2
  123. package/dist/esm/ModelField.mjs.map +1 -1
  124. package/dist/esm/ModelIndex.mjs.map +1 -1
  125. package/dist/esm/ModelRelationshipField.mjs.map +1 -1
  126. package/dist/esm/ModelSchema.mjs.map +1 -1
  127. package/dist/esm/ModelType.d.ts +1 -1
  128. package/dist/esm/ModelType.mjs.map +1 -1
  129. package/dist/esm/RefType.mjs.map +1 -1
  130. package/dist/esm/SchemaProcessor.mjs +12 -2
  131. package/dist/esm/SchemaProcessor.mjs.map +1 -1
  132. package/dist/esm/Validate.d.ts +218 -0
  133. package/dist/esm/Validate.mjs +142 -0
  134. package/dist/esm/Validate.mjs.map +1 -0
  135. package/dist/esm/ai/ConversationSchemaGraphQLTypes.mjs.map +1 -1
  136. package/dist/esm/ai/ConversationSchemaProcessor.mjs.map +1 -1
  137. package/dist/esm/ai/ConversationType.mjs.map +1 -1
  138. package/dist/esm/ai/ModelType.mjs.map +1 -1
  139. package/dist/esm/index.d.ts +1 -1
  140. package/dist/esm/runtime/addSchemaToClient.mjs.map +1 -1
  141. package/dist/esm/runtime/addSchemaToClientWithInstance.mjs.map +1 -1
  142. package/dist/esm/runtime/bridge-types.mjs.map +1 -1
  143. package/dist/esm/runtime/internals/APIClient.mjs.map +1 -1
  144. package/dist/esm/runtime/internals/ai/conversationMessageDeserializers.mjs.map +1 -1
  145. package/dist/esm/runtime/internals/ai/conversationMessageSerializers.mjs.map +1 -1
  146. package/dist/esm/runtime/internals/ai/conversationStreamEventDeserializers.mjs.map +1 -1
  147. package/dist/esm/runtime/internals/ai/convertItemToConversation.mjs.map +1 -1
  148. package/dist/esm/runtime/internals/ai/createCreateConversationFunction.d.ts +1 -1
  149. package/dist/esm/runtime/internals/ai/createCreateConversationFunction.mjs.map +1 -1
  150. package/dist/esm/runtime/internals/ai/createDeleteConversationFunction.d.ts +1 -1
  151. package/dist/esm/runtime/internals/ai/createDeleteConversationFunction.mjs.map +1 -1
  152. package/dist/esm/runtime/internals/ai/createGetConversationFunction.d.ts +1 -1
  153. package/dist/esm/runtime/internals/ai/createGetConversationFunction.mjs.map +1 -1
  154. package/dist/esm/runtime/internals/ai/createListConversationsFunction.d.ts +1 -1
  155. package/dist/esm/runtime/internals/ai/createListConversationsFunction.mjs.map +1 -1
  156. package/dist/esm/runtime/internals/ai/createListMessagesFunction.d.ts +1 -1
  157. package/dist/esm/runtime/internals/ai/createListMessagesFunction.mjs.map +1 -1
  158. package/dist/esm/runtime/internals/ai/createOnStreamEventFunction.d.ts +1 -1
  159. package/dist/esm/runtime/internals/ai/createOnStreamEventFunction.mjs.map +1 -1
  160. package/dist/esm/runtime/internals/ai/createSendMessageFunction.d.ts +1 -1
  161. package/dist/esm/runtime/internals/ai/createSendMessageFunction.mjs +1 -1
  162. package/dist/esm/runtime/internals/ai/createSendMessageFunction.mjs.map +1 -1
  163. package/dist/esm/runtime/internals/ai/createUpdateConversationFunction.d.ts +1 -1
  164. package/dist/esm/runtime/internals/ai/createUpdateConversationFunction.mjs.map +1 -1
  165. package/dist/esm/runtime/internals/ai/getCustomUserAgentDetails.mjs.map +1 -1
  166. package/dist/esm/runtime/internals/cancellation.mjs.map +1 -1
  167. package/dist/esm/runtime/internals/clientUtils.mjs.map +1 -1
  168. package/dist/esm/runtime/internals/generateCustomOperationsProperty.d.ts +3 -3
  169. package/dist/esm/runtime/internals/generateCustomOperationsProperty.mjs.map +1 -1
  170. package/dist/esm/runtime/internals/operations/custom.mjs.map +1 -1
  171. package/dist/esm/runtime/internals/operations/get.mjs.map +1 -1
  172. package/dist/esm/runtime/internals/operations/indexQuery.mjs +1 -1
  173. package/dist/esm/runtime/internals/operations/indexQuery.mjs.map +1 -1
  174. package/dist/esm/runtime/internals/operations/list.mjs.map +1 -1
  175. package/dist/esm/runtime/internals/operations/observeQuery.mjs.map +1 -1
  176. package/dist/esm/runtime/internals/operations/subscription.mjs.map +1 -1
  177. package/dist/esm/runtime/internals/operations/utils.mjs.map +1 -1
  178. package/dist/esm/runtime/internals/server/generateModelsProperty.mjs.map +1 -1
  179. package/dist/esm/runtime/internals/utils/clientProperties/generateConversationsProperty.mjs.map +1 -1
  180. package/dist/esm/runtime/internals/utils/clientProperties/generateEnumsProperty.d.ts +1 -1
  181. package/dist/esm/runtime/internals/utils/clientProperties/generateEnumsProperty.mjs.map +1 -1
  182. package/dist/esm/runtime/internals/utils/clientProperties/generateGenerationsProperty.mjs.map +1 -1
  183. package/dist/esm/runtime/internals/utils/clientProperties/generateModelsProperty.mjs.map +1 -1
  184. package/dist/esm/runtime/internals/utils/runtimeTypeGuards/isApiGraphQLProviderConfig.mjs.map +1 -1
  185. package/dist/esm/runtime/internals/utils/runtimeTypeGuards/isConfigureEventWithResourceConfig.mjs.map +1 -1
  186. package/dist/esm/runtime/internals/utils/runtimeTypeGuards/isGraphQLResponseWithErrors.mjs.map +1 -1
  187. package/dist/esm/runtime/utils/findIndexByFields.mjs.map +1 -1
  188. package/dist/esm/runtime/utils/resolveOwnerFields.mjs.map +1 -1
  189. package/dist/esm/runtime/utils/resolvePKFields.mjs.map +1 -1
  190. package/dist/esm/runtime/utils/selfAwareAsync.mjs.map +1 -1
  191. package/dist/esm/runtime/utils/stringTransformation.mjs.map +1 -1
  192. package/dist/esm/util/Brand.mjs.map +1 -1
  193. package/dist/meta/cjs.tsbuildinfo +1 -1
  194. package/package.json +1 -1
  195. package/src/ModelField.ts +70 -29
  196. package/src/SchemaProcessor.ts +12 -0
  197. package/src/Validate.ts +418 -0
  198. package/src/index.ts +1 -1
@@ -0,0 +1,418 @@
1
+ import { ModelFieldType } from './ModelField';
2
+
3
+ /**
4
+ * The types of validations supported
5
+ */
6
+ export enum ValidationType {
7
+ GT = 'gt',
8
+ LT = 'lt',
9
+ GTE = 'gte',
10
+ LTE = 'lte',
11
+ MIN_LENGTH = 'minLength',
12
+ MAX_LENGTH = 'maxLength',
13
+ STARTS_WITH = 'startsWith',
14
+ ENDS_WITH = 'endsWith',
15
+ MATCHES = 'matches',
16
+ }
17
+
18
+ /**
19
+ * Represents a validation rule to be applied to a field
20
+ */
21
+ export interface ValidationRule {
22
+ type: ValidationType;
23
+ value: string | number;
24
+ errorMessage?: string;
25
+ }
26
+
27
+ /**
28
+ * Internal interface that includes the getRules method
29
+ * This is not exported and only used internally
30
+ */
31
+ interface InternalValidationBuilder {
32
+ /**
33
+ * Returns all the validation rules defined by this builder
34
+ */
35
+ getRules(): ValidationRule[];
36
+ }
37
+
38
+ /**
39
+ * Interface for string validation methods without any exclusions
40
+ */
41
+ export interface StringValidationBuilderBase<T, ExcludedMethods extends string = never> {
42
+ /**
43
+ * Validates that a string field has at least the specified length
44
+ *
45
+ * ⚠️ Only applicable to string fields
46
+ *
47
+ * @example
48
+ * // String field example
49
+ * a.string().validate(v => v.minLength(5, 'String must be at least 5 characters'))
50
+ *
51
+ * @param length - The minimum length required
52
+ * @param errorMessage - Optional custom error message
53
+ */
54
+ minLength(
55
+ length: number,
56
+ errorMessage?: string
57
+ ): StringValidationBuilder<T, ExcludedMethods | 'minLength'>;
58
+
59
+ /**
60
+ * Validates that a string field does not exceed the specified length
61
+ *
62
+ * ⚠️ Only applicable to string fields
63
+ *
64
+ * @example
65
+ * // String field example
66
+ * a.string().validate(v => v.maxLength(100, 'String must be at most 100 characters'))
67
+ *
68
+ * @param length - The maximum length allowed
69
+ * @param errorMessage - Optional custom error message
70
+ */
71
+ maxLength(
72
+ length: number,
73
+ errorMessage?: string
74
+ ): StringValidationBuilder<T, ExcludedMethods | 'maxLength'>;
75
+
76
+ /**
77
+ * Validates that a string field starts with the specified prefix
78
+ *
79
+ * ⚠️ Only applicable to string fields
80
+ *
81
+ * @example
82
+ * // String field example
83
+ * a.string().validate(v => v.startsWith("prefix-", 'String must start with prefix-'))
84
+ *
85
+ * @param prefix - The prefix the string must start with
86
+ * @param errorMessage - Optional custom error message
87
+ */
88
+ startsWith(
89
+ prefix: string,
90
+ errorMessage?: string
91
+ ): StringValidationBuilder<T, ExcludedMethods | 'startsWith'>;
92
+
93
+ /**
94
+ * Validates that a string field ends with the specified suffix
95
+ *
96
+ * ⚠️ Only applicable to string fields
97
+ * @example
98
+ * // String field example
99
+ * a.string().validate(v => v.endsWith("-suffix", 'String must end with -suffix'))
100
+ *
101
+ * @param suffix - The suffix the string must end with
102
+ * @param errorMessage - Optional custom error message
103
+ */
104
+ endsWith(
105
+ suffix: string,
106
+ errorMessage?: string
107
+ ): StringValidationBuilder<T, ExcludedMethods | 'endsWith'>;
108
+
109
+ /**
110
+ * Validates that a string field matches the specified regular expression pattern
111
+ *
112
+ * ⚠️ Only applicable to string fields
113
+ * @example
114
+ * // String field example
115
+ * a.string().validate(v => v.matches("^[a-zA-Z0-9]+$", 'String must match the regex pattern'))
116
+ *
117
+ * @param pattern - The regex pattern the string must match
118
+ * @param errorMessage - Optional custom error message
119
+ */
120
+ matches(
121
+ pattern: string,
122
+ errorMessage?: string
123
+ ): StringValidationBuilder<T, ExcludedMethods | 'matches'>;
124
+ }
125
+
126
+ /**
127
+ * Interface for string validation methods with specific validators excluded
128
+ *
129
+ * This is to disallow duplicate validation operators on the same field, which is not supported in the Validate Transformer.
130
+ */
131
+ export type StringValidationBuilder<T, ExcludedMethods extends string = never> =
132
+ Omit<StringValidationBuilderBase<T, ExcludedMethods>, ExcludedMethods & keyof StringValidationBuilderBase<T, ExcludedMethods>>;
133
+
134
+ /**
135
+ * Interface for numeric validation methods without any exclusions
136
+ */
137
+ export interface NumericValidationBuilderBase<T, ExcludedMethods extends string = never> {
138
+ /**
139
+ * Validates that a numeric field is greater than the specified value
140
+ *
141
+ * ⚠️ Only applicable for integer or float fields
142
+ *
143
+ * @example
144
+ * // Integer field example
145
+ * a.integer().validate(v => v.gt(10, 'Integer must be greater than 10'))
146
+ *
147
+ * // Float field example
148
+ * a.float().validate(v => v.gt(3.14, 'Float must be greater than 3.14'))
149
+ *
150
+ * @param value - The value that the field must be greater than
151
+ * @param errorMessage - Optional custom error message
152
+ */
153
+ gt(
154
+ value: number,
155
+ errorMessage?: string
156
+ ): NumericValidationBuilder<T, ExcludedMethods | 'gt' | 'positive'>;
157
+
158
+ /**
159
+ * Validates that a numeric field is less than the specified value
160
+ *
161
+ * ⚠️ Only applicable for integer or float fields
162
+ * @example
163
+ * // Integer field example
164
+ * a.integer().validate(v => v.lt(10, 'Integer must be less than 10'))
165
+ *
166
+ * // Float field example
167
+ * a.float().validate(v => v.lt(3.14, 'Float must be less than 3.14'))
168
+ *
169
+ * @param value - The value that the field must be less than
170
+ * @param errorMessage - Optional custom error message
171
+ */
172
+ lt(
173
+ value: number,
174
+ errorMessage?: string
175
+ ): NumericValidationBuilder<T, ExcludedMethods | 'lt' | 'negative'>;
176
+
177
+ /**
178
+ * Validates that a numeric field is greater than or equal to the specified value
179
+ *
180
+ * ⚠️ Only applicable for integer or float fields
181
+ *
182
+ * @example
183
+ * // Integer field example
184
+ * a.integer().validate(v => v.gte(10, 'Integer must be greater than or equal to 10'))
185
+ *
186
+ * // Float field example
187
+ * a.float().validate(v => v.gte(3.14, 'Float must be greater than or equal to 3.14'))
188
+ *
189
+ * @param value - The value that the field must be greater than or equal to
190
+ * @param errorMessage - Optional custom error message
191
+ */
192
+ gte(
193
+ value: number,
194
+ errorMessage?: string
195
+ ): NumericValidationBuilder<T, ExcludedMethods | 'gte'>;
196
+
197
+ /**
198
+ * Validates that a numeric field is less than or equal to the specified value
199
+ *
200
+ * ⚠️ Only applicable for integer or float fields
201
+ * @example
202
+ * // Integer field example
203
+ * a.integer().validate(v => v.lte(10, 'Integer must be less than or equal to 10'))
204
+ *
205
+ * // Float field example
206
+ * a.float().validate(v => v.lte(3.14, 'Float must be less than or equal to 3.14'))
207
+ *
208
+ * @param value - The value that the field must be less than or equal to
209
+ * @param errorMessage - Optional custom error message
210
+ */
211
+ lte(
212
+ value: number,
213
+ errorMessage?: string
214
+ ): NumericValidationBuilder<T, ExcludedMethods | 'lte'>;
215
+
216
+ /**
217
+ * Validates that a numeric field is positive
218
+ *
219
+ * ⚠️ Only applicable for integer or float fields
220
+ *
221
+ * @example
222
+ * // Integer field example
223
+ * a.integer().validate(v => v.positive('Integer must be positive'))
224
+ *
225
+ * // Float field example
226
+ * a.float().validate(v => v.positive('Float must be positive'))
227
+ *
228
+ * @param errorMessage - Optional custom error message
229
+ */
230
+ positive(
231
+ errorMessage?: string
232
+ ): NumericValidationBuilder<T, ExcludedMethods | 'positive' | 'gt'>;
233
+
234
+ /**
235
+ * Validates that a numeric field is negative
236
+ *
237
+ * ⚠️ Only applicable for integer or float fields
238
+ * @example
239
+ * // Integer field example
240
+ * a.integer().validate(v => v.negative('Integer must be negative'))
241
+ *
242
+ * // Float field example
243
+ * a.float().validate(v => v.negative('Float must be negative'))
244
+ *
245
+ * @param errorMessage - Optional custom error message
246
+ */
247
+ negative(
248
+ errorMessage?: string
249
+ ): NumericValidationBuilder<T, ExcludedMethods | 'negative' | 'lt'>;
250
+ }
251
+
252
+ /**
253
+ * Interface for numeric validation methods with specific validators excluded
254
+ *
255
+ * This is to disallow duplicate validation operators on the same field, which is not supported in the Validate Transformer.
256
+ */
257
+ export type NumericValidationBuilder<T, ExcludedMethods extends string = never> =
258
+ Omit<NumericValidationBuilderBase<T, ExcludedMethods>, ExcludedMethods & keyof NumericValidationBuilderBase<T, ExcludedMethods>>;
259
+
260
+ /**
261
+ * Maps a ModelFieldType to the appropriate validation builder type
262
+ *
263
+ * Note: This type intentionally uses the public interfaces which don't expose the getRules method
264
+ */
265
+ export type FieldTypeToValidationBuilder<T, FT extends ModelFieldType> =
266
+ FT extends ModelFieldType.String
267
+ ? StringValidationBuilder<T, never>
268
+ : FT extends ModelFieldType.Integer | ModelFieldType.Float
269
+ ? NumericValidationBuilder<T, never>
270
+ : never;
271
+
272
+ /**
273
+ * A builder for creating field validation rules
274
+ * @typeParam T - The type of the field being validated
275
+ */
276
+ export type ValidationBuilder<T> = StringValidationBuilderBase<T> & NumericValidationBuilderBase<T>;
277
+
278
+ /**
279
+ * Creates an internal validation builder for a specific field type
280
+ * @typeParam T - The type of the field being validated
281
+ */
282
+ function createValidationBuilderInternal<T>(): ValidationBuilder<T> & InternalValidationBuilder {
283
+ const rules: ValidationRule[] = [];
284
+
285
+ const builder = {
286
+ /**
287
+ * Validates that a numeric field is greater than the specified value
288
+ * @param value - The value that the field must be greater than
289
+ * @param errorMessage - Optional custom error message
290
+ */
291
+ gt(value: number, errorMessage?: string) {
292
+ rules.push({ type: ValidationType.GT, value, errorMessage });
293
+ return this;
294
+ },
295
+
296
+ /**
297
+ * Validates that a numeric field is less than the specified value
298
+ * @param value - The value that the field must be less than
299
+ * @param errorMessage - Optional custom error message
300
+ */
301
+ lt(value: number, errorMessage?: string) {
302
+ rules.push({ type: ValidationType.LT, value, errorMessage });
303
+ return this;
304
+ },
305
+
306
+ /**
307
+ * Validates that a numeric field is greater than or equal to the specified value
308
+ * @param value - The value that the field must be greater than or equal to
309
+ * @param errorMessage - Optional custom error message
310
+ */
311
+ gte(value: number, errorMessage?: string) {
312
+ rules.push({ type: ValidationType.GTE, value, errorMessage });
313
+ return this;
314
+ },
315
+
316
+ /**
317
+ * Validates that a numeric field is less than or equal to the specified value
318
+ * @param value - The value that the field must be less than or equal to
319
+ * @param errorMessage - Optional custom error message
320
+ */
321
+ lte(value: number, errorMessage?: string) {
322
+ rules.push({ type: ValidationType.LTE, value, errorMessage });
323
+ return this;
324
+ },
325
+
326
+ /**
327
+ * Validates that a numeric field is positive. We use gt(0) internally to achieve this.
328
+ * @param errorMessage - Optional custom error message
329
+ */
330
+ positive(errorMessage?: string) {
331
+ rules.push({ type: ValidationType.GT, value: 0, errorMessage });
332
+ return this;
333
+ },
334
+
335
+ /**
336
+ * Validates that a numeric field is negative. We use lt(0) internally to achieve this.
337
+ * @param errorMessage - Optional custom error message
338
+ */
339
+ negative(errorMessage?: string) {
340
+ rules.push({ type: ValidationType.LT, value: 0, errorMessage });
341
+ return this;
342
+ },
343
+
344
+ /**
345
+ * Validates that a string field has at least the specified length
346
+ * @param length - The minimum length required
347
+ * @param errorMessage - Optional custom error message
348
+ */
349
+ minLength(length: number, errorMessage?: string) {
350
+ rules.push({ type: ValidationType.MIN_LENGTH, value: length, errorMessage });
351
+ return this;
352
+ },
353
+
354
+ /**
355
+ * Validates that a string field does not exceed the specified length
356
+ * @param length - The maximum length allowed
357
+ * @param errorMessage - Optional custom error message
358
+ */
359
+ maxLength(length: number, errorMessage?: string) {
360
+ rules.push({ type: ValidationType.MAX_LENGTH, value: length, errorMessage });
361
+ return this;
362
+ },
363
+
364
+ /**
365
+ * Validates that a string field starts with the specified prefix
366
+ * @param prefix - The prefix the string must start with
367
+ * @param errorMessage - Optional custom error message
368
+ */
369
+ startsWith(prefix: string, errorMessage?: string) {
370
+ rules.push({ type: ValidationType.STARTS_WITH, value: prefix, errorMessage });
371
+ return this;
372
+ },
373
+
374
+ /**
375
+ * Validates that a string field ends with the specified suffix
376
+ * @param suffix - The suffix the string must end with
377
+ * @param errorMessage - Optional custom error message
378
+ */
379
+ endsWith(suffix: string, errorMessage?: string) {
380
+ rules.push({ type: ValidationType.ENDS_WITH, value: suffix, errorMessage });
381
+ return this;
382
+ },
383
+
384
+ /**
385
+ * Validates that a string field matches the specified regular expression pattern
386
+ * @param pattern - The regex pattern the string must match
387
+ * @param errorMessage - Optional custom error message
388
+ */
389
+ matches(pattern: string, errorMessage?: string) {
390
+ rules.push({ type: ValidationType.MATCHES, value: pattern, errorMessage });
391
+ return this;
392
+ },
393
+
394
+ /**
395
+ * Returns all the validation rules defined by this builder
396
+ */
397
+ getRules(): ValidationRule[] {
398
+ return rules;
399
+ }
400
+ } as ValidationBuilder<T> & InternalValidationBuilder;
401
+
402
+ return builder;
403
+ }
404
+
405
+ /**
406
+ * Creates a type-safe validation builder for a specific field type with access to get the rules
407
+ * @returns An object containing the validation builder and a function to get the rules
408
+ */
409
+ export function createValidationBuilder<T, FT extends ModelFieldType>(): {
410
+ builder: FieldTypeToValidationBuilder<T, FT>;
411
+ getRules: () => ValidationRule[];
412
+ } {
413
+ const internalBuilder = createValidationBuilderInternal<T>();
414
+ return {
415
+ builder: internalBuilder as unknown as FieldTypeToValidationBuilder<T, FT>,
416
+ getRules: () => internalBuilder.getRules()
417
+ };
418
+ }
package/src/index.ts CHANGED
@@ -7,7 +7,7 @@ export type { ClientSchema };
7
7
  export type {CombinedModelSchema} from './CombineSchema';
8
8
  export type { Authorization, ResourceAuthorization } from './Authorization';
9
9
  export type { CustomOperation } from './CustomOperation';
10
- export type { ModelField, Nullable, Json } from './ModelField';
10
+ export type { ModelField, ModelFieldType, Nullable, Json } from './ModelField';
11
11
  export type { ModelSchema, RDSModelSchema} from './ModelSchema';
12
12
  export type { ModelType, ModelDefaultIdentifier } from './ModelType';
13
13
  export type { RefType } from './RefType';