{"version":3,"file":"number-rules.mjs","names":[],"sources":["../../../../../../../../@warlock.js/seal/src/rules/number/number-rules.ts"],"sourcesContent":["import { get } from \"@mongez/reinforcements\";\r\nimport { invalidRule, VALID_RULE } from \"../../helpers\";\r\nimport type { SchemaRule } from \"../../types\";\r\n\r\n/**\r\n * Min rule - value must be equal or greater than minimum\r\n * Supports field names with sibling scope\r\n */\r\nexport const minRule: SchemaRule<{\r\n  min: number | string;\r\n  scope?: \"global\" | \"sibling\";\r\n}> = {\r\n  name: \"min\",\r\n  defaultErrorMessage: \"The :input must be at least :min\",\r\n  async validate(value: any, context) {\r\n    const { min, scope = \"global\" } = this.context.options;\r\n    let compareMin: number;\r\n\r\n    if (typeof min === \"number\") {\r\n      compareMin = min;\r\n      this.context.translationParams.min = min;\r\n    } else {\r\n      const source = scope === \"sibling\" ? context.parent : context.allValues;\r\n      const fieldValue = get(source, min);\r\n\r\n      if (fieldValue === undefined) {\r\n        return VALID_RULE;\r\n      }\r\n\r\n      this.context.translatableParams.min = min;\r\n\r\n      compareMin = Number(fieldValue);\r\n\r\n      if (isNaN(compareMin)) {\r\n        return VALID_RULE;\r\n      }\r\n    }\r\n\r\n    if (value >= compareMin) {\r\n      return VALID_RULE;\r\n    }\r\n\r\n    return invalidRule(this, context);\r\n  },\r\n};\r\n\r\n/**\r\n * Max rule - value must be equal or less than maximum\r\n * Supports field names with sibling scope\r\n */\r\nexport const maxRule: SchemaRule<{\r\n  max: number | string;\r\n  scope?: \"global\" | \"sibling\";\r\n}> = {\r\n  name: \"max\",\r\n  defaultErrorMessage: \"The :input must equal to or less than :max\",\r\n  async validate(value: any, context) {\r\n    const { max, scope = \"global\" } = this.context.options;\r\n    let compareMax: number;\r\n\r\n    if (typeof max === \"number\") {\r\n      compareMax = max;\r\n      this.context.translationParams.max = max;\r\n    } else {\r\n      const source = scope === \"sibling\" ? context.parent : context.allValues;\r\n      const fieldValue = get(source, max);\r\n\r\n      if (fieldValue === undefined) {\r\n        return VALID_RULE;\r\n      }\r\n\r\n      this.context.translatableParams.max = max;\r\n\r\n      compareMax = Number(fieldValue);\r\n\r\n      if (isNaN(compareMax)) {\r\n        return VALID_RULE;\r\n      }\r\n    }\r\n\r\n    if (value <= compareMax) {\r\n      return VALID_RULE;\r\n    }\r\n\r\n    return invalidRule(this, context);\r\n  },\r\n};\r\n\r\n/**\r\n * Greater than rule - value must be strictly greater than minimum\r\n * Supports field names with sibling scope\r\n */\r\nexport const greaterThanRule: SchemaRule<{\r\n  value: number | string;\r\n  scope?: \"global\" | \"sibling\";\r\n}> = {\r\n  name: \"greaterThan\",\r\n  defaultErrorMessage: \"The :input must be greater than :value\",\r\n  async validate(value: any, context) {\r\n    const { value: compareValue, scope = \"global\" } = this.context.options;\r\n    let compareNumber: number;\r\n\r\n    if (typeof compareValue === \"number\") {\r\n      compareNumber = compareValue;\r\n      this.context.translationParams.value = compareValue;\r\n    } else {\r\n      const source = scope === \"sibling\" ? context.parent : context.allValues;\r\n      const fieldValue = get(source, compareValue);\r\n\r\n      if (fieldValue === undefined) {\r\n        return VALID_RULE;\r\n      }\r\n\r\n      this.context.translatableParams.value = compareValue;\r\n\r\n      compareNumber = Number(fieldValue);\r\n\r\n      if (isNaN(compareNumber)) {\r\n        return VALID_RULE;\r\n      }\r\n    }\r\n\r\n    if (value > compareNumber) {\r\n      return VALID_RULE;\r\n    }\r\n\r\n    return invalidRule(this, context);\r\n  },\r\n};\r\n\r\n/**\r\n * Less than rule - value must be strictly less than maximum\r\n * Supports field names with sibling scope\r\n */\r\nexport const lessThanRule: SchemaRule<{\r\n  value: number | string;\r\n  scope?: \"global\" | \"sibling\";\r\n}> = {\r\n  name: \"lessThan\",\r\n  defaultErrorMessage: \"The :input must be less than :value\",\r\n  async validate(value: any, context) {\r\n    const { value: compareValue, scope = \"global\" } = this.context.options;\r\n    let compareNumber: number;\r\n\r\n    if (typeof compareValue === \"number\") {\r\n      compareNumber = compareValue;\r\n      this.context.translationParams.value = compareValue;\r\n    } else {\r\n      const source = scope === \"sibling\" ? context.parent : context.allValues;\r\n      const fieldValue = get(source, compareValue);\r\n\r\n      if (fieldValue === undefined) {\r\n        return VALID_RULE;\r\n      }\r\n\r\n      this.context.translatableParams.value = compareValue;\r\n\r\n      compareNumber = Number(fieldValue);\r\n\r\n      if (isNaN(compareNumber)) {\r\n        return VALID_RULE;\r\n      }\r\n    }\r\n\r\n    if (value < compareNumber) {\r\n      return VALID_RULE;\r\n    }\r\n\r\n    return invalidRule(this, context);\r\n  },\r\n};\r\n\r\n/**\r\n * Positive rule - value must be greater than 0\r\n */\r\nexport const positiveRule: SchemaRule = {\r\n  name: \"positive\",\r\n  defaultErrorMessage: \"The :input must be a positive number\",\r\n  async validate(value: any, context) {\r\n    if (value > 0) {\r\n      return VALID_RULE;\r\n    }\r\n\r\n    return invalidRule(this, context);\r\n  },\r\n};\r\n\r\n/**\r\n * Negative rule - value must be less than 0\r\n */\r\nexport const negativeRule: SchemaRule = {\r\n  name: \"negative\",\r\n  defaultErrorMessage: \"The :input must be a negative number\",\r\n  async validate(value: any, context) {\r\n    if (value < 0) {\r\n      return VALID_RULE;\r\n    }\r\n\r\n    return invalidRule(this, context);\r\n  },\r\n};\r\n\r\n/**\r\n * Odd rule - value must be an odd number\r\n */\r\nexport const oddRule: SchemaRule = {\r\n  name: \"odd\",\r\n  defaultErrorMessage: \"The :input must be an odd number\",\r\n  async validate(value: any, context) {\r\n    if (value % 2 !== 0) {\r\n      return VALID_RULE;\r\n    }\r\n\r\n    return invalidRule(this, context);\r\n  },\r\n};\r\n\r\n/**\r\n * Even rule - value must be an even number\r\n */\r\nexport const evenRule: SchemaRule = {\r\n  name: \"even\",\r\n  defaultErrorMessage: \"The :input must be an even number\",\r\n  async validate(value: any, context) {\r\n    if (value % 2 === 0) {\r\n      return VALID_RULE;\r\n    }\r\n\r\n    return invalidRule(this, context);\r\n  },\r\n};\r\n\r\n/**\r\n * Modulo rule - value must be divisible by given number\r\n */\r\nexport const moduloRule: SchemaRule<{ value: number }> = {\r\n  name: \"modulo\",\r\n  defaultErrorMessage: \"The :input must be divisible by :value\",\r\n  async validate(value: any, context) {\r\n    if (value % this.context.options.value === 0) {\r\n      return VALID_RULE;\r\n    }\r\n\r\n    this.context.translationParams.value = this.context.options.value;\r\n\r\n    return invalidRule(this, context);\r\n  },\r\n};\r\n\r\n/**\r\n * Between rule - value must be between the given two numbers (Inclusive)\r\n * Supports field names with sibling scope\r\n */\r\nexport const betweenNumbersRule: SchemaRule<{\r\n  min: number | string;\r\n  max: number | string;\r\n  scope?: \"global\" | \"sibling\";\r\n}> = {\r\n  name: \"betweenNumbers\",\r\n  defaultErrorMessage: \"The :input must be between :min and :max\",\r\n  async validate(value: any, context) {\r\n    const { min, max, scope = \"global\" } = this.context.options;\r\n\r\n    // Extract min value\r\n    let compareMin: number;\r\n    if (typeof min === \"number\") {\r\n      compareMin = min;\r\n      this.context.translationParams.min = min;\r\n    } else {\r\n      const source = scope === \"sibling\" ? context.parent : context.allValues;\r\n      const fieldValue = get(source, min);\r\n\r\n      if (fieldValue === undefined) {\r\n        return VALID_RULE;\r\n      }\r\n\r\n      this.context.translatableParams.min = min;\r\n\r\n      compareMin = Number(fieldValue);\r\n      if (isNaN(compareMin)) {\r\n        return VALID_RULE;\r\n      }\r\n    }\r\n\r\n    // Extract max value\r\n    let compareMax: number;\r\n    if (typeof max === \"number\") {\r\n      compareMax = max;\r\n      this.context.translationParams.max = max;\r\n    } else {\r\n      const source = scope === \"sibling\" ? context.parent : context.allValues;\r\n      const fieldValue = get(source, max);\r\n\r\n      if (fieldValue === undefined) {\r\n        return VALID_RULE;\r\n      }\r\n\r\n      this.context.translatableParams.max = max;\r\n\r\n      compareMax = Number(fieldValue);\r\n      if (isNaN(compareMax)) {\r\n        return VALID_RULE;\r\n      }\r\n    }\r\n\r\n    if (value >= compareMin && value <= compareMax) {\r\n      return VALID_RULE;\r\n    }\r\n\r\n    return invalidRule(this, context);\r\n  },\r\n};\r\n"],"mappings":"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"}