{"version":3,"sources":["../src/zod.ts"],"names":["node"],"mappings":"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","file":"index.dev.mjs","sourcesContent":["import { FormKitNode, FormKitPlugin, createMessage } from '@formkit/core'\nimport { z } from 'zod'\n\n/**\n * Extend FormKitNode with setZodErrors.\n */\ndeclare module '@formkit/core' {\n  interface FormKitNodeExtensions {\n    setZodErrors(zodError: z.ZodError | undefined): FormKitNode\n  }\n}\n\nfunction 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 * Creates a new Zod schema plugin for form validation.\n *\n * @param zodSchema - A Zod schema to validate the form against.\n * @param submitCallback - A callback to run when the form is submitted and it passes validation.\n *\n * @returns A tuple of a {@link @formkit/core#FormKitPlugin | FormKitPlugin} and a submit handler.\n *\n * @public\n */\nexport function createZodPlugin<Z extends z.ZodTypeAny>(\n  zodSchema: Z,\n  submitCallback: (\n    payload: z.infer<typeof zodSchema>,\n    node: FormKitNode | undefined\n  ) => void | Promise<void>\n): [FormKitPlugin, (payload: any, node: FormKitNode | undefined) => void] {\n  const zodValidationSet = new Set<FormKitNode>()\n  const zodValidationListeners = new Map<FormKitNode, string>()\n  // The Zod plugin — maps zod schema to validation rules on\n  // matching FormKit nodes.\n  const zodPlugin = (node: FormKitNode) => {\n    if (node.props.type !== 'form') return false\n\n    node.ledger.count('existingValidation', (message) => {\n      if (message.type === 'validation' || message.type === 'error') {\n        return !message.key.endsWith(':zod')\n      }\n      return false\n    })\n\n    node.on('created', () => {\n      node.extend('setZodErrors', {\n        get: (node) => async (zodError: z.ZodError) => {\n          if (!zodError) return\n          await node.settled\n          const [formErrors, fieldErrors] = zodErrorToFormKitErrors(\n            zodError,\n            node\n          )\n          node.setErrors(fieldErrors, formErrors)\n        },\n        set: false,\n      })\n    })\n\n    node.on('destroyed', () => {\n      zodValidationSet.clear()\n      zodValidationListeners.clear()\n    })\n\n    let commitTimout: ReturnType<typeof setTimeout> | number = 0\n    let start = Date.now()\n    node.on('commit', ({ payload }) => {\n      clearTimeout(commitTimout)\n      const now = Date.now()\n      // perform at least every 600ms\n      if (now - start > 600) {\n        start = now\n        performZodValidation(payload, node)\n      }\n      // also perform after 150ms of no commits\n      commitTimout = setTimeout(() => {\n        performZodValidation(payload, node)\n      }, 150)\n    })\n\n    node.on('message-added', (message) => {\n      if (\n        message.payload.type === 'state' &&\n        message.payload.key === 'submitted'\n      ) {\n        // perform validation on submit so that check\n        // for form level errors can be done\n        performZodValidation(node.value, node)\n      }\n    })\n\n    return false\n  }\n\n  function performZodValidation(payload: any, node: FormKitNode) {\n    const zodResults = zodSchema.safeParse(payload)\n    if (!zodResults.success) {\n      setFormValidations(zodResults.error, node)\n    } else {\n      zodValidationSet.forEach((node) => {\n        node.store.remove(`${node.address.slice(1).join('.')}:zod`)\n        const receipt = zodValidationListeners.get(node)\n        node.off(receipt as string)\n        zodValidationListeners.delete(node)\n      })\n      zodValidationSet.clear()\n    }\n  }\n\n  // The submit handler — validates the payload against the zod schema\n  // and then passes the data to the user's submit callback.\n  async function submitHandler(payload: any, node?: FormKitNode | undefined) {\n    const zodResults = await zodSchema.safeParseAsync(payload)\n    if (!zodResults.success) {\n      setFormValidations(zodResults.error, node)\n    } else {\n      await submitCallback(zodResults.data, node)\n    }\n  }\n\n  // Sets the form errors on the correct nodes.\n  function setFormValidations(\n    zodErrors: z.ZodError,\n    node?: FormKitNode | undefined\n  ) {\n    if (!node) return\n    const [formErrors, InputErrors] = zodErrorToFormKitErrors(zodErrors, node)\n    const oldZodValidationSet = new Set(zodValidationSet)\n    Object.entries(InputErrors).map((issue) => {\n      const [path, message] = issue\n      const targetNode = node.at(path)\n      if (targetNode) {\n        oldZodValidationSet.delete(targetNode)\n        const existingValidationCount =\n          targetNode.ledger.value('existingValidation')\n        if (existingValidationCount === 0) {\n          if (!targetNode.store[`${path}:zod`]) {\n            const validationListener = targetNode.on(\n              'unsettled:existingValidation',\n              () => {\n                targetNode.store.remove(`${path}:zod`)\n                zodValidationSet.delete(targetNode)\n              }\n            )\n            zodValidationListeners.set(targetNode, validationListener)\n          }\n\n          targetNode.store.set(\n            /* #__PURE__ */ createMessage({\n              blocking: true,\n              type: 'validation',\n              key: `${path}:zod`,\n              value: message,\n              meta: {\n                i18nArgs: [\n                  {\n                    node: targetNode,\n                    name: createMessageName(targetNode),\n                    args: [issue],\n                  },\n                ],\n                messageKey: 'zod',\n              },\n            })\n          )\n          zodValidationSet.add(targetNode)\n        }\n      }\n    })\n\n    // on submit, all remaining errors are global errors\n    if (node?.context?.state.submitted) {\n      node.setErrors([], formErrors)\n    }\n\n    oldZodValidationSet.forEach((node) => {\n      node.store.remove(`${node.address.slice(1).join('.')}:zod`)\n      zodValidationSet.delete(node)\n    })\n  }\n\n  function zodErrorToFormKitErrors(\n    zodError: z.ZodError,\n    node: FormKitNode\n  ): [string[], Record<string, string>] {\n    const fieldErrors: Record<string, string> = {}\n    const formErrors: string[] = []\n    zodError.issues.forEach((error) => {\n      const path = error.path.join('.')\n      const targetNode = node.at(path)\n      if (targetNode) {\n        if (!fieldErrors[path]) {\n          fieldErrors[path] = error.message\n        }\n      } else {\n        formErrors.push(`${path}: ${error.message}`)\n      }\n    })\n    return [formErrors, fieldErrors]\n  }\n\n  return [zodPlugin, submitHandler]\n}\n"]}