{"version":3,"file":"validateUtil.cjs","sources":["../../../../../../../packages/components/form/src/utils/validateUtil.ts"],"sourcesContent":["import type { InternalNamePath, RuleError, RuleObject, ValidateOptions } from '../interface';\nimport { isValidElement, warning } from '@antdv/utils';\n\nimport RawAsyncValidator from 'async-validator';\nimport { cloneVNode } from 'vue';\nimport { defaultValidateMessages } from './messages';\nimport { setValues } from './valueUtil';\n\n// Remove incorrect original ts define\nconst AsyncValidator: any = RawAsyncValidator;\n\n/**\n * Replace with template.\n *   `I'm ${name}` + { name: 'bamboo' } = I'm bamboo\n */\nfunction replaceMessage(template: string, kv: Record<string, string>): string {\n  return template.replace(/\\$\\{\\w+\\}/g, (str: string) => {\n    const key = str.slice(2, -1);\n    return kv[key];\n  });\n}\n\nasync function validateRule(\n  name: string,\n  value: any,\n  rule: RuleObject,\n  options: ValidateOptions,\n  messageVariables?: Record<string, string>,\n): Promise<string[]> {\n  const cloneRule = { ...rule };\n\n  // Bug of `async-validator`\n  delete (cloneRule as any).ruleIndex;\n  delete (cloneRule as any).trigger;\n\n  // We should special handle array validate\n  let subRuleField: RuleObject = null;\n  if (cloneRule && cloneRule.type === 'array' && cloneRule.defaultField) {\n    subRuleField = cloneRule.defaultField;\n    delete cloneRule.defaultField;\n  }\n\n  const validator = new AsyncValidator({\n    [name]: [cloneRule],\n  });\n\n  const messages = setValues({}, defaultValidateMessages, options.validateMessages);\n  validator.messages(messages);\n\n  let result = [];\n\n  try {\n    await Promise.resolve(validator.validate({ [name]: value }, { ...options }));\n  } catch (errObj: any) {\n    if (errObj.errors) {\n      result = errObj.errors.map(({ message }, index: number) => isValidElement(message) ? cloneVNode(message, { key: `error_${index}` }) : message,\n      );\n    } else {\n      console.error(errObj);\n      result = [(messages.default as () => string)()];\n    }\n  }\n\n  if (!result.length && subRuleField) {\n    const subResults: string[][] = await Promise.all(\n      (value as any[]).map((subValue: any, i: number) => validateRule(`${name}.${i}`, subValue, subRuleField, options, messageVariables),\n      ),\n    );\n\n    return subResults.reduce((prev, errors) => [...prev, ...errors], []);\n  }\n\n  // Replace message with variables\n  const kv = {\n    ...(rule as Record<string, string | number>),\n    name,\n    enum: (rule.enum || []).join(', '),\n    ...messageVariables,\n  };\n\n  const fillVariableResult = result.map((error) => {\n    if (typeof error === 'string')\n      return replaceMessage(error, kv);\n\n    return error;\n  });\n\n  return fillVariableResult;\n}\n\n/**\n * We use `async-validator` to validate the value.\n * But only check one value in a time to avoid namePath validate issue.\n */\nexport function validateRules(\n  namePath: InternalNamePath,\n  value: any,\n  rules: RuleObject[],\n  options: ValidateOptions,\n  validateFirst: boolean | 'parallel',\n  messageVariables?: Record<string, string>,\n) {\n  const name = namePath.join('.');\n\n  // Fill rule with context\n  const filledRules: RuleObject[] = rules\n    .map((currentRule, ruleIndex) => {\n      const originValidatorFunc = currentRule.validator;\n      const cloneRule = {\n        ...currentRule,\n        ruleIndex,\n      };\n\n      // Replace validator if needed\n      if (originValidatorFunc) {\n        cloneRule.validator = (rule: RuleObject, val: any, callback: (error?: string) => void) => {\n          let hasPromise = false;\n\n          // Wrap callback only accept when promise not provided\n          const wrappedCallback = (...args: string[]) => {\n            // Wait a tick to make sure return type is a promise\n            Promise.resolve().then(() => {\n              warning(\n                !hasPromise,\n                'Your validator function has already return a promise. `callback` will be ignored.',\n              );\n\n              if (!hasPromise)\n                callback(...args);\n            });\n          };\n\n          // Get promise\n          const promise = originValidatorFunc(rule, val, wrappedCallback);\n          hasPromise\n            = promise && typeof promise.then === 'function' && typeof promise.catch === 'function';\n\n          /**\n           * 1. Use promise as the first priority.\n           * 2. If promise not exist, use callback with warning instead\n           */\n          warning(hasPromise, '`callback` is deprecated. Please return a promise instead.');\n\n          if (hasPromise) {\n            (promise as Promise<void>)\n              .then(() => {\n                callback();\n              })\n              .catch((err) => {\n                callback(err || ' ');\n              });\n          }\n        };\n      }\n\n      return cloneRule;\n    })\n    .sort(({ warningOnly: w1, ruleIndex: i1 }, { warningOnly: w2, ruleIndex: i2 }) => {\n      if (!!w1 === !!w2) {\n        // Let keep origin order\n        return i1 - i2;\n      }\n\n      if (w1)\n        return 1;\n\n      return -1;\n    });\n\n  // Do validate rules\n  let summaryPromise: Promise<RuleError[]>;\n\n  if (validateFirst === true) {\n    // >>>>> Validate by serialization\n    // eslint-disable-next-line no-async-promise-executor\n    summaryPromise = new Promise(async (resolve, reject) => {\n      for (let i = 0; i < filledRules.length; i += 1) {\n        const rule = filledRules[i];\n        const errors = await validateRule(name, value, rule, options, messageVariables);\n        if (errors.length) {\n          reject([{ errors, rule }]);\n          return;\n        }\n      }\n      resolve([]);\n    });\n  } else {\n    // >>>>> Validate by parallel\n    const rulePromises: Array<Promise<RuleError>> = filledRules.map(rule =>\n      validateRule(name, value, rule, options, messageVariables).then(errors => ({ errors, rule })),\n    );\n\n    summaryPromise = (\n      validateFirst ? finishOnFirstFailed(rulePromises) : finishOnAllFailed(rulePromises)\n    ).then((errors: RuleError[]): RuleError[] | Promise<RuleError[]> => {\n      // Always change to rejection for Field to catch\n      return Promise.reject<RuleError[]>(errors);\n    });\n  }\n\n  // Internal catch error to avoid console error log.\n  summaryPromise.catch(e => e);\n\n  return summaryPromise;\n}\n\nasync function finishOnAllFailed(rulePromises: Array<Promise<RuleError>>): Promise<RuleError[]> {\n  return Promise.all(rulePromises).then(\n    (errorsList: RuleError[]): RuleError[] | Promise<RuleError[]> => {\n      const errors: RuleError[] = [].concat(...errorsList);\n\n      return errors;\n    },\n  );\n}\n\nasync function finishOnFirstFailed(rulePromises: Array<Promise<RuleError>>): Promise<RuleError[]> {\n  let count = 0;\n\n  return new Promise((resolve) => {\n    rulePromises.forEach((promise) => {\n      promise.then((ruleError) => {\n        if (ruleError.errors.length)\n          resolve([ruleError]);\n\n        count += 1;\n        if (count === rulePromises.length)\n          resolve([]);\n      });\n    });\n  });\n}\n"],"names":["messages","setValues","defaultValidateMessages","isValidElement","cloneVNode","warning"],"mappings":"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"}