@warlock.js/seal 5.45.0 → 5.47.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.
@@ -67,7 +67,7 @@ export declare class ArrayValidator extends BaseValidator {
67
67
  * so the parent ObjectValidator can omit the key. Without this, optional array
68
68
  * fields would silently materialise as `[]` in the validated output.
69
69
  */
70
- validate(data: any, context: SchemaContext): Promise<ValidationResult>;
70
+ validate(input: any, context: SchemaContext): Promise<ValidationResult>;
71
71
  /**
72
72
  * @inheritdoc
73
73
  *
@@ -1 +1 @@
1
- {"version":3,"file":"array-validator.d.mts","names":[],"sources":["../../../../../../../../packages/seal/src/validators/array-validator.ts"],"mappings":";;;;;;;;;qBAmBa,uBAAuB;EAEzB,WAAW;EADpB,YACS,WAAW,eAClB;;;;EAUK,YAAY;;;;EAOH;;EAST;;EAKA;;EAKA;;EAKA,KAAK,4BAAmC;;EAKxC,IAAI,aAAa;;EAKjB,UAAU,gBAAgB;;EAK1B,IAAI,aAAa;;EAKjB,UAAU,gBAAgB;;EAK1B,OAAO,gBAAgB;;;;;;;;;;;;;;;EAkBvB,QAAQ,aAAa,aAAa;;;;EAUlC,cAAc,aAAa,aAAa;;EAKxC,OAAO;;EAKP,OAAO,4BAAmC;;EAK1C,OAAO,WAAW,SAAS;;;;;;;EAWrB,SAAS,WAAW,SAAS,gBAAgB,QAAQ;;;;;;;;;;;;EAgElD,aAAa,SAAQ,mBAAqC"}
1
+ {"version":3,"file":"array-validator.d.mts","names":[],"sources":["../../../../../../../../packages/seal/src/validators/array-validator.ts"],"mappings":";;;;;;;;;qBAqCa,uBAAuB;EAEzB,WAAW;EADpB,YACS,WAAW,eAClB;;;;EAUK,YAAY;;;;EAOH;;EAST;;EAKA;;EAKA;;EAKA,KAAK,4BAAmC;;EAKxC,IAAI,aAAa;;EAKjB,UAAU,gBAAgB;;EAK1B,IAAI,aAAa;;EAKjB,UAAU,gBAAgB;;EAK1B,OAAO,gBAAgB;;;;;;;;;;;;;;;EAkBvB,QAAQ,aAAa,aAAa;;;;EAUlC,cAAc,aAAa,aAAa;;EAKxC,OAAO;;EAKP,OAAO,4BAAmC;;EAK1C,OAAO,WAAW,SAAS;;;;;;;EAWrB,SAAS,YAAY,SAAS,gBAAgB,QAAQ;;;;;;;;;;;;EAkEnD,aAAa,SAAQ,mBAAqC"}
@@ -11,6 +11,20 @@ import "../rules/index.mjs";
11
11
 
12
12
  //#region ../../packages/seal/src/validators/array-validator.ts
13
13
  /**
14
+ * Brand carried by uploaded file objects (see core's `UploadedFile`). Seal does
15
+ * not depend on core, so it recognises an upload by this registered symbol.
16
+ */
17
+ const UPLOADED_FILE_BRAND = Symbol.for("warlock.uploadedFile");
18
+ /**
19
+ * A multipart request with one part named `files` (no `[]`) delivers a single
20
+ * uploaded file, because browsers cannot express a one-element list otherwise.
21
+ * Only uploaded files are wrapped — strings and other scalars stay as they are
22
+ * so they still fail the array rule.
23
+ */
24
+ function wrapSingleUpload(value) {
25
+ return value !== null && typeof value === "object" && value[UPLOADED_FILE_BRAND] === true ? [value] : value;
26
+ }
27
+ /**
14
28
  * Array validator class
15
29
  */
16
30
  var ArrayValidator = class extends BaseValidator {
@@ -118,7 +132,8 @@ var ArrayValidator = class extends BaseValidator {
118
132
  * so the parent ObjectValidator can omit the key. Without this, optional array
119
133
  * fields would silently materialise as `[]` in the validated output.
120
134
  */
121
- async validate(data, context) {
135
+ async validate(input, context) {
136
+ const data = wrapSingleUpload(input);
122
137
  const valueForRules = data ?? this.getDefaultValue();
123
138
  const mutatedData = await this.mutate(valueForRules, context);
124
139
  const result = await this.validateRules(data, context);
@@ -1 +1 @@
1
- {"version":3,"file":"array-validator.mjs","names":[],"sources":["../../../../../../../../packages/seal/src/validators/array-validator.ts"],"sourcesContent":["import { setKeyPath } from \"../helpers\";\nimport { flipArrayMutator, sortArrayMutator, uniqueArrayMutator } from \"../mutators\";\nimport {\n arrayRule,\n betweenLengthRule,\n lengthRule,\n maxLengthRule,\n minLengthRule,\n sortedArrayRule,\n uniqueArrayRule,\n} from \"../rules\";\nimport type { SchemaContext, ValidationResult } from \"../types\";\nimport { BaseValidator } from \"./base-validator\";\nimport { applyNullable, getRuleOptions } from \"../standard-schema/json-schema\";\nimport type { JsonSchemaResult, JsonSchemaTarget } from \"../standard-schema/json-schema\";\n\n/**\n * Array validator class\n */\nexport class ArrayValidator extends BaseValidator {\n public constructor(\n public validator: BaseValidator,\n errorMessage?: string,\n ) {\n super();\n this.blankIsMissing = true;\n this.addMutableRule(arrayRule, errorMessage);\n }\n\n /**\n * Check if value is an array type\n */\n public matchesType(value: any): boolean {\n return Array.isArray(value);\n }\n\n /**\n * Clone the validator\n */\n public override clone(): this {\n const cloned = super.clone();\n\n cloned.validator = this.validator.clone();\n\n return cloned;\n }\n\n /** Reverse array order */\n public flip() {\n return this.addMutator(flipArrayMutator);\n }\n\n /** Reverse array order (alias) */\n public reverse() {\n return this.addMutator(flipArrayMutator);\n }\n\n /** Make it has only unique values */\n public onlyUnique() {\n return this.addMutator(uniqueArrayMutator);\n }\n\n /** Sort array */\n public sort(direction: \"asc\" | \"desc\" = \"asc\", key?: string) {\n return this.addMutator(sortArrayMutator, { direction, key });\n }\n\n /** Array length must be greater than the given length */\n public min(min: number, errorMessage?: string) {\n return this.addRule(minLengthRule, errorMessage, { minLength: min });\n }\n\n /** @alias min */\n public minLength(length: number, errorMessage?: string) {\n return this.min(length, errorMessage);\n }\n\n /** Array length must be less than the given length */\n public max(max: number, errorMessage?: string) {\n return this.addRule(maxLengthRule, errorMessage, { maxLength: max });\n }\n\n /** @alias max */\n public maxLength(length: number, errorMessage?: string) {\n return this.max(length, errorMessage);\n }\n\n /** Array length must be of the given length */\n public length(length: number, errorMessage?: string) {\n return this.addRule(lengthRule, errorMessage, { length });\n }\n\n /**\n * Array length must be between min and max (inclusive)\n *\n * @param min - Minimum length (inclusive)\n * @param max - Maximum length (inclusive)\n *\n * @example\n * ```ts\n * v.array(v.string()).between(1, 10) // Array must have 1 to 10 items\n * v.array(v.number()).lengthBetween(5, 20) // Same using alias\n * ```\n *\n * @category Validation Rule\n */\n public between(min: number, max: number, errorMessage?: string) {\n return this.addRule(betweenLengthRule, errorMessage, {\n minLength: min,\n maxLength: max,\n });\n }\n\n /**\n * Alias for between() - array length between min and max\n */\n public lengthBetween(min: number, max: number, errorMessage?: string) {\n return this.between(min, max, errorMessage);\n }\n\n /** Array must have unique values */\n public unique(errorMessage?: string) {\n return this.addRule(uniqueArrayRule, errorMessage);\n }\n\n /** Array must be sorted */\n public sorted(direction: \"asc\" | \"desc\" = \"asc\", errorMessage?: string) {\n return this.addRule(sortedArrayRule, errorMessage, { direction });\n }\n\n /** Mutate the data */\n public mutate(data: any, context: SchemaContext) {\n if (!Array.isArray(data)) return data;\n return super.mutate([...data], context);\n }\n\n /** Validate array\n *\n * Absent input (and absent without `.default()`) propagates as `data: undefined`\n * so the parent ObjectValidator can omit the key. Without this, optional array\n * fields would silently materialise as `[]` in the validated output.\n */\n public async validate(data: any, context: SchemaContext): Promise<ValidationResult> {\n // Apply default when absent, then mutate. Mirrors BaseValidator's\n // `valueForRules = data ?? this.getDefaultValue()` so `.default([...])`\n // works on arrays too.\n const valueForRules = data ?? this.getDefaultValue();\n const mutatedData = await this.mutate(valueForRules, context);\n\n const result = await this.validateRules(data, context);\n\n if (result.isValid === false) return result;\n\n // Nothing to iterate for absent (no default) or null (nullable) inputs —\n // propagate so the parent ObjectValidator can omit the key.\n if (mutatedData === undefined || mutatedData === null) return result;\n\n // Defensive: type rule (arrayRule) should have failed for non-arrays.\n if (!Array.isArray(mutatedData)) return result;\n\n const errors: ValidationResult[\"errors\"] = [];\n\n // Validate all items in parallel (consistent with ObjectValidator)\n const validationPromises = mutatedData.map(async (value: any, index: number) => {\n const childContext: SchemaContext = {\n ...context,\n parent: mutatedData,\n value,\n key: index.toString(),\n path: setKeyPath(context.path, index.toString()),\n };\n\n const childResult = await this.validator.validate(value, childContext);\n\n // Update mutated data with validated result\n mutatedData[index] = childResult.data;\n\n // Collect errors from this element\n if (childResult.isValid === false) {\n errors.push(...childResult.errors);\n }\n });\n\n await Promise.all(validationPromises);\n\n return this.refineResult(\n {\n isValid: errors.length === 0,\n errors,\n data: await this.startTransformationPipeline(mutatedData, context),\n },\n context,\n );\n }\n\n /**\n * @inheritdoc\n *\n * Recursively generates JSON Schema for the array items.\n *\n * @example\n * ```ts\n * v.array(v.string().min(1)).minLength(1).toJsonSchema(\"draft-2020-12\")\n * // → { type: \"array\", items: { type: \"string\", minLength: 1 }, minItems: 1 }\n * ```\n */\n public override toJsonSchema(target: JsonSchemaTarget = \"draft-2020-12\"): JsonSchemaResult {\n const schema: JsonSchemaResult = {\n type: \"array\",\n items: this.validator.toJsonSchema(target),\n };\n\n const minOpts = getRuleOptions(this.rules, \"minLength\");\n if (minOpts?.minLength !== undefined) schema.minItems = minOpts.minLength;\n\n const maxOpts = getRuleOptions(this.rules, \"maxLength\");\n if (maxOpts?.maxLength !== undefined) schema.maxItems = maxOpts.maxLength;\n\n const betweenOpts = getRuleOptions(this.rules, \"betweenLength\");\n if (betweenOpts) {\n if (betweenOpts.minLength !== undefined) schema.minItems = betweenOpts.minLength;\n if (betweenOpts.maxLength !== undefined) schema.maxItems = betweenOpts.maxLength;\n }\n\n const lengthOpts = getRuleOptions(this.rules, \"length\");\n if (lengthOpts?.length !== undefined) {\n schema.minItems = lengthOpts.length;\n schema.maxItems = lengthOpts.length;\n }\n\n if (this.isNullable) applyNullable(schema, target);\n\n return schema;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;AAmBA,IAAa,iBAAb,cAAoC,cAAc;CAChD,AAAO,YACL,AAAO,WACP,cACA;EACA,MAAM;EAHC;EAIP,KAAK,iBAAiB;EACtB,KAAK,eAAe,WAAW,YAAY;CAC7C;;;;CAKA,AAAO,YAAY,OAAqB;EACtC,OAAO,MAAM,QAAQ,KAAK;CAC5B;;;;CAKA,AAAgB,QAAc;EAC5B,MAAM,SAAS,MAAM,MAAM;EAE3B,OAAO,YAAY,KAAK,UAAU,MAAM;EAExC,OAAO;CACT;;CAGA,AAAO,OAAO;EACZ,OAAO,KAAK,WAAW,gBAAgB;CACzC;;CAGA,AAAO,UAAU;EACf,OAAO,KAAK,WAAW,gBAAgB;CACzC;;CAGA,AAAO,aAAa;EAClB,OAAO,KAAK,WAAW,kBAAkB;CAC3C;;CAGA,AAAO,KAAK,YAA4B,OAAO,KAAc;EAC3D,OAAO,KAAK,WAAW,kBAAkB;GAAE;GAAW;EAAI,CAAC;CAC7D;;CAGA,AAAO,IAAI,KAAa,cAAuB;EAC7C,OAAO,KAAK,QAAQ,eAAe,cAAc,EAAE,WAAW,IAAI,CAAC;CACrE;;CAGA,AAAO,UAAU,QAAgB,cAAuB;EACtD,OAAO,KAAK,IAAI,QAAQ,YAAY;CACtC;;CAGA,AAAO,IAAI,KAAa,cAAuB;EAC7C,OAAO,KAAK,QAAQ,eAAe,cAAc,EAAE,WAAW,IAAI,CAAC;CACrE;;CAGA,AAAO,UAAU,QAAgB,cAAuB;EACtD,OAAO,KAAK,IAAI,QAAQ,YAAY;CACtC;;CAGA,AAAO,OAAO,QAAgB,cAAuB;EACnD,OAAO,KAAK,QAAQ,YAAY,cAAc,EAAE,OAAO,CAAC;CAC1D;;;;;;;;;;;;;;;CAgBA,AAAO,QAAQ,KAAa,KAAa,cAAuB;EAC9D,OAAO,KAAK,QAAQ,mBAAmB,cAAc;GACnD,WAAW;GACX,WAAW;EACb,CAAC;CACH;;;;CAKA,AAAO,cAAc,KAAa,KAAa,cAAuB;EACpE,OAAO,KAAK,QAAQ,KAAK,KAAK,YAAY;CAC5C;;CAGA,AAAO,OAAO,cAAuB;EACnC,OAAO,KAAK,QAAQ,iBAAiB,YAAY;CACnD;;CAGA,AAAO,OAAO,YAA4B,OAAO,cAAuB;EACtE,OAAO,KAAK,QAAQ,iBAAiB,cAAc,EAAE,UAAU,CAAC;CAClE;;CAGA,AAAO,OAAO,MAAW,SAAwB;EAC/C,IAAI,CAAC,MAAM,QAAQ,IAAI,GAAG,OAAO;EACjC,OAAO,MAAM,OAAO,CAAC,GAAG,IAAI,GAAG,OAAO;CACxC;;;;;;;CAQA,MAAa,SAAS,MAAW,SAAmD;EAIlF,MAAM,gBAAgB,QAAQ,KAAK,gBAAgB;EACnD,MAAM,cAAc,MAAM,KAAK,OAAO,eAAe,OAAO;EAE5D,MAAM,SAAS,MAAM,KAAK,cAAc,MAAM,OAAO;EAErD,IAAI,OAAO,YAAY,OAAO,OAAO;EAIrC,IAAI,gBAAgB,UAAa,gBAAgB,MAAM,OAAO;EAG9D,IAAI,CAAC,MAAM,QAAQ,WAAW,GAAG,OAAO;EAExC,MAAM,SAAqC,CAAC;EAG5C,MAAM,qBAAqB,YAAY,IAAI,OAAO,OAAY,UAAkB;GAC9E,MAAM,eAA8B;IAClC,GAAG;IACH,QAAQ;IACR;IACA,KAAK,MAAM,SAAS;IACpB,MAAM,WAAW,QAAQ,MAAM,MAAM,SAAS,CAAC;GACjD;GAEA,MAAM,cAAc,MAAM,KAAK,UAAU,SAAS,OAAO,YAAY;GAGrE,YAAY,SAAS,YAAY;GAGjC,IAAI,YAAY,YAAY,OAC1B,OAAO,KAAK,GAAG,YAAY,MAAM;EAErC,CAAC;EAED,MAAM,QAAQ,IAAI,kBAAkB;EAEpC,OAAO,KAAK,aACV;GACE,SAAS,OAAO,WAAW;GAC3B;GACA,MAAM,MAAM,KAAK,4BAA4B,aAAa,OAAO;EACnE,GACA,OACF;CACF;;;;;;;;;;;;CAaA,AAAgB,aAAa,SAA2B,iBAAmC;EACzF,MAAM,SAA2B;GAC/B,MAAM;GACN,OAAO,KAAK,UAAU,aAAa,MAAM;EAC3C;EAEA,MAAM,UAAU,eAAe,KAAK,OAAO,WAAW;EACtD,IAAI,SAAS,cAAc,QAAW,OAAO,WAAW,QAAQ;EAEhE,MAAM,UAAU,eAAe,KAAK,OAAO,WAAW;EACtD,IAAI,SAAS,cAAc,QAAW,OAAO,WAAW,QAAQ;EAEhE,MAAM,cAAc,eAAe,KAAK,OAAO,eAAe;EAC9D,IAAI,aAAa;GACf,IAAI,YAAY,cAAc,QAAW,OAAO,WAAW,YAAY;GACvE,IAAI,YAAY,cAAc,QAAW,OAAO,WAAW,YAAY;EACzE;EAEA,MAAM,aAAa,eAAe,KAAK,OAAO,QAAQ;EACtD,IAAI,YAAY,WAAW,QAAW;GACpC,OAAO,WAAW,WAAW;GAC7B,OAAO,WAAW,WAAW;EAC/B;EAEA,IAAI,KAAK,YAAY,cAAc,QAAQ,MAAM;EAEjD,OAAO;CACT;AACF"}
1
+ {"version":3,"file":"array-validator.mjs","names":[],"sources":["../../../../../../../../packages/seal/src/validators/array-validator.ts"],"sourcesContent":["import { setKeyPath } from \"../helpers\";\nimport { flipArrayMutator, sortArrayMutator, uniqueArrayMutator } from \"../mutators\";\nimport {\n arrayRule,\n betweenLengthRule,\n lengthRule,\n maxLengthRule,\n minLengthRule,\n sortedArrayRule,\n uniqueArrayRule,\n} from \"../rules\";\nimport type { SchemaContext, ValidationResult } from \"../types\";\nimport { BaseValidator } from \"./base-validator\";\nimport { applyNullable, getRuleOptions } from \"../standard-schema/json-schema\";\nimport type { JsonSchemaResult, JsonSchemaTarget } from \"../standard-schema/json-schema\";\n\n/**\n * Brand carried by uploaded file objects (see core's `UploadedFile`). Seal does\n * not depend on core, so it recognises an upload by this registered symbol.\n */\nconst UPLOADED_FILE_BRAND = Symbol.for(\"warlock.uploadedFile\");\n\n/**\n * A multipart request with one part named `files` (no `[]`) delivers a single\n * uploaded file, because browsers cannot express a one-element list otherwise.\n * Only uploaded files are wrapped — strings and other scalars stay as they are\n * so they still fail the array rule.\n */\nfunction wrapSingleUpload(value: any) {\n return value !== null && typeof value === \"object\" && value[UPLOADED_FILE_BRAND] === true\n ? [value]\n : value;\n}\n\n/**\n * Array validator class\n */\nexport class ArrayValidator extends BaseValidator {\n public constructor(\n public validator: BaseValidator,\n errorMessage?: string,\n ) {\n super();\n this.blankIsMissing = true;\n this.addMutableRule(arrayRule, errorMessage);\n }\n\n /**\n * Check if value is an array type\n */\n public matchesType(value: any): boolean {\n return Array.isArray(value);\n }\n\n /**\n * Clone the validator\n */\n public override clone(): this {\n const cloned = super.clone();\n\n cloned.validator = this.validator.clone();\n\n return cloned;\n }\n\n /** Reverse array order */\n public flip() {\n return this.addMutator(flipArrayMutator);\n }\n\n /** Reverse array order (alias) */\n public reverse() {\n return this.addMutator(flipArrayMutator);\n }\n\n /** Make it has only unique values */\n public onlyUnique() {\n return this.addMutator(uniqueArrayMutator);\n }\n\n /** Sort array */\n public sort(direction: \"asc\" | \"desc\" = \"asc\", key?: string) {\n return this.addMutator(sortArrayMutator, { direction, key });\n }\n\n /** Array length must be greater than the given length */\n public min(min: number, errorMessage?: string) {\n return this.addRule(minLengthRule, errorMessage, { minLength: min });\n }\n\n /** @alias min */\n public minLength(length: number, errorMessage?: string) {\n return this.min(length, errorMessage);\n }\n\n /** Array length must be less than the given length */\n public max(max: number, errorMessage?: string) {\n return this.addRule(maxLengthRule, errorMessage, { maxLength: max });\n }\n\n /** @alias max */\n public maxLength(length: number, errorMessage?: string) {\n return this.max(length, errorMessage);\n }\n\n /** Array length must be of the given length */\n public length(length: number, errorMessage?: string) {\n return this.addRule(lengthRule, errorMessage, { length });\n }\n\n /**\n * Array length must be between min and max (inclusive)\n *\n * @param min - Minimum length (inclusive)\n * @param max - Maximum length (inclusive)\n *\n * @example\n * ```ts\n * v.array(v.string()).between(1, 10) // Array must have 1 to 10 items\n * v.array(v.number()).lengthBetween(5, 20) // Same using alias\n * ```\n *\n * @category Validation Rule\n */\n public between(min: number, max: number, errorMessage?: string) {\n return this.addRule(betweenLengthRule, errorMessage, {\n minLength: min,\n maxLength: max,\n });\n }\n\n /**\n * Alias for between() - array length between min and max\n */\n public lengthBetween(min: number, max: number, errorMessage?: string) {\n return this.between(min, max, errorMessage);\n }\n\n /** Array must have unique values */\n public unique(errorMessage?: string) {\n return this.addRule(uniqueArrayRule, errorMessage);\n }\n\n /** Array must be sorted */\n public sorted(direction: \"asc\" | \"desc\" = \"asc\", errorMessage?: string) {\n return this.addRule(sortedArrayRule, errorMessage, { direction });\n }\n\n /** Mutate the data */\n public mutate(data: any, context: SchemaContext) {\n if (!Array.isArray(data)) return data;\n return super.mutate([...data], context);\n }\n\n /** Validate array\n *\n * Absent input (and absent without `.default()`) propagates as `data: undefined`\n * so the parent ObjectValidator can omit the key. Without this, optional array\n * fields would silently materialise as `[]` in the validated output.\n */\n public async validate(input: any, context: SchemaContext): Promise<ValidationResult> {\n const data = wrapSingleUpload(input);\n\n // Apply default when absent, then mutate. Mirrors BaseValidator's\n // `valueForRules = data ?? this.getDefaultValue()` so `.default([...])`\n // works on arrays too.\n const valueForRules = data ?? this.getDefaultValue();\n const mutatedData = await this.mutate(valueForRules, context);\n\n const result = await this.validateRules(data, context);\n\n if (result.isValid === false) return result;\n\n // Nothing to iterate for absent (no default) or null (nullable) inputs —\n // propagate so the parent ObjectValidator can omit the key.\n if (mutatedData === undefined || mutatedData === null) return result;\n\n // Defensive: type rule (arrayRule) should have failed for non-arrays.\n if (!Array.isArray(mutatedData)) return result;\n\n const errors: ValidationResult[\"errors\"] = [];\n\n // Validate all items in parallel (consistent with ObjectValidator)\n const validationPromises = mutatedData.map(async (value: any, index: number) => {\n const childContext: SchemaContext = {\n ...context,\n parent: mutatedData,\n value,\n key: index.toString(),\n path: setKeyPath(context.path, index.toString()),\n };\n\n const childResult = await this.validator.validate(value, childContext);\n\n // Update mutated data with validated result\n mutatedData[index] = childResult.data;\n\n // Collect errors from this element\n if (childResult.isValid === false) {\n errors.push(...childResult.errors);\n }\n });\n\n await Promise.all(validationPromises);\n\n return this.refineResult(\n {\n isValid: errors.length === 0,\n errors,\n data: await this.startTransformationPipeline(mutatedData, context),\n },\n context,\n );\n }\n\n /**\n * @inheritdoc\n *\n * Recursively generates JSON Schema for the array items.\n *\n * @example\n * ```ts\n * v.array(v.string().min(1)).minLength(1).toJsonSchema(\"draft-2020-12\")\n * // → { type: \"array\", items: { type: \"string\", minLength: 1 }, minItems: 1 }\n * ```\n */\n public override toJsonSchema(target: JsonSchemaTarget = \"draft-2020-12\"): JsonSchemaResult {\n const schema: JsonSchemaResult = {\n type: \"array\",\n items: this.validator.toJsonSchema(target),\n };\n\n const minOpts = getRuleOptions(this.rules, \"minLength\");\n if (minOpts?.minLength !== undefined) schema.minItems = minOpts.minLength;\n\n const maxOpts = getRuleOptions(this.rules, \"maxLength\");\n if (maxOpts?.maxLength !== undefined) schema.maxItems = maxOpts.maxLength;\n\n const betweenOpts = getRuleOptions(this.rules, \"betweenLength\");\n if (betweenOpts) {\n if (betweenOpts.minLength !== undefined) schema.minItems = betweenOpts.minLength;\n if (betweenOpts.maxLength !== undefined) schema.maxItems = betweenOpts.maxLength;\n }\n\n const lengthOpts = getRuleOptions(this.rules, \"length\");\n if (lengthOpts?.length !== undefined) {\n schema.minItems = lengthOpts.length;\n schema.maxItems = lengthOpts.length;\n }\n\n if (this.isNullable) applyNullable(schema, target);\n\n return schema;\n }\n}\n"],"mappings":"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"}
@@ -43,7 +43,10 @@ declare module "../base-validator.mjs" {
43
43
  isNullable: true;
44
44
  };
45
45
  /**
46
- * Value is required if another field exists
46
+ * Value is required if another field exists.
47
+ *
48
+ * The other field is looked up from the ROOT of the validated data, not
49
+ * beside this field. Inside a nested object use `requiredWithSibling`.
47
50
  */
48
51
  requiredWith(field: string, errorMessage?: string): this;
49
52
  /**
@@ -51,7 +54,13 @@ declare module "../base-validator.mjs" {
51
54
  */
52
55
  requiredWithSibling(field: string, errorMessage?: string): this;
53
56
  /**
54
- * Value is required if another field is missing
57
+ * Value is required if another field is missing.
58
+ *
59
+ * The other field is looked up from the ROOT of the validated data, not
60
+ * beside this field: in `address: { en, ar }`, `ar` is read as `ar` at the
61
+ * root, so a value with only one locale is rejected. Inside a nested
62
+ * object use `requiredWithoutSibling`. The whole `required*`, `present*`
63
+ * and `forbidden*` family without the `Sibling` suffix shares this scope.
55
64
  */
56
65
  requiredWithout(field: string, errorMessage?: string): this;
57
66
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"required-methods.d.mts","names":[],"sources":["../../../../../../../../../packages/seal/src/validators/methods/required-methods.ts"],"mappings":";;;;;;;;;qBAiCa;;YAGD;;;;IAIR,SAAS;;;;IAKT,QAAQ;;;;;IAMR;MAAqB;;;;;;;;;;;;;;;IAerB;MAAoB;MAAkB;;;;;IAKtC,aAAa,eAAe;;;;IAK5B,oBAAoB,eAAe;;;;IAKnC,gBAAgB,eAAe;;;;IAK/B,uBAAuB,eAAe;;;;IAKtC,WAAW,eAAe,YAAY;;;;IAKtC,kBAAkB,eAAe,YAAY;;;;IAK7C,eAAe,eAAe,YAAY;;;;IAK1C,sBAAsB,eAAe,YAAY;;;;IAKjD,gBAAgB,eAAe;;;;IAK/B,uBAAuB,eAAe;;;;IAKtC,mBAAmB,eAAe;;;;IAKlC,0BAA0B,eAAe;;;;IAKzC,mBAAmB,kBAAkB;;;;IAKrC,2BAA2B,kBAAkB;;;;IAK7C,mBAAmB,kBAAkB;;;;IAKrC,2BAA2B,kBAAkB;;;;IAK7C,sBAAsB,kBAAkB;;;;IAKxC,8BAA8B,kBAAkB;;;;IAKhD,sBAAsB,kBAAkB;;;;IAKxC,8BAA8B,kBAAkB;;;;IAKhD,aAAa,eAAe,eAAe;;;;IAK3C,oBAAoB,eAAe,eAAe;;;;IAKlD,gBAAgB,eAAe,eAAe;;;;IAK9C,uBAAuB,eAAe,eAAe;;;;IAKrD,gBAAgB,kBAAkB;;;;IAKlC,wBAAwB,kBAAkB;;;;IAK1C,mBAAmB,kBAAkB;;;;IAKrC,2BAA2B,kBAAkB;;;;IAK7C,gBAAgB,kBAAkB;;;;IAKlC,wBAAwB,kBAAkB;;;;IAK1C,mBAAmB,kBAAkB;;;;IAKrC,2BAA2B,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;IA0B7C,aACE,WAAW,SAAS,4BAA4B,kBAChD"}
1
+ {"version":3,"file":"required-methods.d.mts","names":[],"sources":["../../../../../../../../../packages/seal/src/validators/methods/required-methods.ts"],"mappings":";;;;;;;;;qBAiCa;;YAGD;;;;IAIR,SAAS;;;;IAKT,QAAQ;;;;;IAMR;MAAqB;;;;;;;;;;;;;;;IAerB;MAAoB;MAAkB;;;;;;;;IAQtC,aAAa,eAAe;;;;IAK5B,oBAAoB,eAAe;;;;;;;;;;IAWnC,gBAAgB,eAAe;;;;IAK/B,uBAAuB,eAAe;;;;IAKtC,WAAW,eAAe,YAAY;;;;IAKtC,kBAAkB,eAAe,YAAY;;;;IAK7C,eAAe,eAAe,YAAY;;;;IAK1C,sBAAsB,eAAe,YAAY;;;;IAKjD,gBAAgB,eAAe;;;;IAK/B,uBAAuB,eAAe;;;;IAKtC,mBAAmB,eAAe;;;;IAKlC,0BAA0B,eAAe;;;;IAKzC,mBAAmB,kBAAkB;;;;IAKrC,2BAA2B,kBAAkB;;;;IAK7C,mBAAmB,kBAAkB;;;;IAKrC,2BAA2B,kBAAkB;;;;IAK7C,sBAAsB,kBAAkB;;;;IAKxC,8BAA8B,kBAAkB;;;;IAKhD,sBAAsB,kBAAkB;;;;IAKxC,8BAA8B,kBAAkB;;;;IAKhD,aAAa,eAAe,eAAe;;;;IAK3C,oBAAoB,eAAe,eAAe;;;;IAKlD,gBAAgB,eAAe,eAAe;;;;IAK9C,uBAAuB,eAAe,eAAe;;;;IAKrD,gBAAgB,kBAAkB;;;;IAKlC,wBAAwB,kBAAkB;;;;IAK1C,mBAAmB,kBAAkB;;;;IAKrC,2BAA2B,kBAAkB;;;;IAK7C,gBAAgB,kBAAkB;;;;IAKlC,wBAAwB,kBAAkB;;;;IAK1C,mBAAmB,kBAAkB;;;;IAKrC,2BAA2B,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;IA0B7C,aACE,WAAW,SAAS,4BAA4B,kBAChD"}
@@ -1 +1 @@
1
- {"version":3,"file":"required-methods.mjs","names":[],"sources":["../../../../../../../../../packages/seal/src/validators/methods/required-methods.ts"],"sourcesContent":["import {\n requiredIfAllEmptyRule,\n requiredIfAllNotEmptyRule,\n requiredIfAnyEmptyRule,\n requiredIfAnyNotEmptyRule,\n requiredIfEmptyRule,\n requiredIfInRule,\n requiredIfNotEmptyRule,\n requiredIfNotInRule,\n requiredIfRule,\n} from \"../../rules/conditional/required-if-rules\";\nimport { requiredUnlessRule } from \"../../rules/conditional/required-unless-rules\";\nimport { requiredWhenRule } from \"../../rules/conditional/required-when-rule\";\nimport {\n requiredWithAllRule,\n requiredWithAnyRule,\n requiredWithRule,\n} from \"../../rules/conditional/required-with-rules\";\nimport {\n requiredWithoutAllRule,\n requiredWithoutAnyRule,\n requiredWithoutRule,\n} from \"../../rules/conditional/required-without-rules\";\nimport { presentRule, requiredRule } from \"../../rules/core/required\";\nimport type { SchemaContext } from \"../../types\";\nimport { BaseValidator } from \"../base-validator\";\n\n/**\n * Marker re-exported by the validators barrel so the dts bundler keeps this\n * module (and its `declare module` augmentation) in the bundled `.d.ts`.\n * Without a real export, side-effect-only augmentation modules get tree-shaken\n * out of the published types, dropping every chainable rule method.\n */\nexport const requiredMethodsApplied = true;\n\ndeclare module \"../base-validator\" {\n interface BaseValidator {\n /**\n * This value must be present and has a value\n */\n required(errorMessage?: string): this;\n\n /**\n * Value must be present but not necessarily has a value\n */\n present(errorMessage?: string): this;\n\n /**\n * Mark the field as optional, so pass it if it has no value or has a value\n * Because this is the default behavior, this method is just syntactic sugar\n */\n optional(): this & { isOptional: true };\n\n /**\n * Sugar for `.optional().nullable()` — the field may be absent OR null.\n *\n * Brands the return type with both `{ isOptional: true }` and `{ isNullable: true }`\n * so `Infer<>` produces `{ field?: T | null }`.\n *\n * @example\n * v.string().nullish()\n * // type: string | null | undefined\n * // absent → key omitted\n * // null → null\n * // \"x\" → \"x\"\n */\n nullish(): this & { isOptional: true; isNullable: true };\n\n /**\n * Value is required if another field exists\n */\n requiredWith(field: string, errorMessage?: string): this;\n\n /**\n * Value is required if another sibling field exists\n */\n requiredWithSibling(field: string, errorMessage?: string): this;\n\n /**\n * Value is required if another field is missing\n */\n requiredWithout(field: string, errorMessage?: string): this;\n\n /**\n * Value is required if another sibling field is missing\n */\n requiredWithoutSibling(field: string, errorMessage?: string): this;\n\n /**\n * Value is required if another field equals a specific value\n */\n requiredIf(field: string, value: any, errorMessage?: string): this;\n\n /**\n * Value is required if another sibling field equals a specific value\n */\n requiredIfSibling(field: string, value: any, errorMessage?: string): this;\n\n /**\n * Value is required unless another field equals a specific value\n */\n requiredUnless(field: string, value: any, errorMessage?: string): this;\n\n /**\n * Value is required unless another sibling field equals a specific value\n */\n requiredUnlessSibling(field: string, value: any, errorMessage?: string): this;\n\n /**\n * Value is required if another field is empty\n */\n requiredIfEmpty(field: string, errorMessage?: string): this;\n\n /**\n * Value is required if another sibling field is empty\n */\n requiredIfEmptySibling(field: string, errorMessage?: string): this;\n\n /**\n * Value is required if another field is not empty\n */\n requiredIfNotEmpty(field: string, errorMessage?: string): this;\n\n /**\n * Value is required if another sibling field is not empty\n */\n requiredIfNotEmptySibling(field: string, errorMessage?: string): this;\n\n /**\n * Value is required if ALL specified fields are empty\n */\n requiredIfAllEmpty(fields: string[], errorMessage?: string): this;\n\n /**\n * Value is required if ALL specified sibling fields are empty\n */\n requiredIfAllEmptySiblings(fields: string[], errorMessage?: string): this;\n\n /**\n * Value is required if ANY of the specified fields is empty\n */\n requiredIfAnyEmpty(fields: string[], errorMessage?: string): this;\n\n /**\n * Value is required if ANY of the specified sibling fields is empty\n */\n requiredIfAnyEmptySiblings(fields: string[], errorMessage?: string): this;\n\n /**\n * Value is required if ALL specified fields are NOT empty\n */\n requiredIfAllNotEmpty(fields: string[], errorMessage?: string): this;\n\n /**\n * Value is required if ALL specified sibling fields are NOT empty\n */\n requiredIfAllNotEmptySiblings(fields: string[], errorMessage?: string): this;\n\n /**\n * Value is required if ANY of the specified fields is NOT empty\n */\n requiredIfAnyNotEmpty(fields: string[], errorMessage?: string): this;\n\n /**\n * Value is required if ANY of the specified sibling fields is NOT empty\n */\n requiredIfAnyNotEmptySiblings(fields: string[], errorMessage?: string): this;\n\n /**\n * Value is required if another field's value is in the given array\n */\n requiredIfIn(field: string, values: any[], errorMessage?: string): this;\n\n /**\n * Value is required if another sibling field's value is in the given array\n */\n requiredIfInSibling(field: string, values: any[], errorMessage?: string): this;\n\n /**\n * Value is required if another field's value is NOT in the given array\n */\n requiredIfNotIn(field: string, values: any[], errorMessage?: string): this;\n\n /**\n * Value is required if another sibling field's value is NOT in the given array\n */\n requiredIfNotInSibling(field: string, values: any[], errorMessage?: string): this;\n\n /**\n * Value is required if all specified fields exist\n */\n requiredWithAll(fields: string[], errorMessage?: string): this;\n\n /**\n * Value is required if all specified sibling fields exist\n */\n requiredWithAllSiblings(fields: string[], errorMessage?: string): this;\n\n /**\n * Value is required if all specified fields are missing\n */\n requiredWithoutAll(fields: string[], errorMessage?: string): this;\n\n /**\n * Value is required if all specified sibling fields are missing\n */\n requiredWithoutAllSiblings(fields: string[], errorMessage?: string): this;\n\n /**\n * Value is required if any of the specified fields exists\n */\n requiredWithAny(fields: string[], errorMessage?: string): this;\n\n /**\n * Value is required if any of the specified sibling fields exists\n */\n requiredWithAnySiblings(fields: string[], errorMessage?: string): this;\n\n /**\n * Value is required if any of the specified fields is missing\n */\n requiredWithoutAny(fields: string[], errorMessage?: string): this;\n\n /**\n * Value is required if any of the specified sibling fields is missing\n */\n requiredWithoutAnySiblings(fields: string[], errorMessage?: string): this;\n\n /**\n * Make this field required based on a custom callback.\n *\n * The callback receives only the `SchemaContext` (not the value),\n * because \"required\" is about surrounding conditions, not the field itself.\n * Return `true` if the field should be required.\n *\n * @param callback - Receives SchemaContext, returns boolean\n * @param errorMessage - Optional custom error message\n *\n * @example\n * ```ts\n * // Required when email notification is enabled\n * v.string().requiredWhen((context) => {\n * return context.allData.notificationMethod === 'email';\n * })\n *\n * // Required based on multiple conditions\n * v.string().requiredWhen((context) => {\n * const { role, department } = context.allData;\n * return role === 'manager' && department === 'finance';\n * })\n * ```\n */\n requiredWhen(\n callback: (context: SchemaContext) => boolean | Promise<boolean>,\n errorMessage?: string,\n ): this;\n }\n}\n\n// ==================== UNCONDITIONAL STATES ====================\n\n/**\n * This value must be present and has a value\n */\nBaseValidator.prototype.required = function (errorMessage?: string) {\n return this.setRequiredRule(requiredRule, errorMessage);\n};\n\n/**\n * Value must be present but not necessarily has a value\n */\nBaseValidator.prototype.present = function (errorMessage?: string) {\n return this.setRequiredRule(presentRule, errorMessage);\n};\n\n/**\n * Mark the field as optional — it may be absent or empty without validation errors.\n * Clears any previously set required rule.\n *\n * The return type is branded with `{ isOptional: true }` so schema inference\n * can mark this key as optional in the inferred TypeScript type.\n */\nBaseValidator.prototype.optional = function (): BaseValidator & { isOptional: true } {\n const instance = this.instance;\n instance.isOptional = true;\n instance.requiredRule = null;\n return instance as BaseValidator & { isOptional: true };\n};\n\n/**\n * Sugar — equivalent to `.optional().nullable()`.\n */\nBaseValidator.prototype.nullish = function (): BaseValidator & {\n isOptional: true;\n isNullable: true;\n} {\n const instance = this.optional().nullable();\n return instance as BaseValidator & { isOptional: true; isNullable: true };\n};\n\n// ==================== REQUIRED: BASED ON FIELD PRESENCE ====================\n\n/**\n * Value is required if another field exists\n */\nBaseValidator.prototype.requiredWith = function (field: string, errorMessage?: string) {\n return this.setRequiredRule(requiredWithRule, errorMessage, { field, scope: \"global\" });\n};\n\n/**\n * Value is required if another sibling field exists\n */\nBaseValidator.prototype.requiredWithSibling = function (field: string, errorMessage?: string) {\n return this.setRequiredRule(requiredWithRule, errorMessage, { field, scope: \"sibling\" });\n};\n\n/**\n * Value is required if another field is missing\n */\nBaseValidator.prototype.requiredWithout = function (field: string, errorMessage?: string) {\n return this.setRequiredRule(requiredWithoutRule, errorMessage, { field, scope: \"global\" });\n};\n\n/**\n * Value is required if another sibling field is missing\n */\nBaseValidator.prototype.requiredWithoutSibling = function (field: string, errorMessage?: string) {\n return this.setRequiredRule(requiredWithoutRule, errorMessage, { field, scope: \"sibling\" });\n};\n\n// ==================== REQUIRED: BASED ON FIELD VALUE ====================\n\n/**\n * Value is required if another field equals a specific value\n */\nBaseValidator.prototype.requiredIf = function (field: string, value: any, errorMessage?: string) {\n return this.setRequiredRule(requiredIfRule, errorMessage, { field, value, scope: \"global\" });\n};\n\n/**\n * Value is required if another sibling field equals a specific value\n */\nBaseValidator.prototype.requiredIfSibling = function (\n field: string,\n value: any,\n errorMessage?: string,\n) {\n return this.setRequiredRule(requiredIfRule, errorMessage, { field, value, scope: \"sibling\" });\n};\n\n/**\n * Value is required unless another field equals a specific value\n */\nBaseValidator.prototype.requiredUnless = function (\n field: string,\n value: any,\n errorMessage?: string,\n) {\n return this.setRequiredRule(requiredUnlessRule, errorMessage, { field, value, scope: \"global\" });\n};\n\n/**\n * Value is required unless another sibling field equals a specific value\n */\nBaseValidator.prototype.requiredUnlessSibling = function (\n field: string,\n value: any,\n errorMessage?: string,\n) {\n return this.setRequiredRule(requiredUnlessRule, errorMessage, { field, value, scope: \"sibling\" });\n};\n\n// ==================== REQUIRED: BASED ON FIELD EMPTY STATE ====================\n\n/**\n * Value is required if another field is empty\n */\nBaseValidator.prototype.requiredIfEmpty = function (field: string, errorMessage?: string) {\n return this.setRequiredRule(requiredIfEmptyRule, errorMessage, { field, scope: \"global\" });\n};\n\n/**\n * Value is required if another sibling field is empty\n */\nBaseValidator.prototype.requiredIfEmptySibling = function (field: string, errorMessage?: string) {\n return this.setRequiredRule(requiredIfEmptyRule, errorMessage, { field, scope: \"sibling\" });\n};\n\n/**\n * Value is required if another field is not empty\n */\nBaseValidator.prototype.requiredIfNotEmpty = function (field: string, errorMessage?: string) {\n return this.setRequiredRule(requiredIfNotEmptyRule, errorMessage, { field, scope: \"global\" });\n};\n\n/**\n * Value is required if another sibling field is not empty\n */\nBaseValidator.prototype.requiredIfNotEmptySibling = function (\n field: string,\n errorMessage?: string,\n) {\n return this.setRequiredRule(requiredIfNotEmptyRule, errorMessage, { field, scope: \"sibling\" });\n};\n\n// ==================== REQUIRED: BASED ON MULTIPLE FIELDS EMPTY STATE ====================\n\n/**\n * Value is required if ALL specified fields are empty\n */\nBaseValidator.prototype.requiredIfAllEmpty = function (fields: string[], errorMessage?: string) {\n return this.setRequiredRule(requiredIfAllEmptyRule, errorMessage, { fields, scope: \"global\" });\n};\n\n/**\n * Value is required if ALL specified sibling fields are empty\n */\nBaseValidator.prototype.requiredIfAllEmptySiblings = function (\n fields: string[],\n errorMessage?: string,\n) {\n return this.setRequiredRule(requiredIfAllEmptyRule, errorMessage, { fields, scope: \"sibling\" });\n};\n\n/**\n * Value is required if ANY of the specified fields is empty\n */\nBaseValidator.prototype.requiredIfAnyEmpty = function (fields: string[], errorMessage?: string) {\n return this.setRequiredRule(requiredIfAnyEmptyRule, errorMessage, { fields, scope: \"global\" });\n};\n\n/**\n * Value is required if ANY of the specified sibling fields is empty\n */\nBaseValidator.prototype.requiredIfAnyEmptySiblings = function (\n fields: string[],\n errorMessage?: string,\n) {\n return this.setRequiredRule(requiredIfAnyEmptyRule, errorMessage, { fields, scope: \"sibling\" });\n};\n\n/**\n * Value is required if ALL specified fields are NOT empty\n */\nBaseValidator.prototype.requiredIfAllNotEmpty = function (fields: string[], errorMessage?: string) {\n return this.setRequiredRule(requiredIfAllNotEmptyRule, errorMessage, { fields, scope: \"global\" });\n};\n\n/**\n * Value is required if ALL specified sibling fields are NOT empty\n */\nBaseValidator.prototype.requiredIfAllNotEmptySiblings = function (\n fields: string[],\n errorMessage?: string,\n) {\n return this.setRequiredRule(requiredIfAllNotEmptyRule, errorMessage, {\n fields,\n scope: \"sibling\",\n });\n};\n\n/**\n * Value is required if ANY of the specified fields is NOT empty\n */\nBaseValidator.prototype.requiredIfAnyNotEmpty = function (fields: string[], errorMessage?: string) {\n return this.setRequiredRule(requiredIfAnyNotEmptyRule, errorMessage, { fields, scope: \"global\" });\n};\n\n/**\n * Value is required if ANY of the specified sibling fields is NOT empty\n */\nBaseValidator.prototype.requiredIfAnyNotEmptySiblings = function (\n fields: string[],\n errorMessage?: string,\n) {\n return this.setRequiredRule(requiredIfAnyNotEmptyRule, errorMessage, {\n fields,\n scope: \"sibling\",\n });\n};\n\n/**\n * Value is required if another field's value is in the given array\n */\nBaseValidator.prototype.requiredIfIn = function (\n field: string,\n values: any[],\n errorMessage?: string,\n) {\n return this.setRequiredRule(requiredIfInRule, errorMessage, { field, values, scope: \"global\" });\n};\n\n/**\n * Value is required if another sibling field's value is in the given array\n */\nBaseValidator.prototype.requiredIfInSibling = function (\n field: string,\n values: any[],\n errorMessage?: string,\n) {\n return this.setRequiredRule(requiredIfInRule, errorMessage, { field, values, scope: \"sibling\" });\n};\n\n/**\n * Value is required if another field's value is NOT in the given array\n */\nBaseValidator.prototype.requiredIfNotIn = function (\n field: string,\n values: any[],\n errorMessage?: string,\n) {\n return this.setRequiredRule(requiredIfNotInRule, errorMessage, {\n field,\n values,\n scope: \"global\",\n });\n};\n\n/**\n * Value is required if another sibling field's value is NOT in the given array\n */\nBaseValidator.prototype.requiredIfNotInSibling = function (\n field: string,\n values: any[],\n errorMessage?: string,\n) {\n return this.setRequiredRule(requiredIfNotInRule, errorMessage, {\n field,\n values,\n scope: \"sibling\",\n });\n};\n\n// ==================== REQUIRED: BASED ON MULTIPLE FIELDS (ALL) ====================\n\n/**\n * Value is required if all specified fields exist\n */\nBaseValidator.prototype.requiredWithAll = function (fields: string[], errorMessage?: string) {\n return this.setRequiredRule(requiredWithAllRule, errorMessage, { fields, scope: \"global\" });\n};\n\n/**\n * Value is required if all specified sibling fields exist\n */\nBaseValidator.prototype.requiredWithAllSiblings = function (\n fields: string[],\n errorMessage?: string,\n) {\n return this.setRequiredRule(requiredWithAllRule, errorMessage, { fields, scope: \"sibling\" });\n};\n\n/**\n * Value is required if all specified fields are missing\n */\nBaseValidator.prototype.requiredWithoutAll = function (fields: string[], errorMessage?: string) {\n return this.setRequiredRule(requiredWithoutAllRule, errorMessage, { fields, scope: \"global\" });\n};\n\n/**\n * Value is required if all specified sibling fields are missing\n */\nBaseValidator.prototype.requiredWithoutAllSiblings = function (\n fields: string[],\n errorMessage?: string,\n) {\n return this.setRequiredRule(requiredWithoutAllRule, errorMessage, { fields, scope: \"sibling\" });\n};\n\n// ==================== REQUIRED: BASED ON MULTIPLE FIELDS (ANY) ====================\n\n/**\n * Value is required if any of the specified fields exists\n */\nBaseValidator.prototype.requiredWithAny = function (fields: string[], errorMessage?: string) {\n return this.setRequiredRule(requiredWithAnyRule, errorMessage, { fields, scope: \"global\" });\n};\n\n/**\n * Value is required if any of the specified sibling fields exists\n */\nBaseValidator.prototype.requiredWithAnySiblings = function (\n fields: string[],\n errorMessage?: string,\n) {\n return this.setRequiredRule(requiredWithAnyRule, errorMessage, { fields, scope: \"sibling\" });\n};\n\n/**\n * Value is required if any of the specified fields is missing\n */\nBaseValidator.prototype.requiredWithoutAny = function (fields: string[], errorMessage?: string) {\n return this.setRequiredRule(requiredWithoutAnyRule, errorMessage, { fields, scope: \"global\" });\n};\n\n/**\n * Value is required if any of the specified sibling fields is missing\n */\nBaseValidator.prototype.requiredWithoutAnySiblings = function (\n fields: string[],\n errorMessage?: string,\n) {\n return this.setRequiredRule(requiredWithoutAnyRule, errorMessage, { fields, scope: \"sibling\" });\n};\n\n// ==================== REQUIRED: BASED ON CUSTOM CALLBACK ====================\n\n/**\n * Make this field required based on a custom callback.\n * Callback receives only SchemaContext — the framework handles empty-value checking.\n */\nBaseValidator.prototype.requiredWhen = function (\n callback: (context: SchemaContext) => boolean | Promise<boolean>,\n errorMessage?: string,\n) {\n return this.setRequiredRule(requiredWhenRule, errorMessage, { callback });\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"required-methods.mjs","names":[],"sources":["../../../../../../../../../packages/seal/src/validators/methods/required-methods.ts"],"sourcesContent":["import {\n requiredIfAllEmptyRule,\n requiredIfAllNotEmptyRule,\n requiredIfAnyEmptyRule,\n requiredIfAnyNotEmptyRule,\n requiredIfEmptyRule,\n requiredIfInRule,\n requiredIfNotEmptyRule,\n requiredIfNotInRule,\n requiredIfRule,\n} from \"../../rules/conditional/required-if-rules\";\nimport { requiredUnlessRule } from \"../../rules/conditional/required-unless-rules\";\nimport { requiredWhenRule } from \"../../rules/conditional/required-when-rule\";\nimport {\n requiredWithAllRule,\n requiredWithAnyRule,\n requiredWithRule,\n} from \"../../rules/conditional/required-with-rules\";\nimport {\n requiredWithoutAllRule,\n requiredWithoutAnyRule,\n requiredWithoutRule,\n} from \"../../rules/conditional/required-without-rules\";\nimport { presentRule, requiredRule } from \"../../rules/core/required\";\nimport type { SchemaContext } from \"../../types\";\nimport { BaseValidator } from \"../base-validator\";\n\n/**\n * Marker re-exported by the validators barrel so the dts bundler keeps this\n * module (and its `declare module` augmentation) in the bundled `.d.ts`.\n * Without a real export, side-effect-only augmentation modules get tree-shaken\n * out of the published types, dropping every chainable rule method.\n */\nexport const requiredMethodsApplied = true;\n\ndeclare module \"../base-validator\" {\n interface BaseValidator {\n /**\n * This value must be present and has a value\n */\n required(errorMessage?: string): this;\n\n /**\n * Value must be present but not necessarily has a value\n */\n present(errorMessage?: string): this;\n\n /**\n * Mark the field as optional, so pass it if it has no value or has a value\n * Because this is the default behavior, this method is just syntactic sugar\n */\n optional(): this & { isOptional: true };\n\n /**\n * Sugar for `.optional().nullable()` — the field may be absent OR null.\n *\n * Brands the return type with both `{ isOptional: true }` and `{ isNullable: true }`\n * so `Infer<>` produces `{ field?: T | null }`.\n *\n * @example\n * v.string().nullish()\n * // type: string | null | undefined\n * // absent → key omitted\n * // null → null\n * // \"x\" → \"x\"\n */\n nullish(): this & { isOptional: true; isNullable: true };\n\n /**\n * Value is required if another field exists.\n *\n * The other field is looked up from the ROOT of the validated data, not\n * beside this field. Inside a nested object use `requiredWithSibling`.\n */\n requiredWith(field: string, errorMessage?: string): this;\n\n /**\n * Value is required if another sibling field exists\n */\n requiredWithSibling(field: string, errorMessage?: string): this;\n\n /**\n * Value is required if another field is missing.\n *\n * The other field is looked up from the ROOT of the validated data, not\n * beside this field: in `address: { en, ar }`, `ar` is read as `ar` at the\n * root, so a value with only one locale is rejected. Inside a nested\n * object use `requiredWithoutSibling`. The whole `required*`, `present*`\n * and `forbidden*` family without the `Sibling` suffix shares this scope.\n */\n requiredWithout(field: string, errorMessage?: string): this;\n\n /**\n * Value is required if another sibling field is missing\n */\n requiredWithoutSibling(field: string, errorMessage?: string): this;\n\n /**\n * Value is required if another field equals a specific value\n */\n requiredIf(field: string, value: any, errorMessage?: string): this;\n\n /**\n * Value is required if another sibling field equals a specific value\n */\n requiredIfSibling(field: string, value: any, errorMessage?: string): this;\n\n /**\n * Value is required unless another field equals a specific value\n */\n requiredUnless(field: string, value: any, errorMessage?: string): this;\n\n /**\n * Value is required unless another sibling field equals a specific value\n */\n requiredUnlessSibling(field: string, value: any, errorMessage?: string): this;\n\n /**\n * Value is required if another field is empty\n */\n requiredIfEmpty(field: string, errorMessage?: string): this;\n\n /**\n * Value is required if another sibling field is empty\n */\n requiredIfEmptySibling(field: string, errorMessage?: string): this;\n\n /**\n * Value is required if another field is not empty\n */\n requiredIfNotEmpty(field: string, errorMessage?: string): this;\n\n /**\n * Value is required if another sibling field is not empty\n */\n requiredIfNotEmptySibling(field: string, errorMessage?: string): this;\n\n /**\n * Value is required if ALL specified fields are empty\n */\n requiredIfAllEmpty(fields: string[], errorMessage?: string): this;\n\n /**\n * Value is required if ALL specified sibling fields are empty\n */\n requiredIfAllEmptySiblings(fields: string[], errorMessage?: string): this;\n\n /**\n * Value is required if ANY of the specified fields is empty\n */\n requiredIfAnyEmpty(fields: string[], errorMessage?: string): this;\n\n /**\n * Value is required if ANY of the specified sibling fields is empty\n */\n requiredIfAnyEmptySiblings(fields: string[], errorMessage?: string): this;\n\n /**\n * Value is required if ALL specified fields are NOT empty\n */\n requiredIfAllNotEmpty(fields: string[], errorMessage?: string): this;\n\n /**\n * Value is required if ALL specified sibling fields are NOT empty\n */\n requiredIfAllNotEmptySiblings(fields: string[], errorMessage?: string): this;\n\n /**\n * Value is required if ANY of the specified fields is NOT empty\n */\n requiredIfAnyNotEmpty(fields: string[], errorMessage?: string): this;\n\n /**\n * Value is required if ANY of the specified sibling fields is NOT empty\n */\n requiredIfAnyNotEmptySiblings(fields: string[], errorMessage?: string): this;\n\n /**\n * Value is required if another field's value is in the given array\n */\n requiredIfIn(field: string, values: any[], errorMessage?: string): this;\n\n /**\n * Value is required if another sibling field's value is in the given array\n */\n requiredIfInSibling(field: string, values: any[], errorMessage?: string): this;\n\n /**\n * Value is required if another field's value is NOT in the given array\n */\n requiredIfNotIn(field: string, values: any[], errorMessage?: string): this;\n\n /**\n * Value is required if another sibling field's value is NOT in the given array\n */\n requiredIfNotInSibling(field: string, values: any[], errorMessage?: string): this;\n\n /**\n * Value is required if all specified fields exist\n */\n requiredWithAll(fields: string[], errorMessage?: string): this;\n\n /**\n * Value is required if all specified sibling fields exist\n */\n requiredWithAllSiblings(fields: string[], errorMessage?: string): this;\n\n /**\n * Value is required if all specified fields are missing\n */\n requiredWithoutAll(fields: string[], errorMessage?: string): this;\n\n /**\n * Value is required if all specified sibling fields are missing\n */\n requiredWithoutAllSiblings(fields: string[], errorMessage?: string): this;\n\n /**\n * Value is required if any of the specified fields exists\n */\n requiredWithAny(fields: string[], errorMessage?: string): this;\n\n /**\n * Value is required if any of the specified sibling fields exists\n */\n requiredWithAnySiblings(fields: string[], errorMessage?: string): this;\n\n /**\n * Value is required if any of the specified fields is missing\n */\n requiredWithoutAny(fields: string[], errorMessage?: string): this;\n\n /**\n * Value is required if any of the specified sibling fields is missing\n */\n requiredWithoutAnySiblings(fields: string[], errorMessage?: string): this;\n\n /**\n * Make this field required based on a custom callback.\n *\n * The callback receives only the `SchemaContext` (not the value),\n * because \"required\" is about surrounding conditions, not the field itself.\n * Return `true` if the field should be required.\n *\n * @param callback - Receives SchemaContext, returns boolean\n * @param errorMessage - Optional custom error message\n *\n * @example\n * ```ts\n * // Required when email notification is enabled\n * v.string().requiredWhen((context) => {\n * return context.allData.notificationMethod === 'email';\n * })\n *\n * // Required based on multiple conditions\n * v.string().requiredWhen((context) => {\n * const { role, department } = context.allData;\n * return role === 'manager' && department === 'finance';\n * })\n * ```\n */\n requiredWhen(\n callback: (context: SchemaContext) => boolean | Promise<boolean>,\n errorMessage?: string,\n ): this;\n }\n}\n\n// ==================== UNCONDITIONAL STATES ====================\n\n/**\n * This value must be present and has a value\n */\nBaseValidator.prototype.required = function (errorMessage?: string) {\n return this.setRequiredRule(requiredRule, errorMessage);\n};\n\n/**\n * Value must be present but not necessarily has a value\n */\nBaseValidator.prototype.present = function (errorMessage?: string) {\n return this.setRequiredRule(presentRule, errorMessage);\n};\n\n/**\n * Mark the field as optional — it may be absent or empty without validation errors.\n * Clears any previously set required rule.\n *\n * The return type is branded with `{ isOptional: true }` so schema inference\n * can mark this key as optional in the inferred TypeScript type.\n */\nBaseValidator.prototype.optional = function (): BaseValidator & { isOptional: true } {\n const instance = this.instance;\n instance.isOptional = true;\n instance.requiredRule = null;\n return instance as BaseValidator & { isOptional: true };\n};\n\n/**\n * Sugar — equivalent to `.optional().nullable()`.\n */\nBaseValidator.prototype.nullish = function (): BaseValidator & {\n isOptional: true;\n isNullable: true;\n} {\n const instance = this.optional().nullable();\n return instance as BaseValidator & { isOptional: true; isNullable: true };\n};\n\n// ==================== REQUIRED: BASED ON FIELD PRESENCE ====================\n\n/**\n * Value is required if another field exists\n */\nBaseValidator.prototype.requiredWith = function (field: string, errorMessage?: string) {\n return this.setRequiredRule(requiredWithRule, errorMessage, { field, scope: \"global\" });\n};\n\n/**\n * Value is required if another sibling field exists\n */\nBaseValidator.prototype.requiredWithSibling = function (field: string, errorMessage?: string) {\n return this.setRequiredRule(requiredWithRule, errorMessage, { field, scope: \"sibling\" });\n};\n\n/**\n * Value is required if another field is missing\n */\nBaseValidator.prototype.requiredWithout = function (field: string, errorMessage?: string) {\n return this.setRequiredRule(requiredWithoutRule, errorMessage, { field, scope: \"global\" });\n};\n\n/**\n * Value is required if another sibling field is missing\n */\nBaseValidator.prototype.requiredWithoutSibling = function (field: string, errorMessage?: string) {\n return this.setRequiredRule(requiredWithoutRule, errorMessage, { field, scope: \"sibling\" });\n};\n\n// ==================== REQUIRED: BASED ON FIELD VALUE ====================\n\n/**\n * Value is required if another field equals a specific value\n */\nBaseValidator.prototype.requiredIf = function (field: string, value: any, errorMessage?: string) {\n return this.setRequiredRule(requiredIfRule, errorMessage, { field, value, scope: \"global\" });\n};\n\n/**\n * Value is required if another sibling field equals a specific value\n */\nBaseValidator.prototype.requiredIfSibling = function (\n field: string,\n value: any,\n errorMessage?: string,\n) {\n return this.setRequiredRule(requiredIfRule, errorMessage, { field, value, scope: \"sibling\" });\n};\n\n/**\n * Value is required unless another field equals a specific value\n */\nBaseValidator.prototype.requiredUnless = function (\n field: string,\n value: any,\n errorMessage?: string,\n) {\n return this.setRequiredRule(requiredUnlessRule, errorMessage, { field, value, scope: \"global\" });\n};\n\n/**\n * Value is required unless another sibling field equals a specific value\n */\nBaseValidator.prototype.requiredUnlessSibling = function (\n field: string,\n value: any,\n errorMessage?: string,\n) {\n return this.setRequiredRule(requiredUnlessRule, errorMessage, { field, value, scope: \"sibling\" });\n};\n\n// ==================== REQUIRED: BASED ON FIELD EMPTY STATE ====================\n\n/**\n * Value is required if another field is empty\n */\nBaseValidator.prototype.requiredIfEmpty = function (field: string, errorMessage?: string) {\n return this.setRequiredRule(requiredIfEmptyRule, errorMessage, { field, scope: \"global\" });\n};\n\n/**\n * Value is required if another sibling field is empty\n */\nBaseValidator.prototype.requiredIfEmptySibling = function (field: string, errorMessage?: string) {\n return this.setRequiredRule(requiredIfEmptyRule, errorMessage, { field, scope: \"sibling\" });\n};\n\n/**\n * Value is required if another field is not empty\n */\nBaseValidator.prototype.requiredIfNotEmpty = function (field: string, errorMessage?: string) {\n return this.setRequiredRule(requiredIfNotEmptyRule, errorMessage, { field, scope: \"global\" });\n};\n\n/**\n * Value is required if another sibling field is not empty\n */\nBaseValidator.prototype.requiredIfNotEmptySibling = function (\n field: string,\n errorMessage?: string,\n) {\n return this.setRequiredRule(requiredIfNotEmptyRule, errorMessage, { field, scope: \"sibling\" });\n};\n\n// ==================== REQUIRED: BASED ON MULTIPLE FIELDS EMPTY STATE ====================\n\n/**\n * Value is required if ALL specified fields are empty\n */\nBaseValidator.prototype.requiredIfAllEmpty = function (fields: string[], errorMessage?: string) {\n return this.setRequiredRule(requiredIfAllEmptyRule, errorMessage, { fields, scope: \"global\" });\n};\n\n/**\n * Value is required if ALL specified sibling fields are empty\n */\nBaseValidator.prototype.requiredIfAllEmptySiblings = function (\n fields: string[],\n errorMessage?: string,\n) {\n return this.setRequiredRule(requiredIfAllEmptyRule, errorMessage, { fields, scope: \"sibling\" });\n};\n\n/**\n * Value is required if ANY of the specified fields is empty\n */\nBaseValidator.prototype.requiredIfAnyEmpty = function (fields: string[], errorMessage?: string) {\n return this.setRequiredRule(requiredIfAnyEmptyRule, errorMessage, { fields, scope: \"global\" });\n};\n\n/**\n * Value is required if ANY of the specified sibling fields is empty\n */\nBaseValidator.prototype.requiredIfAnyEmptySiblings = function (\n fields: string[],\n errorMessage?: string,\n) {\n return this.setRequiredRule(requiredIfAnyEmptyRule, errorMessage, { fields, scope: \"sibling\" });\n};\n\n/**\n * Value is required if ALL specified fields are NOT empty\n */\nBaseValidator.prototype.requiredIfAllNotEmpty = function (fields: string[], errorMessage?: string) {\n return this.setRequiredRule(requiredIfAllNotEmptyRule, errorMessage, { fields, scope: \"global\" });\n};\n\n/**\n * Value is required if ALL specified sibling fields are NOT empty\n */\nBaseValidator.prototype.requiredIfAllNotEmptySiblings = function (\n fields: string[],\n errorMessage?: string,\n) {\n return this.setRequiredRule(requiredIfAllNotEmptyRule, errorMessage, {\n fields,\n scope: \"sibling\",\n });\n};\n\n/**\n * Value is required if ANY of the specified fields is NOT empty\n */\nBaseValidator.prototype.requiredIfAnyNotEmpty = function (fields: string[], errorMessage?: string) {\n return this.setRequiredRule(requiredIfAnyNotEmptyRule, errorMessage, { fields, scope: \"global\" });\n};\n\n/**\n * Value is required if ANY of the specified sibling fields is NOT empty\n */\nBaseValidator.prototype.requiredIfAnyNotEmptySiblings = function (\n fields: string[],\n errorMessage?: string,\n) {\n return this.setRequiredRule(requiredIfAnyNotEmptyRule, errorMessage, {\n fields,\n scope: \"sibling\",\n });\n};\n\n/**\n * Value is required if another field's value is in the given array\n */\nBaseValidator.prototype.requiredIfIn = function (\n field: string,\n values: any[],\n errorMessage?: string,\n) {\n return this.setRequiredRule(requiredIfInRule, errorMessage, { field, values, scope: \"global\" });\n};\n\n/**\n * Value is required if another sibling field's value is in the given array\n */\nBaseValidator.prototype.requiredIfInSibling = function (\n field: string,\n values: any[],\n errorMessage?: string,\n) {\n return this.setRequiredRule(requiredIfInRule, errorMessage, { field, values, scope: \"sibling\" });\n};\n\n/**\n * Value is required if another field's value is NOT in the given array\n */\nBaseValidator.prototype.requiredIfNotIn = function (\n field: string,\n values: any[],\n errorMessage?: string,\n) {\n return this.setRequiredRule(requiredIfNotInRule, errorMessage, {\n field,\n values,\n scope: \"global\",\n });\n};\n\n/**\n * Value is required if another sibling field's value is NOT in the given array\n */\nBaseValidator.prototype.requiredIfNotInSibling = function (\n field: string,\n values: any[],\n errorMessage?: string,\n) {\n return this.setRequiredRule(requiredIfNotInRule, errorMessage, {\n field,\n values,\n scope: \"sibling\",\n });\n};\n\n// ==================== REQUIRED: BASED ON MULTIPLE FIELDS (ALL) ====================\n\n/**\n * Value is required if all specified fields exist\n */\nBaseValidator.prototype.requiredWithAll = function (fields: string[], errorMessage?: string) {\n return this.setRequiredRule(requiredWithAllRule, errorMessage, { fields, scope: \"global\" });\n};\n\n/**\n * Value is required if all specified sibling fields exist\n */\nBaseValidator.prototype.requiredWithAllSiblings = function (\n fields: string[],\n errorMessage?: string,\n) {\n return this.setRequiredRule(requiredWithAllRule, errorMessage, { fields, scope: \"sibling\" });\n};\n\n/**\n * Value is required if all specified fields are missing\n */\nBaseValidator.prototype.requiredWithoutAll = function (fields: string[], errorMessage?: string) {\n return this.setRequiredRule(requiredWithoutAllRule, errorMessage, { fields, scope: \"global\" });\n};\n\n/**\n * Value is required if all specified sibling fields are missing\n */\nBaseValidator.prototype.requiredWithoutAllSiblings = function (\n fields: string[],\n errorMessage?: string,\n) {\n return this.setRequiredRule(requiredWithoutAllRule, errorMessage, { fields, scope: \"sibling\" });\n};\n\n// ==================== REQUIRED: BASED ON MULTIPLE FIELDS (ANY) ====================\n\n/**\n * Value is required if any of the specified fields exists\n */\nBaseValidator.prototype.requiredWithAny = function (fields: string[], errorMessage?: string) {\n return this.setRequiredRule(requiredWithAnyRule, errorMessage, { fields, scope: \"global\" });\n};\n\n/**\n * Value is required if any of the specified sibling fields exists\n */\nBaseValidator.prototype.requiredWithAnySiblings = function (\n fields: string[],\n errorMessage?: string,\n) {\n return this.setRequiredRule(requiredWithAnyRule, errorMessage, { fields, scope: \"sibling\" });\n};\n\n/**\n * Value is required if any of the specified fields is missing\n */\nBaseValidator.prototype.requiredWithoutAny = function (fields: string[], errorMessage?: string) {\n return this.setRequiredRule(requiredWithoutAnyRule, errorMessage, { fields, scope: \"global\" });\n};\n\n/**\n * Value is required if any of the specified sibling fields is missing\n */\nBaseValidator.prototype.requiredWithoutAnySiblings = function (\n fields: string[],\n errorMessage?: string,\n) {\n return this.setRequiredRule(requiredWithoutAnyRule, errorMessage, { fields, scope: \"sibling\" });\n};\n\n// ==================== REQUIRED: BASED ON CUSTOM CALLBACK ====================\n\n/**\n * Make this field required based on a custom callback.\n * Callback receives only SchemaContext — the framework handles empty-value checking.\n */\nBaseValidator.prototype.requiredWhen = function (\n callback: (context: SchemaContext) => boolean | Promise<boolean>,\n errorMessage?: string,\n) {\n return this.setRequiredRule(requiredWhenRule, errorMessage, { callback });\n};\n"],"mappings":"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"}
package/llms-full.txt CHANGED
@@ -313,7 +313,7 @@ The `{ isOptional: true }` brand survives chaining (`.optional().min(3)` is stil
313
313
 
314
314
  - It's not needed for conditional rules — `.requiredIf(field, value)` and friends _replace_ the default required-condition slot, so they work standalone.
315
315
 
316
- Conditional variants (run inside `v.object` only):
316
+ Conditional variants (run inside `v.object` only). Without the `Sibling` suffix, the named field is looked up from the ROOT of the validated data; inside a nested object (`address: { en, ar }`) use the `Sibling` variant (`.requiredWithoutSibling("ar")`), or the pair is checked against `ar` at the root:
317
317
 
318
318
  - `.requiredIf(field, value)` / `.requiredIfSibling(field, value)`
319
319
  - `.requiredWith(field)` / `.requiredWithSibling(field)`
package/package.json CHANGED
@@ -23,7 +23,7 @@
23
23
  ],
24
24
  "author": "hassanzohdy",
25
25
  "license": "MIT",
26
- "version": "5.45.0",
26
+ "version": "5.47.0",
27
27
  "main": "./cjs/index.cjs",
28
28
  "module": "./esm/index.mjs",
29
29
  "types": "./esm/index.d.mts",
@@ -82,7 +82,7 @@ The `{ isOptional: true }` brand survives chaining (`.optional().min(3)` is stil
82
82
 
83
83
  - It's not needed for conditional rules — `.requiredIf(field, value)` and friends _replace_ the default required-condition slot, so they work standalone.
84
84
 
85
- Conditional variants (run inside `v.object` only):
85
+ Conditional variants (run inside `v.object` only). Without the `Sibling` suffix, the named field is looked up from the ROOT of the validated data; inside a nested object (`address: { en, ar }`) use the `Sibling` variant (`.requiredWithoutSibling("ar")`), or the pair is checked against `ar` at the root:
86
86
 
87
87
  - `.requiredIf(field, value)` / `.requiredIfSibling(field, value)`
88
88
  - `.requiredWith(field)` / `.requiredWithSibling(field)`