schema-dsl 2.0.0 → 2.0.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 (145) hide show
  1. package/CHANGELOG.md +130 -113
  2. package/LICENSE +21 -21
  3. package/README.md +628 -628
  4. package/dist/{DslBuilder-DkLaOo9Q.d.ts → DslBuilder-BIgQOAXp.d.ts} +2 -0
  5. package/dist/{DslBuilder-DQDN0ZxZ.d.cts → DslBuilder-CjHTucNQ.d.cts} +2 -0
  6. package/dist/{Validator-hFWKGxir.d.ts → Validator-CllRdrY0.d.ts} +1 -1
  7. package/dist/{Validator-C7GsVQOH.d.cts → Validator-D6okG9tr.d.cts} +1 -1
  8. package/dist/index.cjs +75 -29
  9. package/dist/index.d.cts +10 -4
  10. package/dist/index.d.ts +10 -4
  11. package/dist/index.js +75 -29
  12. package/dist/plugins/custom-format.cjs +33 -17
  13. package/dist/plugins/custom-format.d.cts +1 -1
  14. package/dist/plugins/custom-format.d.ts +1 -1
  15. package/dist/plugins/custom-format.js +33 -17
  16. package/dist/plugins/custom-type-example.cjs +33 -17
  17. package/dist/plugins/custom-type-example.d.cts +1 -1
  18. package/dist/plugins/custom-type-example.d.ts +1 -1
  19. package/dist/plugins/custom-type-example.js +33 -17
  20. package/dist/plugins/custom-validator.cjs +0 -2
  21. package/dist/plugins/custom-validator.d.cts +1 -1
  22. package/dist/plugins/custom-validator.d.ts +1 -1
  23. package/dist/plugins/custom-validator.js +0 -2
  24. package/docs/FEATURE-INDEX.md +553 -553
  25. package/docs/add-custom-locale.md +496 -496
  26. package/docs/add-keyword.md +24 -24
  27. package/docs/api-reference.md +1047 -1047
  28. package/docs/api.md +13 -13
  29. package/docs/best-practices-project-structure.md +417 -417
  30. package/docs/best-practices.md +712 -712
  31. package/docs/cache-manager.md +344 -344
  32. package/docs/compile.md +45 -45
  33. package/docs/conditional-api.md +1307 -1307
  34. package/docs/custom-extensions-guide.md +339 -339
  35. package/docs/design-philosophy.md +606 -606
  36. package/docs/doc-index.md +324 -324
  37. package/docs/dsl-syntax.md +714 -714
  38. package/docs/dynamic-locale.md +608 -608
  39. package/docs/enum.md +482 -482
  40. package/docs/error-handling.md +1975 -1975
  41. package/docs/export-guide.md +501 -501
  42. package/docs/export-limitations.md +567 -567
  43. package/docs/faq.md +596 -596
  44. package/docs/frontend-i18n-guide.md +307 -307
  45. package/docs/i18n-user-guide.md +487 -487
  46. package/docs/i18n.md +476 -476
  47. package/docs/index.md +48 -48
  48. package/docs/json-schema-basics.md +40 -40
  49. package/docs/label-vs-description.md +271 -271
  50. package/docs/markdown-exporter.md +406 -406
  51. package/docs/mongodb-exporter.md +302 -302
  52. package/docs/multi-language.md +26 -26
  53. package/docs/multi-type-support.md +322 -322
  54. package/docs/mysql-exporter.md +280 -280
  55. package/docs/number-operators.md +449 -449
  56. package/docs/optional-marker-guide.md +326 -326
  57. package/docs/performance-guide.md +49 -49
  58. package/docs/plugin-system.md +381 -381
  59. package/docs/plugin-type-registration.md +34 -34
  60. package/docs/postgresql-exporter.md +311 -311
  61. package/docs/public/favicon.svg +4 -4
  62. package/docs/quick-start.md +435 -435
  63. package/docs/runtime-locale-support.md +532 -532
  64. package/docs/schema-helper.md +345 -345
  65. package/docs/schema-utils-advanced-issues.md +23 -23
  66. package/docs/schema-utils-best-practices.md +20 -20
  67. package/docs/schema-utils-chaining.md +150 -150
  68. package/docs/schema-utils.md +524 -524
  69. package/docs/security-checklist.md +20 -20
  70. package/docs/string-extensions.md +488 -488
  71. package/docs/troubleshooting.md +486 -486
  72. package/docs/type-converter.md +310 -310
  73. package/docs/type-reference.md +242 -242
  74. package/docs/typescript-guide.md +584 -584
  75. package/docs/union-type-guide.md +157 -157
  76. package/docs/union-types.md +284 -284
  77. package/docs/validate-async.md +491 -491
  78. package/docs/validate-batch.md +49 -49
  79. package/docs/validate-dsl-object-support.md +578 -578
  80. package/docs/validate.md +506 -506
  81. package/docs/validation-guide.md +502 -502
  82. package/docs/validator.md +39 -39
  83. package/package.json +131 -131
  84. package/plugins/custom-format.cjs +8 -8
  85. package/plugins/custom-type-example.cjs +8 -8
  86. package/plugins/custom-validator.cjs +8 -8
  87. package/src/adapters/DslAdapter.ts +111 -111
  88. package/src/adapters/index.ts +1 -1
  89. package/src/config/constants.ts +83 -83
  90. package/src/config/index.ts +2 -2
  91. package/src/config/patterns.ts +77 -77
  92. package/src/core/CacheManager.ts +169 -159
  93. package/src/core/ConditionalBuilder.ts +382 -382
  94. package/src/core/ConditionalRuntime.ts +27 -27
  95. package/src/core/ConditionalValidator.ts +254 -254
  96. package/src/core/DslBuilder.ts +687 -677
  97. package/src/core/ErrorCodes.ts +38 -38
  98. package/src/core/ErrorFormatter.ts +271 -271
  99. package/src/core/JSONSchemaCore.ts +65 -65
  100. package/src/core/Locale.ts +187 -187
  101. package/src/core/MessageTemplate.ts +42 -42
  102. package/src/core/ObjectDslBuilder.ts +64 -64
  103. package/src/core/PluginManager.ts +326 -326
  104. package/src/core/StringExtensions.ts +140 -140
  105. package/src/core/TemplateEngine.ts +44 -44
  106. package/src/core/Validator.ts +448 -448
  107. package/src/errors/I18nError.ts +159 -159
  108. package/src/errors/ValidationError.ts +105 -105
  109. package/src/exporters/BaseExporter.ts +60 -60
  110. package/src/exporters/MarkdownExporter.ts +305 -305
  111. package/src/exporters/MongoDBExporter.ts +126 -126
  112. package/src/exporters/MySQLExporter.ts +156 -155
  113. package/src/exporters/PostgreSQLExporter.ts +222 -222
  114. package/src/exporters/index.ts +18 -18
  115. package/src/index.ts +651 -633
  116. package/src/locales/en-US.ts +160 -160
  117. package/src/locales/es-ES.ts +160 -160
  118. package/src/locales/fr-FR.ts +160 -160
  119. package/src/locales/index.ts +103 -103
  120. package/src/locales/ja-JP.ts +160 -160
  121. package/src/locales/types.ts +156 -156
  122. package/src/locales/zh-CN.ts +160 -160
  123. package/src/parser/ConstraintParser.ts +101 -101
  124. package/src/parser/DslParser.ts +470 -470
  125. package/src/parser/SchemaCompiler.ts +66 -66
  126. package/src/parser/TypeRegistry.ts +250 -250
  127. package/src/parser/index.ts +6 -6
  128. package/src/plugins/custom-format.ts +124 -126
  129. package/src/plugins/custom-type-example.ts +106 -108
  130. package/src/plugins/custom-validator.ts +138 -140
  131. package/src/types/conditional.ts +28 -28
  132. package/src/types/config.ts +59 -59
  133. package/src/types/dsl.ts +131 -131
  134. package/src/types/error.ts +60 -60
  135. package/src/types/index.ts +17 -17
  136. package/src/types/infer.ts +127 -127
  137. package/src/types/plugin.ts +58 -58
  138. package/src/types/safe-regex.d.ts +9 -9
  139. package/src/types/schema.ts +66 -66
  140. package/src/types/validate.ts +71 -71
  141. package/src/utils/SchemaHelper.ts +196 -196
  142. package/src/utils/SchemaUtils.ts +365 -346
  143. package/src/utils/TypeConverter.ts +215 -215
  144. package/src/utils/index.ts +10 -10
  145. package/src/validators/CustomKeywords.ts +477 -477
@@ -1,160 +1,160 @@
1
- import type { LocaleMessages } from './types.js'
2
-
3
- const esES: LocaleMessages = {
4
- // Generic
5
- required: '{{#label}} es obligatorio',
6
- type: '{{#label}} debe ser de tipo {{#expected}}, pero se obtuvo {{#actual}}',
7
- min: 'La longitud de {{#label}} debe ser al menos {{#limit}}',
8
- max: 'La longitud de {{#label}} debe ser como máximo {{#limit}}',
9
- length: 'La longitud de {{#label}} debe ser exactamente {{#expected}}',
10
- pattern: 'El formato de {{#label}} no es válido',
11
- enum: '{{#label}} debe ser uno de: {{#allowed}}',
12
- custom: 'Validación fallida para {{#label}}: {{#message}}',
13
- circular: 'Referencia circular detectada en {{#label}}',
14
- 'max-depth': 'Profundidad máxima de recursión ({{#depth}}) excedida en {{#label}}',
15
- exception: 'Excepción de validación en {{#label}}: {{#message}}',
16
-
17
- // Conditional (v2 additions)
18
- 'conditional.underAge': 'Los menores de edad no pueden registrarse',
19
- 'conditional.blocked': 'La cuenta ha sido bloqueada',
20
- 'conditional.notAllowed': 'El registro no está permitido',
21
-
22
- // I18nError — generic (v2 additions)
23
- 'error.notFound': '{{#resource}} no encontrado',
24
- 'error.forbidden': 'Acceso a {{#resource}} está prohibido',
25
- 'error.unauthorized': 'No autorizado, por favor inicie sesión',
26
- 'error.invalid': '{{#field}} no es válido',
27
- 'error.duplicate': '{{#resource}} ya existe',
28
- 'error.conflict': 'Conflicto de operación: {{#reason}}',
29
-
30
- // Account (v2 additions)
31
- 'account.notFound': { code: 'ACCOUNT_NOT_FOUND', message: 'Cuenta no encontrada' },
32
- 'account.inactive': 'La cuenta está inactiva',
33
- 'account.banned': 'La cuenta ha sido suspendida',
34
- 'account.insufficientBalance': {
35
- code: 'INSUFFICIENT_BALANCE',
36
- message: 'Saldo insuficiente, actual: {{#balance}}, requerido: {{#required}}',
37
- },
38
- 'account.insufficientCredits': 'Créditos insuficientes, actual: {{#credits}}, requerido: {{#required}}',
39
-
40
- // User (v2 additions)
41
- 'user.notFound': 'Usuario no encontrado',
42
- 'user.notVerified': 'El usuario no está verificado',
43
- 'user.noPermission': 'Sin permisos de administrador',
44
-
45
- // Order (v2 additions)
46
- 'order.notPaid': { code: 'ORDER_NOT_PAID', message: 'Pedido no pagado' },
47
- 'order.paymentMissing': 'Falta información de pago',
48
- 'order.addressMissing': 'Falta la dirección de envío',
49
-
50
- // Format
51
- 'format.email': '{{#label}} debe ser una dirección de correo electrónico válida',
52
- 'format.url': '{{#label}} debe ser una URL válida',
53
- 'format.uuid': '{{#label}} debe ser un UUID válido',
54
- 'format.date': '{{#label}} debe ser una fecha válida (YYYY-MM-DD)',
55
- 'format.datetime': '{{#label}} debe ser una fecha y hora válida (ISO 8601)',
56
- 'format.time': '{{#label}} debe ser una hora válida (HH:mm:ss)',
57
- 'format.ipv4': '{{#label}} debe ser una dirección IPv4 válida',
58
- 'format.ipv6': '{{#label}} debe ser una dirección IPv6 válida',
59
- 'format.binary': '{{#label}} debe ser una cadena base64 válida',
60
-
61
- // String
62
- 'string.hostname': '{{#label}} debe ser un nombre de host válido',
63
- 'string.pattern': 'El formato de {{#label}} no coincide con el patrón requerido',
64
- 'string.enum': '{{#label}} debe ser uno de: {{#valids}}',
65
- 'string.length': 'La longitud de {{#label}} debe ser exactamente {{#limit}} caracteres',
66
- 'string.alphanum': '{{#label}} solo puede contener caracteres alfanuméricos',
67
- 'string.trim': '{{#label}} no debe tener espacios al principio ni al final',
68
- 'string.lowercase': '{{#label}} debe estar en minúsculas',
69
- 'string.uppercase': '{{#label}} debe estar en mayúsculas',
70
-
71
- // Number
72
- 'number.base': '{{#label}} debe ser un número',
73
- 'number.min': '{{#label}} debe ser mayor o igual a {{#limit}}',
74
- 'number.max': '{{#label}} debe ser menor o igual a {{#limit}}',
75
- 'number.integer': '{{#label}} debe ser un número entero',
76
- 'number.positive': '{{#label}} debe ser un número positivo',
77
- 'number.negative': '{{#label}} debe ser un número negativo',
78
- 'number.precision': '{{#label}} debe tener como máximo {{#limit}} decimales',
79
- 'number.port': '{{#label}} debe ser un número de puerto válido (1-65535)',
80
-
81
- // Boolean
82
- 'boolean.base': '{{#label}} debe ser un booleano',
83
-
84
- // Object
85
- 'object.base': '{{#label}} debe ser un objeto',
86
- 'object.min': '{{#label}} debe tener al menos {{#limit}} propiedades',
87
- 'object.max': '{{#label}} debe tener como máximo {{#limit}} propiedades',
88
- 'object.unknown': '{{#label}} contiene una propiedad desconocida: {{#key}}',
89
- 'object.missing': 'A {{#label}} le faltan propiedades requeridas',
90
- 'object.schema': '{{#label}} contiene propiedades adicionales',
91
- 'additionalProperties': '{{#label}} NO debe tener propiedades adicionales: {{#key}}',
92
-
93
- // Array
94
- 'array.base': '{{#label}} debe ser un array',
95
- 'array.min': '{{#label}} debe tener al menos {{#limit}} elementos',
96
- 'array.max': '{{#label}} debe tener como máximo {{#limit}} elementos',
97
- 'array.length': '{{#label}} debe tener exactamente {{#limit}} elementos',
98
- 'array.unique': '{{#label}} no debe contener elementos duplicados',
99
- 'array.sparse': '{{#label}} no debe ser un array disperso',
100
- 'array.includesRequired': '{{#label}} debe incluir los elementos requeridos',
101
-
102
- // Date
103
- 'date.base': '{{#label}} debe ser una fecha válida',
104
- 'date.min': '{{#label}} no debe ser anterior a {{#limit}}',
105
- 'date.max': '{{#label}} no debe ser posterior a {{#limit}}',
106
- 'date.format': 'El formato de fecha de {{#label}} no es válido',
107
- 'date.greater': '{{#label}} debe ser posterior a {{#limit}}',
108
- 'date.less': '{{#label}} debe ser anterior a {{#limit}}',
109
-
110
- // Any
111
- 'any.required': '{{#label}} es obligatorio',
112
- 'any.invalid': '{{#label}} contiene un valor no válido',
113
- 'any.only': '{{#label}} debe coincidir con {{#valids}}',
114
- 'any.unknown': 'El campo {{#key}} no está permitido',
115
-
116
- // Patterns
117
- 'pattern.phone': 'Número de teléfono no válido',
118
- 'pattern.phone.international': 'Número de teléfono internacional no válido',
119
- 'pattern.idCard': 'Número de tarjeta de identificación no válido',
120
- 'pattern.creditCard': 'Número de tarjeta de crédito no válido',
121
- 'pattern.creditCard.visa': 'Número de tarjeta Visa no válido',
122
- 'pattern.creditCard.mastercard': 'Número de Mastercard no válido',
123
- 'pattern.creditCard.amex': 'Número de tarjeta American Express no válido',
124
- 'pattern.creditCard.discover': 'Número de tarjeta Discover no válido',
125
- 'pattern.creditCard.jcb': 'Número de tarjeta JCB no válido',
126
- 'pattern.creditCard.unionpay': 'Número de tarjeta UnionPay no válido',
127
- 'pattern.licensePlate': 'Número de matrícula no válido',
128
- 'pattern.postalCode': 'Código postal no válido',
129
- 'pattern.passport': 'Número de pasaporte no válido',
130
- 'pattern.objectId': 'ObjectId no válido',
131
- 'pattern.hexColor': 'Color hexadecimal no válido',
132
- 'pattern.macAddress': 'Dirección MAC no válida',
133
- 'pattern.cron': 'Expresión Cron no válida',
134
- 'pattern.slug': 'El slug de URL solo puede contener letras minúsculas, números y guiones',
135
- 'pattern.domain': '{{#label}} debe ser un nombre de dominio válido',
136
- 'pattern.ip': '{{#label}} debe ser una dirección IP válida',
137
- 'pattern.base64': '{{#label}} debe ser una cadena Base64 válida',
138
- 'pattern.jwt': '{{#label}} debe ser un token JWT válido',
139
- 'pattern.json': '{{#label}} debe ser una cadena JSON válida',
140
- 'pattern.username': 'El nombre de usuario debe comenzar con una letra y contener solo letras, números y guiones bajos',
141
- 'pattern.password.weak': 'La contraseña debe tener al menos 6 caracteres',
142
- 'pattern.password.medium': 'La contraseña debe tener al menos 8 caracteres y contener letras y números',
143
- 'pattern.password.strong': 'La contraseña debe tener al menos 8 caracteres y contener letras mayúsculas, minúsculas y números',
144
- 'pattern.password.veryStrong': 'La contraseña debe tener al menos 10 caracteres y contener letras mayúsculas, minúsculas, números y caracteres especiales',
145
- 'pattern.emailOrPhone': 'Debe ser un correo electrónico o número de teléfono',
146
- 'pattern.usernameOrEmail': 'Debe ser un nombre de usuario o correo electrónico',
147
- 'pattern.httpOrHttps': 'Debe ser una URL que comience con http o https',
148
-
149
- // oneOf
150
- oneOf: '{{#label}} debe coincidir con uno de los siguientes tipos',
151
- 'oneOf.invalid': 'El valor de {{#label}} no coincide con ningún tipo permitido',
152
-
153
- // Error fallback
154
- UNKNOWN_ERROR: 'Error de validación desconocido',
155
- CUSTOM_VALIDATION_FAILED: 'Validación fallida',
156
- ASYNC_VALIDATION_NOT_SUPPORTED: 'La validación asíncrona no es compatible en validate() síncrono',
157
- VALIDATE_MUST_BE_FUNCTION: 'validate debe ser una función',
158
- }
159
-
160
- export default esES
1
+ import type { LocaleMessages } from './types.js'
2
+
3
+ const esES: LocaleMessages = {
4
+ // Generic
5
+ required: '{{#label}} es obligatorio',
6
+ type: '{{#label}} debe ser de tipo {{#expected}}, pero se obtuvo {{#actual}}',
7
+ min: 'La longitud de {{#label}} debe ser al menos {{#limit}}',
8
+ max: 'La longitud de {{#label}} debe ser como máximo {{#limit}}',
9
+ length: 'La longitud de {{#label}} debe ser exactamente {{#expected}}',
10
+ pattern: 'El formato de {{#label}} no es válido',
11
+ enum: '{{#label}} debe ser uno de: {{#allowed}}',
12
+ custom: 'Validación fallida para {{#label}}: {{#message}}',
13
+ circular: 'Referencia circular detectada en {{#label}}',
14
+ 'max-depth': 'Profundidad máxima de recursión ({{#depth}}) excedida en {{#label}}',
15
+ exception: 'Excepción de validación en {{#label}}: {{#message}}',
16
+
17
+ // Conditional (v2 additions)
18
+ 'conditional.underAge': 'Los menores de edad no pueden registrarse',
19
+ 'conditional.blocked': 'La cuenta ha sido bloqueada',
20
+ 'conditional.notAllowed': 'El registro no está permitido',
21
+
22
+ // I18nError — generic (v2 additions)
23
+ 'error.notFound': '{{#resource}} no encontrado',
24
+ 'error.forbidden': 'Acceso a {{#resource}} está prohibido',
25
+ 'error.unauthorized': 'No autorizado, por favor inicie sesión',
26
+ 'error.invalid': '{{#field}} no es válido',
27
+ 'error.duplicate': '{{#resource}} ya existe',
28
+ 'error.conflict': 'Conflicto de operación: {{#reason}}',
29
+
30
+ // Account (v2 additions)
31
+ 'account.notFound': { code: 'ACCOUNT_NOT_FOUND', message: 'Cuenta no encontrada' },
32
+ 'account.inactive': 'La cuenta está inactiva',
33
+ 'account.banned': 'La cuenta ha sido suspendida',
34
+ 'account.insufficientBalance': {
35
+ code: 'INSUFFICIENT_BALANCE',
36
+ message: 'Saldo insuficiente, actual: {{#balance}}, requerido: {{#required}}',
37
+ },
38
+ 'account.insufficientCredits': 'Créditos insuficientes, actual: {{#credits}}, requerido: {{#required}}',
39
+
40
+ // User (v2 additions)
41
+ 'user.notFound': 'Usuario no encontrado',
42
+ 'user.notVerified': 'El usuario no está verificado',
43
+ 'user.noPermission': 'Sin permisos de administrador',
44
+
45
+ // Order (v2 additions)
46
+ 'order.notPaid': { code: 'ORDER_NOT_PAID', message: 'Pedido no pagado' },
47
+ 'order.paymentMissing': 'Falta información de pago',
48
+ 'order.addressMissing': 'Falta la dirección de envío',
49
+
50
+ // Format
51
+ 'format.email': '{{#label}} debe ser una dirección de correo electrónico válida',
52
+ 'format.url': '{{#label}} debe ser una URL válida',
53
+ 'format.uuid': '{{#label}} debe ser un UUID válido',
54
+ 'format.date': '{{#label}} debe ser una fecha válida (YYYY-MM-DD)',
55
+ 'format.datetime': '{{#label}} debe ser una fecha y hora válida (ISO 8601)',
56
+ 'format.time': '{{#label}} debe ser una hora válida (HH:mm:ss)',
57
+ 'format.ipv4': '{{#label}} debe ser una dirección IPv4 válida',
58
+ 'format.ipv6': '{{#label}} debe ser una dirección IPv6 válida',
59
+ 'format.binary': '{{#label}} debe ser una cadena base64 válida',
60
+
61
+ // String
62
+ 'string.hostname': '{{#label}} debe ser un nombre de host válido',
63
+ 'string.pattern': 'El formato de {{#label}} no coincide con el patrón requerido',
64
+ 'string.enum': '{{#label}} debe ser uno de: {{#valids}}',
65
+ 'string.length': 'La longitud de {{#label}} debe ser exactamente {{#limit}} caracteres',
66
+ 'string.alphanum': '{{#label}} solo puede contener caracteres alfanuméricos',
67
+ 'string.trim': '{{#label}} no debe tener espacios al principio ni al final',
68
+ 'string.lowercase': '{{#label}} debe estar en minúsculas',
69
+ 'string.uppercase': '{{#label}} debe estar en mayúsculas',
70
+
71
+ // Number
72
+ 'number.base': '{{#label}} debe ser un número',
73
+ 'number.min': '{{#label}} debe ser mayor o igual a {{#limit}}',
74
+ 'number.max': '{{#label}} debe ser menor o igual a {{#limit}}',
75
+ 'number.integer': '{{#label}} debe ser un número entero',
76
+ 'number.positive': '{{#label}} debe ser un número positivo',
77
+ 'number.negative': '{{#label}} debe ser un número negativo',
78
+ 'number.precision': '{{#label}} debe tener como máximo {{#limit}} decimales',
79
+ 'number.port': '{{#label}} debe ser un número de puerto válido (1-65535)',
80
+
81
+ // Boolean
82
+ 'boolean.base': '{{#label}} debe ser un booleano',
83
+
84
+ // Object
85
+ 'object.base': '{{#label}} debe ser un objeto',
86
+ 'object.min': '{{#label}} debe tener al menos {{#limit}} propiedades',
87
+ 'object.max': '{{#label}} debe tener como máximo {{#limit}} propiedades',
88
+ 'object.unknown': '{{#label}} contiene una propiedad desconocida: {{#key}}',
89
+ 'object.missing': 'A {{#label}} le faltan propiedades requeridas',
90
+ 'object.schema': '{{#label}} contiene propiedades adicionales',
91
+ 'additionalProperties': '{{#label}} NO debe tener propiedades adicionales: {{#key}}',
92
+
93
+ // Array
94
+ 'array.base': '{{#label}} debe ser un array',
95
+ 'array.min': '{{#label}} debe tener al menos {{#limit}} elementos',
96
+ 'array.max': '{{#label}} debe tener como máximo {{#limit}} elementos',
97
+ 'array.length': '{{#label}} debe tener exactamente {{#limit}} elementos',
98
+ 'array.unique': '{{#label}} no debe contener elementos duplicados',
99
+ 'array.sparse': '{{#label}} no debe ser un array disperso',
100
+ 'array.includesRequired': '{{#label}} debe incluir los elementos requeridos',
101
+
102
+ // Date
103
+ 'date.base': '{{#label}} debe ser una fecha válida',
104
+ 'date.min': '{{#label}} no debe ser anterior a {{#limit}}',
105
+ 'date.max': '{{#label}} no debe ser posterior a {{#limit}}',
106
+ 'date.format': 'El formato de fecha de {{#label}} no es válido',
107
+ 'date.greater': '{{#label}} debe ser posterior a {{#limit}}',
108
+ 'date.less': '{{#label}} debe ser anterior a {{#limit}}',
109
+
110
+ // Any
111
+ 'any.required': '{{#label}} es obligatorio',
112
+ 'any.invalid': '{{#label}} contiene un valor no válido',
113
+ 'any.only': '{{#label}} debe coincidir con {{#valids}}',
114
+ 'any.unknown': 'El campo {{#key}} no está permitido',
115
+
116
+ // Patterns
117
+ 'pattern.phone': 'Número de teléfono no válido',
118
+ 'pattern.phone.international': 'Número de teléfono internacional no válido',
119
+ 'pattern.idCard': 'Número de tarjeta de identificación no válido',
120
+ 'pattern.creditCard': 'Número de tarjeta de crédito no válido',
121
+ 'pattern.creditCard.visa': 'Número de tarjeta Visa no válido',
122
+ 'pattern.creditCard.mastercard': 'Número de Mastercard no válido',
123
+ 'pattern.creditCard.amex': 'Número de tarjeta American Express no válido',
124
+ 'pattern.creditCard.discover': 'Número de tarjeta Discover no válido',
125
+ 'pattern.creditCard.jcb': 'Número de tarjeta JCB no válido',
126
+ 'pattern.creditCard.unionpay': 'Número de tarjeta UnionPay no válido',
127
+ 'pattern.licensePlate': 'Número de matrícula no válido',
128
+ 'pattern.postalCode': 'Código postal no válido',
129
+ 'pattern.passport': 'Número de pasaporte no válido',
130
+ 'pattern.objectId': 'ObjectId no válido',
131
+ 'pattern.hexColor': 'Color hexadecimal no válido',
132
+ 'pattern.macAddress': 'Dirección MAC no válida',
133
+ 'pattern.cron': 'Expresión Cron no válida',
134
+ 'pattern.slug': 'El slug de URL solo puede contener letras minúsculas, números y guiones',
135
+ 'pattern.domain': '{{#label}} debe ser un nombre de dominio válido',
136
+ 'pattern.ip': '{{#label}} debe ser una dirección IP válida',
137
+ 'pattern.base64': '{{#label}} debe ser una cadena Base64 válida',
138
+ 'pattern.jwt': '{{#label}} debe ser un token JWT válido',
139
+ 'pattern.json': '{{#label}} debe ser una cadena JSON válida',
140
+ 'pattern.username': 'El nombre de usuario debe comenzar con una letra y contener solo letras, números y guiones bajos',
141
+ 'pattern.password.weak': 'La contraseña debe tener al menos 6 caracteres',
142
+ 'pattern.password.medium': 'La contraseña debe tener al menos 8 caracteres y contener letras y números',
143
+ 'pattern.password.strong': 'La contraseña debe tener al menos 8 caracteres y contener letras mayúsculas, minúsculas y números',
144
+ 'pattern.password.veryStrong': 'La contraseña debe tener al menos 10 caracteres y contener letras mayúsculas, minúsculas, números y caracteres especiales',
145
+ 'pattern.emailOrPhone': 'Debe ser un correo electrónico o número de teléfono',
146
+ 'pattern.usernameOrEmail': 'Debe ser un nombre de usuario o correo electrónico',
147
+ 'pattern.httpOrHttps': 'Debe ser una URL que comience con http o https',
148
+
149
+ // oneOf
150
+ oneOf: '{{#label}} debe coincidir con uno de los siguientes tipos',
151
+ 'oneOf.invalid': 'El valor de {{#label}} no coincide con ningún tipo permitido',
152
+
153
+ // Error fallback
154
+ UNKNOWN_ERROR: 'Error de validación desconocido',
155
+ CUSTOM_VALIDATION_FAILED: 'Validación fallida',
156
+ ASYNC_VALIDATION_NOT_SUPPORTED: 'La validación asíncrona no es compatible en validate() síncrono',
157
+ VALIDATE_MUST_BE_FUNCTION: 'validate debe ser una función',
158
+ }
159
+
160
+ export default esES