{"version":3,"sources":["../../src/schemas/contact-schema.ts"],"names":["z"],"mappings":";;;;;AAKO,IAAM,kBAAA,GAAqB;AAAA,EAChC,MAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA,EACA;AACF;AAEO,IAAM,qBAAA,GAAwB;AAAA,EACnC,QAAA;AAAA,EACA,UAAA;AAAA,EACA,WAAA;AAAA,EACA,QAAA;AAAA,EACA,oBAAA;AAAA,EACA;AACF;AAKO,IAAM,0BAAA,GAA6B;AAAA,EACxC,0BAAA;AAAA,EACA,uBAAA;AAAA,EACA,oBAAA;AAAA,EACA,cAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF;AAWO,IAAM,iBAAA,GAAoBA,MAC9B,MAAA,EAAO,CACP,IAAI,EAAE,OAAA,EAAS,mCAAA,EAAqC,CAAA,CACpD,MAAA;AAAA,EACC,CAAC,GAAA,KAAQ;AACP,IAAA,IAAI;AACF,MAAA,MAAM,OAAO,IAAI,GAAA,CAAI,GAAG,CAAA,CAAE,SAAS,WAAA,EAAY;AAC/C,MAAA,OAAO,IAAA,KAAS,cAAA,IAAkB,IAAA,CAAK,QAAA,CAAS,eAAe,CAAA;AAAA,IACjE,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF,CAAA;AAAA,EACA;AAAA,IACE,OAAA,EAAS;AAAA;AAEb,CAAA,CACC,UAAS,CACT,EAAA,CAAGA,KAAA,CAAE,OAAA,CAAQ,EAAE,CAAC;AASZ,IAAM,iBAAA,GAAoBA,MAAE,MAAA,CAAO;AAAA,EACxC,MAAMA,KAAA,CACH,MAAA,EAAO,CACP,GAAA,CAAI,GAAG,EAAE,OAAA,EAAS,oCAAA,EAAsC,EACxD,GAAA,CAAI,GAAA,EAAK,EAAE,OAAA,EAAS,oBAAoB,CAAA;AAAA,EAC3C,KAAA,EAAOA,KAAA,CACJ,MAAA,EAAO,CACP,KAAA,CAAM,EAAE,OAAA,EAAS,oCAAA,EAAsC,CAAA,CACvD,GAAA,CAAI,GAAG,CAAA;AAAA,EACV,YAAA,EAAc,iBAAA;AAAA,EACd,cAAcA,KAAA,CACX,MAAA,EAAO,CACP,GAAA,CAAI,GAAG,EAAE,OAAA,EAAS,yCAAA,EAA2C,EAC7D,GAAA,CAAI,GAAA,EAAK,EAAE,OAAA,EAAS,6BAA6B,CAAA;AAAA,EACpD,SAASA,KAAA,CACN,MAAA,EAAO,CACP,GAAA,CAAI,IAAI,EAAE,OAAA,EAAS,wCAAA,EAA0C,EAC7D,GAAA,CAAI,GAAA,EAAM,EAAE,OAAA,EAAS,+CAA+C,CAAA;AAAA,EACvE,OAAA,EAASA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AACtB,CAAC;AAKM,IAAM,aAAA,GAAgB,kBAAkB,MAAA,CAAO;AAAA,EACpD,WAAA,EAAaA,KAAA,CACV,MAAA,EAAO,CACP,UAAS,CACT,MAAA,CAAO,CAAC,GAAA,KAAQ,CAAC,GAAA,IAAO,kBAAA,CAAmB,QAAA,CAAS,GAA0C,CAAA,EAAG;AAAA,IAChG,OAAA,EAAS;AAAA,GACV,CAAA;AAAA,EACH,cAAA,EAAgBA,KAAA,CACb,MAAA,EAAO,CACP,UAAS,CACT,MAAA,CAAO,CAAC,GAAA,KAAQ,CAAC,GAAA,IAAO,qBAAA,CAAsB,QAAA,CAAS,GAA6C,CAAA,EAAG;AAAA,IACtG,OAAA,EAAS;AAAA,GACV;AACL,CAAC","file":"contact-schema.cjs","sourcesContent":["import { z } from 'zod';\n\n// Dropdown option constants — re-exported by `<ContactForm>` consumers\n// that want to surface their own custom Select widgets keyed on the\n// same allowed-value set.\nexport const companySizeOptions = [\n  '1-10',\n  '11-50',\n  '51-200',\n  '201-500',\n  '501-1000',\n  '1001+',\n] as const;\n\nexport const referralSourceOptions = [\n  'Google',\n  'LinkedIn',\n  'Twitter/X',\n  'Reddit',\n  'Friend / Colleague',\n  'Other',\n] as const;\n\n// Default fallback options — used when the embedder doesn't supply\n// platform-specific help-category options via the `helpCategoryOptions`\n// prop on `<ContactForm>`.\nexport const defaultHelpCategoryOptions = [\n  'Open-Source Alternatives',\n  'Vendor Cost Reduction',\n  'MSP Best Practices',\n  'Partnerships',\n  'Press',\n  'Other',\n] as const;\n\n// Reusable LinkedIn URL validator — the single source of truth. Every\n// public form schema, every admin update schema, every HubSpot push\n// validator MUST reference this so validation rules cannot drift\n// across boundaries.\n//\n// Host validation parses the URL and checks the hostname suffix so an\n// adversarial input like `https://evil.com/linkedin.com/x` is rejected\n// (substring match would have accepted it — CodeQL alert\n// \"Incomplete URL substring sanitization\").\nexport const LinkedInUrlSchema = z\n  .string()\n  .url({ message: 'Please enter a valid LinkedIn URL' })\n  .refine(\n    (url) => {\n      try {\n        const host = new URL(url).hostname.toLowerCase()\n        return host === 'linkedin.com' || host.endsWith('.linkedin.com')\n      } catch {\n        return false\n      }\n    },\n    {\n      message: 'Please enter a valid LinkedIn profile URL',\n    },\n  )\n  .optional()\n  .or(z.literal(''));\n\n/**\n * Base schema — fields shared by every contact-style form (main contact\n * form, TMCG join, data-room request, case-study pitch, etc.). Any\n * field that exists on a form but NOT on this schema is silently\n * stripped by `safeParse` — that's exactly the bug the LinkedIn field\n * hit historically.\n */\nexport const ContactBaseSchema = z.object({\n  name: z\n    .string()\n    .min(2, { message: 'Name must be at least 2 characters' })\n    .max(255, { message: 'Name is too long' }),\n  email: z\n    .string()\n    .email({ message: 'Please enter a valid email address' })\n    .max(255),\n  linkedin_url: LinkedInUrlSchema,\n  helpCategory: z\n    .string()\n    .min(1, { message: 'Please select what we can help you with' })\n    .max(255, { message: 'Help category is too long' }),\n  message: z\n    .string()\n    .min(10, { message: 'Message must be at least 10 characters' })\n    .max(5000, { message: 'Message is too long (5,000 character limit)' }),\n  rdt_cid: z.string().optional(),\n});\n\n// Public POST /api/contact validator — base + dropdown fields used by\n// the generic contact form. Other form-specific schemas extend\n// `ContactBaseSchema`.\nexport const ContactSchema = ContactBaseSchema.extend({\n  companySize: z\n    .string()\n    .optional()\n    .refine((val) => !val || companySizeOptions.includes(val as (typeof companySizeOptions)[number]), {\n      message: 'Please select a valid company size',\n    }),\n  referralSource: z\n    .string()\n    .optional()\n    .refine((val) => !val || referralSourceOptions.includes(val as (typeof referralSourceOptions)[number]), {\n      message: 'Please select a valid referral source',\n    }),\n});\n\nexport type ContactFormData = z.infer<typeof ContactSchema>;\n\nexport interface ContactApiResponse {\n  success: boolean;\n  error?: string;\n}\n"]}