{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "fillout-flow-submission",
  "title": "Fillout Flow Submission",
  "description": "Helpers for serializing custom-flow answers back into Fillout submission payloads.",
  "registryDependencies": [
    "@blocks/fillout-flow-schema"
  ],
  "files": [
    {
      "path": "registry/berlin/blocks/fillout-flow/submission.ts",
      "content": "// Generated from packages/ui/src/components/fillout-flow/submission.ts\nimport { hasFilloutValue } from \"@/registry/berlin/blocks/fillout-flow-schema\";\nimport type {\n  FilloutAnswerValue,\n  FilloutFlowDefinition,\n  FilloutFlowValues,\n  FilloutSubmissionPayload,\n  FilloutSubmissionQuestion,\n  FilloutSubmissionUrlParameter,\n  FilloutUrlParameterInput,\n} from \"@/registry/berlin/blocks/fillout-flow-types\";\n\nfunction normalizeAnswerValue(\n  value: FilloutAnswerValue | undefined,\n): FilloutAnswerValue | null {\n  if (!hasFilloutValue(value)) {\n    return null;\n  }\n\n  if (typeof value === \"string\") {\n    return value.trim();\n  }\n\n  if (!Array.isArray(value)) {\n    return null;\n  }\n\n  const items = value\n    .map((entry) => entry.trim())\n    .filter((entry) => entry.length > 0);\n\n  return items.length > 0 ? items : null;\n}\n\nfunction resolveUrlParameters(\n  flow: FilloutFlowDefinition,\n  urlParameters: FilloutUrlParameterInput | undefined,\n) {\n  if (!urlParameters) {\n    return [] as FilloutSubmissionUrlParameter[];\n  }\n\n  if (Array.isArray(urlParameters)) {\n    return urlParameters.flatMap((entry) => {\n      if (entry.value == null || `${entry.value}`.trim().length === 0) {\n        return [];\n      }\n\n      const configured =\n        flow.urlParameters.find((parameter) => parameter.id === entry.id) ??\n        flow.urlParameters.find((parameter) => parameter.name === entry.id);\n\n      return [\n        {\n          id: configured?.id ?? entry.id,\n          name: entry.name ?? configured?.name ?? entry.id,\n          value: `${entry.value}`,\n        },\n      ];\n    });\n  }\n\n  return Object.entries(urlParameters).flatMap(([key, value]) => {\n    if (value == null || `${value}`.trim().length === 0) {\n      return [];\n    }\n\n    const configured =\n      flow.urlParameters.find((parameter) => parameter.id === key) ??\n      flow.urlParameters.find((parameter) => parameter.name === key);\n\n    return [\n      {\n        id: configured?.id ?? key,\n        name: configured?.name ?? key,\n        value: `${value}`,\n      },\n    ];\n  });\n}\n\nexport function buildFilloutSubmissionQuestions(\n  flow: FilloutFlowDefinition,\n  values: FilloutFlowValues,\n) {\n  const seen = new Set<string>();\n  const questions: FilloutSubmissionQuestion[] = [];\n\n  for (const step of flow.steps) {\n    for (const field of step.fields) {\n      if (seen.has(field.id)) {\n        continue;\n      }\n\n      seen.add(field.id);\n\n      const value = normalizeAnswerValue(values[field.id]);\n      if (value == null) {\n        continue;\n      }\n\n      questions.push({\n        id: field.id,\n        value,\n      });\n    }\n  }\n\n  return questions;\n}\n\nexport function buildFilloutSubmissionPayload(opts: {\n  flow: FilloutFlowDefinition;\n  values: FilloutFlowValues;\n  urlParameters?: FilloutUrlParameterInput;\n}) {\n  const { flow, values, urlParameters } = opts;\n  const questions = buildFilloutSubmissionQuestions(flow, values);\n  const resolvedUrlParameters = resolveUrlParameters(flow, urlParameters);\n\n  const payload: FilloutSubmissionPayload = {\n    formId: flow.formId,\n    submissions: [\n      {\n        questions,\n      },\n    ],\n  };\n\n  if (resolvedUrlParameters.length > 0) {\n    payload.submissions[0].urlParameters = resolvedUrlParameters;\n  }\n\n  return payload;\n}\n",
      "type": "registry:lib",
      "target": "src/lib/fillout/submission.ts"
    }
  ],
  "type": "registry:lib"
}