{"version":3,"file":"utils-DIqrx4XF.mjs","names":["ENV_TO_SLUG: Record<PaymentKitEnvironment, string>"],"sources":["../src/utils/checkout-request-id.ts","../src/utils/validate-form-fields.ts","../src/utils/index.ts"],"sourcesContent":["import { nanoid } from \"nanoid\";\nimport type { PaymentKitEnvironment } from \"../types\";\n\ndeclare global {\n  interface Window {\n    __paymentKitRequestId__?: string;\n  }\n}\n\n/**\n * Maps PaymentKit environment to request ID env slug.\n * This must match the backend's env slug format.\n */\nconst ENV_TO_SLUG: Record<PaymentKitEnvironment, string> = {\n  local: \"dev\",\n  tunnel: \"dev\",\n  sandbox: \"prod\",\n  staging: \"stg\",\n  production: \"prod\",\n};\n\n/**\n * Generates a checkout request ID for correlating all API calls within a checkout session.\n *\n * Format: pk_{env}_{nanoid(12)}\n * - pk = PaymentKit.js (client-generated)\n * - env = dev, stg, or prod\n * - nanoid(12) = 12 character random string\n *\n * Example: pk_stg_a1b2c3d4e5f6\n */\nexport function generateCheckoutRequestId(environment: PaymentKitEnvironment): string {\n  const envSlug = ENV_TO_SLUG[environment] ?? \"dev\";\n  const randomPart = nanoid(12);\n  return `pk_${envSlug}_${randomPart}`;\n}\n\n/**\n * Gets or creates a checkout request ID, storing it in window for idempotency.\n *\n * This ensures the same request ID is used across:\n * - Multiple PaymentKit instantiations on the same page\n * - All analytics events and API calls within a checkout session\n *\n * The ID is generated once on first call and reused thereafter.\n */\nexport function getOrCreateCheckoutRequestId(environment: PaymentKitEnvironment): string {\n  if (typeof window !== \"undefined\" && window.__paymentKitRequestId__) {\n    return window.__paymentKitRequestId__;\n  }\n\n  const requestId = generateCheckoutRequestId(environment);\n\n  if (typeof window !== \"undefined\") {\n    window.__paymentKitRequestId__ = requestId;\n  }\n\n  return requestId;\n}\n\n/**\n * Creates RequestOptions with the x-request-id header set.\n */\nexport function withRequestId(checkoutRequestId: string) {\n  return {\n    headers: {\n      \"x-request-id\": checkoutRequestId,\n    },\n  };\n}\n","import * as v from \"valibot\";\nimport type { FormErrorCodes, PaymentKitErrors, PaymentKitFields } from \"../types\";\n\ntype Options = {\n  optionalZipCode?: boolean;\n};\n\nexport const validateFormFields = async (fields: PaymentKitFields, options: Options = {}) => {\n  const schema = v.object({\n    customer_name: v.pipe(\n      v.string(\"required\"),\n      v.nonEmpty(\"required\"),\n      v.minLength(4, \"invalid\"),\n      v.maxLength(40, \"invalid\"),\n    ),\n    customer_email: v.pipe(v.string(\"required\"), v.nonEmpty(\"required\"), v.email(\"invalid\")),\n    customer_country: v.pipe(v.string(\"required\"), v.nonEmpty(\"required\")),\n    customer_zip_code: options.optionalZipCode\n      ? v.pipe(v.string(\"required\"))\n      : v.pipe(v.string(\"required\"), v.nonEmpty(\"required\")),\n  });\n\n  const result = v.safeParse(schema, fields);\n\n  if (result.issues) {\n    const errors = result.issues.reduce((errors, issue) => {\n      const field = v.getDotPath(issue) as keyof PaymentKitErrors;\n\n      errors[field] = issue.kind === \"schema\" ? \"required\" : (issue.message as FormErrorCodes);\n      return errors;\n    }, {} as PaymentKitErrors);\n    return { isSuccess: false, errors };\n  }\n\n  return { isSuccess: true, errors: {} as PaymentKitErrors };\n};\n","import type { PaymentMethod } from \"../types\";\n\nexport { generateCheckoutRequestId, getOrCreateCheckoutRequestId, withRequestId } from \"./checkout-request-id\";\nexport { validateFormFields } from \"./validate-form-fields\";\n\nexport const $ = (selector: string) => {\n  const ele = document.querySelector(selector);\n  if (!ele) {\n    throw new Error(`Cannot find element with selector: ${selector}`);\n  }\n  return ele;\n};\n\nexport const definePaymentMethod = <TExternalFuncs, TName extends string>(\n  paymentMethod: PaymentMethod<TExternalFuncs, TName>,\n) => paymentMethod;\n\nexport const createCheckoutIFrame = (type: string, baseUrl: string, params?: Record<string, string>) => {\n  const iframe = document.createElement(\"iframe\");\n\n  const searchParams = new URLSearchParams(params);\n  const searchParamsStr = searchParams.toString();\n\n  iframe.src = `${baseUrl}/embeds/v1/${type}${searchParamsStr ? `?${searchParamsStr}` : \"\"}`;\n\n  Object.assign(iframe.style, { width: \"100%\", height: \"100%\", border: \"none\" });\n\n  return iframe;\n};\n\n/**\n * Collects browser and client information for fraud detection.\n */\nexport function collectFraudMetadata() {\n  return {\n    ipAddress: undefined, // IP address should be collected server-side\n    browserInfo: {\n      userAgent: navigator.userAgent,\n      language: navigator.language,\n      screenHeight: window.screen.height,\n      screenWidth: window.screen.width,\n      colorDepth: window.screen.colorDepth,\n      timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,\n    },\n    processorFraudInfo: undefined,\n  };\n}\n\ntype AddressInput = {\n  line1?: string;\n  line2?: string;\n  city?: string;\n  state?: string;\n  zip_code?: string;\n  country?: string;\n};\n\ntype AddressOutput = {\n  line1?: string;\n  line2?: string;\n  city?: string;\n  state?: string;\n  zipCode?: string;\n  country?: string;\n};\n\n/**\n * Maps address fields from snake_case to camelCase format.\n */\nexport function mapAddress(address?: AddressInput): AddressOutput | undefined {\n  if (!address) return undefined;\n\n  return {\n    line1: address.line1,\n    line2: address.line2,\n    city: address.city,\n    state: address.state,\n    zipCode: address.zip_code,\n    country: address.country,\n  };\n}\n"],"mappings":";;;;;;;;AAaA,MAAMA,cAAqD;CACzD,OAAO;CACP,QAAQ;CACR,SAAS;CACT,SAAS;CACT,YAAY;CACb;;;;;;;;;;;AAYD,SAAgB,0BAA0B,aAA4C;AAGpF,QAAO,MAFS,YAAY,gBAAgB,MAEvB,GADF,OAAO,GAAG;;;;;;;;;;;AAa/B,SAAgB,6BAA6B,aAA4C;AACvF,KAAI,OAAO,WAAW,eAAe,OAAO,wBAC1C,QAAO,OAAO;CAGhB,MAAM,YAAY,0BAA0B,YAAY;AAExD,KAAI,OAAO,WAAW,YACpB,QAAO,0BAA0B;AAGnC,QAAO;;;;;AAMT,SAAgB,cAAc,mBAA2B;AACvD,QAAO,EACL,SAAS,EACP,gBAAgB,mBACjB,EACF;;;;;AC7DH,MAAa,qBAAqB,OAAO,QAA0B,UAAmB,EAAE,KAAK;CAC3F,MAAM,SAAS,EAAE,OAAO;EACtB,eAAe,EAAE,KACf,EAAE,OAAO,WAAW,EACpB,EAAE,SAAS,WAAW,EACtB,EAAE,UAAU,GAAG,UAAU,EACzB,EAAE,UAAU,IAAI,UAAU,CAC3B;EACD,gBAAgB,EAAE,KAAK,EAAE,OAAO,WAAW,EAAE,EAAE,SAAS,WAAW,EAAE,EAAE,MAAM,UAAU,CAAC;EACxF,kBAAkB,EAAE,KAAK,EAAE,OAAO,WAAW,EAAE,EAAE,SAAS,WAAW,CAAC;EACtE,mBAAmB,QAAQ,kBACvB,EAAE,KAAK,EAAE,OAAO,WAAW,CAAC,GAC5B,EAAE,KAAK,EAAE,OAAO,WAAW,EAAE,EAAE,SAAS,WAAW,CAAC;EACzD,CAAC;CAEF,MAAM,SAAS,EAAE,UAAU,QAAQ,OAAO;AAE1C,KAAI,OAAO,OAOT,QAAO;EAAE,WAAW;EAAO,QANZ,OAAO,OAAO,QAAQ,QAAQ,UAAU;GACrD,MAAM,QAAQ,EAAE,WAAW,MAAM;AAEjC,UAAO,SAAS,MAAM,SAAS,WAAW,aAAc,MAAM;AAC9D,UAAO;KACN,EAAE,CAAqB;EACS;AAGrC,QAAO;EAAE,WAAW;EAAM,QAAQ,EAAE;EAAsB;;;;;AC7B5D,MAAa,KAAK,aAAqB;CACrC,MAAM,MAAM,SAAS,cAAc,SAAS;AAC5C,KAAI,CAAC,IACH,OAAM,IAAI,MAAM,sCAAsC,WAAW;AAEnE,QAAO;;AAGT,MAAa,uBACX,kBACG;AAEL,MAAa,wBAAwB,MAAc,SAAiB,WAAoC;CACtG,MAAM,SAAS,SAAS,cAAc,SAAS;CAG/C,MAAM,kBADe,IAAI,gBAAgB,OAAO,CACX,UAAU;AAE/C,QAAO,MAAM,GAAG,QAAQ,aAAa,OAAO,kBAAkB,IAAI,oBAAoB;AAEtF,QAAO,OAAO,OAAO,OAAO;EAAE,OAAO;EAAQ,QAAQ;EAAQ,QAAQ;EAAQ,CAAC;AAE9E,QAAO;;;;;AAMT,SAAgB,uBAAuB;AACrC,QAAO;EACL,WAAW;EACX,aAAa;GACX,WAAW,UAAU;GACrB,UAAU,UAAU;GACpB,cAAc,OAAO,OAAO;GAC5B,aAAa,OAAO,OAAO;GAC3B,YAAY,OAAO,OAAO;GAC1B,UAAU,KAAK,gBAAgB,CAAC,iBAAiB,CAAC;GACnD;EACD,oBAAoB;EACrB"}