{"version":3,"sources":["../src/validation.ts"],"names":["validation","node","hints"],"mappings":"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","file":"index.mjs","sourcesContent":["import { FormKitNode, FormKitMessage, createMessage } from '@formkit/core'\nimport {\n  FormKitObservedNode,\n  createObserver,\n  applyListeners,\n  diffDeps,\n  removeListeners,\n  FormKitDependencies,\n  isKilled,\n} from '@formkit/observer'\nimport { has, empty, token, clone, cloneAny, eq } from '@formkit/utils'\n\n/**\n * Special validation properties that affect the way validations are applied.\n *\n * @public\n */\nexport interface FormKitValidationHints {\n  /**\n   * If this validation fails, should it block the form from being submitted or\n   * considered \"valid\"? There are some cases where it is acceptable to allow\n   * an incorrect value to still be allowed to submit.\n   */\n  blocking: boolean\n  /**\n   * Only run this rule after this many milliseconds of debounce. This is\n   * particularity helpful for more \"expensive\" async validation rules like\n   * checking if a username is taken from the backend.\n   */\n  debounce: number\n  /**\n   * Normally the first validation rule to fail blocks other rules from running\n   * if this flag is flipped to true, this rule will be run every time even if\n   * a previous rule in the validation stack failed.\n   */\n  force: boolean\n  /**\n   * Most validation rules are not run when the input is empty, but this flag\n   * allows that behavior to be changed.\n   */\n  skipEmpty: boolean\n  /**\n   * The actual name of the validation rule.\n   */\n  name: string\n}\n\n/**\n * Defines what fully parsed validation rules look like.\n * @public\n */\nexport type FormKitValidation = {\n  /**\n   * The actual rule function that will be called\n   */\n  rule: FormKitValidationRule\n  /**\n   * Arguments to be passed to the validation rule\n   */\n  args: any[]\n  /**\n   * The debounce timer for this input.\n   */\n  timer: number\n  /**\n   * The state of a validation, can be true, false, or null which means unknown.\n   */\n  state: boolean | null\n  /**\n   * Determines if the rule should be considered for the next run cycle. This\n   * does not mean the rule will be validated, it just means that it should be\n   * considered.\n   */\n  queued: boolean\n  /**\n   * Dependencies this validation rule is observing.\n   */\n  deps: FormKitDependencies\n  /**\n   * The observed node that is being validated.\n   */\n  observer: FormKitObservedNode\n  /**\n   * An observer that updates validation messages when it’s dependencies change,\n   * for example, the label of the input.\n   */\n  messageObserver?: FormKitObservedNode\n} & FormKitValidationHints\n\n/**\n * Defines what validation rules look like when they are parsed, but have not\n * necessarily had validation rules substituted in yet.\n * @public\n */\nexport type FormKitValidationIntent = [string | FormKitValidationRule, ...any[]]\n\n/**\n * Signature for a generic validation rule. It accepts an input — often a string\n * — but should be able to accept any input type, and returns a boolean\n * indicating whether or not it passed validation.\n * @public\n */\nexport type FormKitValidationRule = {\n  (node: FormKitNode, ...args: any[]): boolean | Promise<boolean>\n  ruleName?: string\n} & Partial<FormKitValidationHints>\n\n/**\n * A validation rule result.\n * @public\n */\nexport interface FormKitValidationRuleResult {\n  result: boolean\n  validation: FormKitValidation\n}\n\n/**\n * FormKit validation rules are structured as on object of key/function pairs\n * where the key of the object is the validation rule name.\n * @public\n */\nexport interface FormKitValidationRules {\n  [index: string]: FormKitValidationRule\n}\n\n/**\n * The interface for the localized validation message function.\n * @public\n */\nexport interface FormKitValidationMessage {\n  (...args: FormKitValidationI18NArgs): string\n}\n\n/**\n * The interface for the localized validation message registry.\n * @public\n */\nexport interface FormKitValidationMessages {\n  [index: string]: string | FormKitValidationMessage\n}\n\n/**\n * Determines the validation nonce.\n * @public\n */\ninterface FormKitValidationState {\n  input: string | null\n  rerun: number | null\n  isPassing: boolean\n}\n\n/**\n * The arguments that are passed to the validation messages in the i18n plugin.\n *\n * @public\n */\nexport type FormKitValidationI18NArgs = [\n  {\n    node: FormKitNode\n    name: string\n    args: any[]\n    message?: string\n  }\n]\n\n/**\n * Message that gets set when the node is awaiting validation.\n */\nconst validatingMessage = /* #__PURE__ */ createMessage({\n  type: 'state',\n  blocking: true,\n  visible: false,\n  value: true,\n  key: 'validating',\n})\n\n/**\n * The actual validation plugin function. Everything must be bootstrapped here.\n *\n * @param baseRules - Base validation rules to include in the plugin. By default,\n * FormKit makes all rules in the \\@formkit/rules package available via the\n * defaultConfig.\n *\n * @public\n */\nexport function createValidationPlugin(baseRules: FormKitValidationRules = {}) {\n  return function validationPlugin(node: FormKitNode): void {\n    let propRules = cloneAny(node.props.validationRules || {})\n    let availableRules = { ...baseRules, ...propRules }\n    // create an observed node\n    const state = { input: token(), rerun: null, isPassing: true }\n    let validation = cloneAny(node.props.validation)\n    // If the node's validation props change, reboot:\n    node.on('prop:validation', ({ payload }) => reboot(payload, propRules))\n    node.on('prop:validationRules', ({ payload }) =>\n      reboot(validation, payload)\n    )\n    /**\n     * Reboots the validation using new rules or declarations/intents.\n     * @param newValidation - New validation declaration to use\n     * @param newRules - New validation rules to use\n     * @returns\n     */\n    function reboot(\n      newValidation: undefined | string | FormKitValidationIntent[],\n      newRules: FormKitValidationRules\n    ) {\n      if (\n        eq(Object.keys(propRules || {}), Object.keys(newRules || {})) &&\n        eq(validation, newValidation)\n      )\n        return\n      propRules = cloneAny(newRules)\n      validation = cloneAny(newValidation)\n      availableRules = { ...baseRules, ...propRules }\n      // Destroy all observers that may re-trigger validation on an old stack\n      // Clear existing message observers\n      node.props.parsedRules?.forEach((validation: FormKitValidation) => {\n        removeMessage(validation)\n        removeListeners(validation.observer.receipts)\n        validation.observer.kill()\n      })\n      // Remove all existing messages before re-validating\n      node.store.filter(() => false, 'validation')\n      node.props.parsedRules = parseRules(newValidation, availableRules, node)\n      state.isPassing = true\n      validate(node, node.props.parsedRules, state)\n    }\n\n    // Validate the field when this plugin is initialized\n    node.props.parsedRules = parseRules(validation, availableRules, node)\n    validate(node, node.props.parsedRules, state)\n  }\n}\n\n/**\n * Given parsed validations, a value and a node, run the validations and set\n * the appropriate store messages on the node.\n * @param value - The value being validated\n * @param node - The Node this value belongs to\n * @param rules - The rules\n */\nfunction validate(\n  node: FormKitNode | FormKitObservedNode,\n  validations: FormKitValidation[],\n  state: FormKitValidationState\n) {\n  if (isKilled(node)) return\n  state.input = token()\n  node.store.set(\n    /* #__PURE__ */ createMessage({\n      key: 'failing',\n      value: !state.isPassing,\n      visible: false,\n    })\n  )\n  state.isPassing = true\n  node.store.filter((message) => !message.meta.removeImmediately, 'validation')\n  validations.forEach(\n    (validation) => validation.debounce && clearTimeout(validation.timer)\n  )\n  if (validations.length) {\n    node.store.set(validatingMessage)\n    run(0, validations, state, false, () => {\n      node.store.remove(validatingMessage.key)\n      node.store.set(\n        /* #__PURE__ */ createMessage({\n          key: 'failing',\n          value: !state.isPassing,\n          visible: false,\n        })\n      )\n    })\n  }\n}\n\n/**\n * Runs validation rules recursively while collecting dependencies allowing for\n * cross-node validation rules that automatically re-trigger when a foreign\n * value is changed.\n * @param current - The index of the current validation rule\n * @param validations - The remaining validation rule stack to run\n * @param node - An observed node, the owner of this validation stack\n * @param state - An object of state information about this run\n * @param removeImmediately - Should messages created during this call be removed immediately when a new commit takes place?\n * @returns\n */\nfunction run(\n  current: number,\n  validations: FormKitValidation[],\n  state: FormKitValidationState,\n  removeImmediately: boolean,\n  complete: () => void\n): void {\n  const validation = validations[current]\n  if (!validation) return complete()\n  const node = validation.observer\n  if (isKilled(node)) return\n  const currentRun = state.input\n  validation.state = null\n\n  function next(async: boolean, result: boolean | null): void {\n    if (state.input !== currentRun) return\n    state.isPassing = state.isPassing && !!result\n    validation.queued = false\n    const newDeps = node.stopObserve()\n    const diff = diffDeps(validation.deps, newDeps)\n    applyListeners(\n      node,\n      diff,\n      function revalidate() {\n        // Event callback for when the deps change:\n        try {\n          node.store.set(validatingMessage)\n        } catch (e) {}\n        validation.queued = true\n        if (state.rerun) clearTimeout(state.rerun)\n        state.rerun = setTimeout(\n          validate,\n          0,\n          node,\n          validations,\n          state\n        ) as unknown as number\n      },\n      'unshift' // We want these listeners to run before other events are emitted so the 'state.validating' will be reliable.\n    )\n    validation.deps = newDeps\n\n    validation.state = result\n    if (result === false) {\n      createFailedMessage(validation, removeImmediately || async)\n    } else {\n      removeMessage(validation)\n    }\n    if (validations.length > current + 1) {\n      const nextValidation = validations[current + 1]\n      if (\n        (result || nextValidation.force || !nextValidation.skipEmpty) &&\n        nextValidation.state === null\n      ) {\n        // If the next rule was never run then it has not been observed so it could never\n        // run again on its own.\n        nextValidation.queued = true\n      }\n      run(current + 1, validations, state, removeImmediately || async, complete)\n    } else {\n      // The validation has completed\n      complete()\n    }\n  }\n  if (\n    (!empty(node.value) || !validation.skipEmpty) &&\n    (state.isPassing || validation.force)\n  ) {\n    if (validation.queued) {\n      runRule(validation, node, (result: boolean | Promise<boolean>) => {\n        result instanceof Promise\n          ? result.then((r) => next(true, r))\n          : next(false, result)\n      })\n    } else {\n      // In this case our rule is not queued, so literally nothing happened that\n      // would affect it, we just need to move past this rule and make no\n      // modifications to state\n      run(current + 1, validations, state, removeImmediately, complete)\n    }\n  } else if (empty(node.value) && validation.skipEmpty && state.isPassing) {\n    // This rule is not run because it is empty — the previous rule passed so normally we would run this rule\n    // but in this case we cannot because it is empty. The node being empty is the only condition by which\n    // this rule is not run, so the only dep at this point to the the value of the node.\n    node.observe()\n    node.value\n    next(false, state.isPassing)\n  } else {\n    // This rule is not being run because a previous validation rule is failing and this one is not forced\n    // In this case we should call next validation — a `null` result here explicitly means the rule was not run.\n    next(false, null)\n  }\n}\n\n/**\n * Run a validation rule debounced or not.\n * @param validation - A validation to debounce\n */\nfunction runRule(\n  validation: FormKitValidation,\n  node: FormKitObservedNode,\n  after: (result: boolean | Promise<boolean>) => void\n) {\n  if (validation.debounce) {\n    validation.timer = setTimeout(() => {\n      node.observe()\n      after(validation.rule(node, ...validation.args))\n    }, validation.debounce) as unknown as number\n  } else {\n    node.observe()\n    after(validation.rule(node, ...validation.args))\n  }\n}\n\n/**\n * The messages given to this function have already been set on the node, but\n * any other validation messages on the node that are not included in this\n * stack should be removed because they have been resolved.\n * @param node - The node to operate on.\n * @param messages - A new stack of messages\n */\nfunction removeMessage(validation: FormKitValidation) {\n  const key = `rule_${validation.name}`\n  if (validation.messageObserver) {\n    validation.messageObserver = validation.messageObserver.kill()\n  }\n  if (has(validation.observer.store, key)) {\n    validation.observer.store.remove(key)\n  }\n}\n\n/**\n *\n * @param value - The value that is failing\n * @param validation - The validation object\n */\nfunction createFailedMessage(\n  validation: FormKitValidation,\n  removeImmediately: boolean\n): void {\n  const node = validation.observer\n  if (isKilled(node)) return\n\n  if (!validation.messageObserver) {\n    validation.messageObserver = createObserver(node._node)\n  }\n  validation.messageObserver.watch(\n    (node) => {\n      const i18nArgs: FormKitValidationI18NArgs = createI18nArgs(\n        node,\n        validation\n      )\n      return i18nArgs\n    },\n    (i18nArgs) => {\n      const customMessage = createCustomMessage(node, validation, i18nArgs)\n      // Here we short circuit the i18n system to force the output.\n      const message = /* #__PURE__ */ createMessage({\n        blocking: validation.blocking,\n        key: `rule_${validation.name}`,\n        meta: {\n          /**\n           * Use this key instead of the message root key to produce i18n validation\n           * messages.\n           */\n          messageKey: validation.name,\n          /**\n           * For messages that were created *by or after* a debounced or async\n           * validation rule — we make note of it so we can immediately remove them\n           * as soon as the next commit happens.\n           */\n          removeImmediately,\n          /**\n           * Determines if this message should be passed to localization.\n           */\n          localize: !customMessage,\n          /**\n           * The arguments that will be passed to the validation rules\n           */\n          i18nArgs,\n        },\n        type: 'validation',\n        value: customMessage || 'This field is not valid.',\n      })\n      node.store.set(message)\n    }\n  )\n}\n\n/**\n * Returns a custom validation message if applicable.\n * @param node - FormKit Node\n * @param validation - The validation rule being processed.\n */\nfunction createCustomMessage(\n  node: FormKitNode,\n  validation: FormKitValidation,\n  i18nArgs: FormKitValidationI18NArgs\n): string | undefined {\n  const customMessage =\n    node.props.validationMessages &&\n    has(node.props.validationMessages, validation.name)\n      ? node.props.validationMessages[validation.name]\n      : undefined\n  if (typeof customMessage === 'function') {\n    return customMessage(...i18nArgs)\n  }\n  return customMessage\n}\n\n/**\n * Creates the arguments passed to the i18n\n * @param node - The node that performed the validation\n * @param validation - The validation that failed\n */\nfunction createI18nArgs(\n  node: FormKitNode,\n  validation: FormKitValidation\n): FormKitValidationI18NArgs {\n  // If a custom message has been found, short circuit the i18n system.\n  return [\n    {\n      node,\n      name: createMessageName(node),\n      args: validation.args,\n    },\n  ]\n}\n\n/**\n * Given a node, this returns the name that should be used in validation\n * messages. This is either the `validationLabel` prop, the `label` prop, or\n * the name of the input (in that order).\n * @param node - The node to display\n * @returns\n * @public\n */\nexport function createMessageName(node: FormKitNode): string {\n  if (typeof node.props.validationLabel === 'function') {\n    return node.props.validationLabel(node)\n  }\n  return (\n    node.props.validationLabel ||\n    node.props.label ||\n    node.props.name ||\n    String(node.name)\n  )\n}\n\n/**\n * Describes hints, must also be changed in the debounceExtractor.\n */\nconst hintPattern = '(?:[\\\\*+?()0-9]+)'\n\n/**\n * A pattern to describe rule names. Rules names can only contain letters,\n * numbers, and underscores and must start with a letter.\n */\nconst rulePattern = '[a-zA-Z][a-zA-Z0-9_]+'\n\n/**\n * Regular expression for extracting rule data.\n */\nconst ruleExtractor = new RegExp(\n  `^(${hintPattern}?${rulePattern})(?:\\\\:(.*)+)?$`,\n  'i'\n)\n\n/**\n * Validation hints are special characters preceding a validation rule, like\n * !phone\n */\nconst hintExtractor = new RegExp(`^(${hintPattern})(${rulePattern})$`, 'i')\n\n/**\n * Given a hint string like ^(200)? or ^? or (200)?^ extract the hints to\n * matches.\n */\nconst debounceExtractor = /([\\*+?]+)?(\\(\\d+\\))([\\*+?]+)?/\n\n/**\n * Determines if a given string is in the proper debounce format.\n */\nconst hasDebounce = /\\(\\d+\\)/\n\n/**\n * The default values of the available validation hints.\n */\nexport const defaultHints: FormKitValidationHints = {\n  blocking: true,\n  debounce: 0,\n  force: false,\n  skipEmpty: true,\n  name: '',\n}\n\n/**\n * Parse validation intents and strings into validation rule stacks.\n * @param validation - Either a string a validation rules, or proper array of structured rules.\n * @internal\n */\nexport function parseRules(\n  validation: undefined | string | FormKitValidationIntent[],\n  rules: FormKitValidationRules,\n  node: FormKitNode\n): FormKitValidation[] {\n  if (!validation) return []\n  const intents =\n    typeof validation === 'string'\n      ? extractRules(validation)\n      : clone(validation)\n  return intents.reduce((validations, args) => {\n    let rule = args.shift() as string | FormKitValidationRule\n    const hints = {}\n    if (typeof rule === 'string') {\n      const [ruleName, parsedHints] = parseHints(rule)\n      if (has(rules, ruleName)) {\n        rule = rules[ruleName]\n        Object.assign(hints, parsedHints)\n      }\n    }\n    if (typeof rule === 'function') {\n      validations.push({\n        observer: createObserver(node),\n        rule,\n        args,\n        timer: 0,\n        state: null,\n        queued: true,\n        deps: new Map(),\n        ...defaultHints,\n        ...fnHints(hints, rule),\n      })\n    }\n    return validations\n  }, [] as FormKitValidation[])\n}\n\n/**\n * A string of validation rules written in FormKitRule notation.\n * @param validation - The string of rules\n * @internal\n */\nfunction extractRules(validation: string): FormKitValidationIntent[] {\n  return validation.split('|').reduce((rules, rule) => {\n    const parsedRule = parseRule(rule)\n    if (parsedRule) {\n      rules.push(parsedRule)\n    }\n    return rules\n  }, [] as FormKitValidationIntent[])\n}\n\n/**\n * Given a rule like confirm:password_confirm produce a FormKitValidationIntent\n * @param rule - A string representing a validation rule.\n * @returns\n */\nfunction parseRule(rule: string): FormKitValidationIntent | false {\n  const trimmed = rule.trim()\n  if (trimmed) {\n    const matches = trimmed.match(ruleExtractor)\n    if (matches && typeof matches[1] === 'string') {\n      const ruleName = matches[1].trim()\n      const args =\n        matches[2] && typeof matches[2] === 'string'\n          ? matches[2].split(',').map((s) => s.trim())\n          : []\n      return [ruleName, ...args]\n    }\n  }\n  return false\n}\n\n/**\n * Given a rule name, detect if there are any additional hints like !\n * @param ruleName - string representing a rule name\n * @returns\n */\nfunction parseHints(\n  ruleName: string\n): [string, Partial<FormKitValidationHints>] {\n  const matches = ruleName.match(hintExtractor)\n  if (!matches) {\n    return [ruleName, { name: ruleName }]\n  }\n  const map: { [index: string]: Partial<FormKitValidationHints> } = {\n    '*': { force: true },\n    '+': { skipEmpty: false },\n    '?': { blocking: false },\n  }\n  const [, hints, rule] = matches\n  const hintGroups = hasDebounce.test(hints)\n    ? hints.match(debounceExtractor) || []\n    : [, hints]\n  return [\n    rule,\n    [hintGroups[1], hintGroups[2], hintGroups[3]].reduce(\n      (hints: Partial<FormKitValidationHints>, group: string | undefined) => {\n        if (!group) return hints\n        if (hasDebounce.test(group)) {\n          hints.debounce = parseInt(group.substr(1, group.length - 1))\n        } else {\n          group\n            .split('')\n            .forEach(\n              (hint) => has(map, hint) && Object.assign(hints, map[hint])\n            )\n        }\n        return hints\n      },\n      { name: rule } as Partial<FormKitValidationHints>\n    ),\n  ]\n}\n\n/**\n * Extracts hint properties from the validation rule function itself and applies\n * them if they are not already in the set of validation hints extracted from\n * strings.\n * @param existingHints - An existing set of hints already parsed\n * @param rule - The actual rule function, which can contain hint properties\n * @returns\n */\nfunction fnHints(\n  existingHints: Partial<FormKitValidationHints>,\n  rule: FormKitValidationRule\n) {\n  if (!existingHints.name) {\n    existingHints.name = rule.ruleName || rule.name\n  }\n  return ['skipEmpty', 'force', 'debounce', 'blocking'].reduce(\n    (hints: Partial<FormKitValidationHints>, hint: string) => {\n      if (has(rule, hint) && !has(hints, hint)) {\n        Object.assign(hints, {\n          [hint]: rule[hint as keyof FormKitValidationHints],\n        })\n      }\n      return hints\n    },\n    existingHints\n  )\n}\n\n/**\n * Extracts all validation messages from the given node and all its descendants.\n * This is not reactive and must be re-called each time the messages change.\n * @param node - The FormKit node to extract validation rules from — as well as its descendants.\n * @public\n */\nexport function getValidationMessages(\n  node: FormKitNode\n): Map<FormKitNode, FormKitMessage[]> {\n  const messages: Map<FormKitNode, FormKitMessage[]> = new Map()\n  const extract = (n: FormKitNode) => {\n    const nodeMessages = []\n    for (const key in n.store) {\n      const message = n.store[key]\n      if (\n        message.type === 'validation' &&\n        message.visible &&\n        typeof message.value === 'string'\n      ) {\n        nodeMessages.push(message)\n      }\n    }\n    if (nodeMessages.length) {\n      messages.set(n, nodeMessages)\n    }\n    return n\n  }\n  extract(node).walk(extract)\n  return messages\n}\n"]}