{"version":3,"file":"index.cjs","sources":["../src/lib/load-formbricks.ts","../src/index.ts"],"sourcesContent":["import type { TFormbricks } from \"../types/formbricks\";\n\ndeclare global {\n  const formbricks: TFormbricks &\n    Record<string, (...args: unknown[]) => unknown>;\n}\n\ntype Result<T, E = Error> = { ok: true; data: T } | { ok: false; error: E };\n\nlet isInitializing = false;\nlet isInitialized = false;\n// Load the SDK, return the result\nconst loadFormbricksSDK = async (\n  apiHostParam: string\n): Promise<Result<void>> => {\n  if (!(globalThis as unknown as Record<string, unknown>).formbricks) {\n    const scriptTag = document.createElement(\"script\");\n    scriptTag.type = \"text/javascript\";\n    scriptTag.src = `${apiHostParam}/js/formbricks.umd.cjs`;\n    scriptTag.async = true;\n    const getFormbricks = async (): Promise<void> =>\n      new Promise<void>((resolve, reject) => {\n        const timeoutId = setTimeout(() => {\n          reject(new Error(`Formbricks SDK loading timed out`));\n        }, 10000);\n        scriptTag.onload = () => {\n          clearTimeout(timeoutId);\n          resolve();\n        };\n        scriptTag.onerror = () => {\n          clearTimeout(timeoutId);\n          reject(new Error(`Failed to load Formbricks SDK`));\n        };\n      });\n    document.head.appendChild(scriptTag);\n    try {\n      await getFormbricks();\n      return { ok: true, data: undefined };\n    } catch (error) {\n      const err = error as { message?: string };\n      return {\n        ok: false,\n        error: new Error(err.message ?? `Failed to load Formbricks SDK`),\n      };\n    }\n  }\n  return { ok: true, data: undefined };\n};\n\nconst functionsToProcess: { prop: string; args: unknown[] }[] = [];\n\nconst validateSetupArgs = (\n  args: unknown[]\n): { appUrl: string; environmentId: string } | null => {\n  const argsTyped = args[0] as { appUrl: string; environmentId: string };\n  const { appUrl, environmentId } = argsTyped;\n\n  if (!appUrl) {\n    console.error(\"🧱 Formbricks - Error: appUrl is required\");\n    return null;\n  }\n\n  if (!environmentId) {\n    console.error(\"🧱 Formbricks - Error: environmentId is required\");\n    return null;\n  }\n\n  // Removing trailing slash\n  const appUrlWithoutTrailingSlash = appUrl.endsWith(\"/\")\n    ? appUrl.slice(0, -1)\n    : appUrl;\n\n  return { appUrl: appUrlWithoutTrailingSlash, environmentId };\n};\n\nconst processQueuedFunctions = (formbricksInstance: TFormbricks): void => {\n  for (const { prop: functionProp, args: functionArgs } of functionsToProcess) {\n    if (\n      typeof formbricksInstance[\n        functionProp as keyof typeof formbricksInstance\n      ] !== \"function\"\n    ) {\n      console.error(\n        `🧱 Formbricks - Error: Method ${functionProp} does not exist on formbricks`\n      );\n      continue;\n    }\n    // @ts-expect-error -- Required for dynamic function calls\n    (formbricksInstance[functionProp] as unknown)(...functionArgs);\n  }\n};\n\nconst handleSetupCall = async (args: unknown[]): Promise<void> => {\n  if (isInitializing) {\n    console.warn(\n      \"🧱 Formbricks - Warning: Formbricks is already initializing.\"\n    );\n    return;\n  }\n  const validatedArgs = validateSetupArgs(args);\n  if (!validatedArgs) return;\n  isInitializing = true;\n  try {\n    const loadSDKResult = await loadFormbricksSDK(validatedArgs.appUrl);\n    const formbricksInstance = (\n      globalThis as unknown as Record<string, unknown>\n    ).formbricks as TFormbricks;\n    if (!loadSDKResult.ok || !formbricksInstance) {\n      console.error(\"🧱 Formbricks - Error: Failed to load Formbricks SDK\");\n      return;\n    }\n    await formbricksInstance.setup({ ...validatedArgs });\n    isInitialized = true;\n    processQueuedFunctions(formbricks);\n  } catch (err) {\n    console.error(\"🧱 Formbricks - Error: setup failed\", err);\n  } finally {\n    isInitializing = false;\n  }\n};\n\nconst executeFormbricksMethod = async (\n  prop: string,\n  args: unknown[]\n): Promise<void> => {\n  const formbricksInstance = (globalThis as unknown as Record<string, unknown>)\n    .formbricks;\n\n  if (!formbricksInstance) return;\n\n  // @ts-expect-error -- Required for dynamic function calls\n  // eslint-disable-next-line @typescript-eslint/no-unsafe-call\n  await formbricksInstance[prop](...args);\n};\n\nexport const loadFormbricksToProxy = async (\n  prop: string,\n  ...args: unknown[]\n): Promise<void> => {\n  if (isInitialized) {\n    await executeFormbricksMethod(prop, args);\n  } else if (prop === \"setup\") {\n    await handleSetupCall(args);\n  } else {\n    console.warn(\n      \"🧱 Formbricks - Warning: Formbricks not initialized. This method will be queued and executed after initialization.\"\n    );\n    functionsToProcess.push({ prop, args });\n  }\n};\n","import { type TFormbricks as TFormbricksCore } from \"./types/formbricks\";\nimport { loadFormbricksToProxy } from \"./lib/load-formbricks\";\n\ntype TFormbricks = Omit<TFormbricksCore, \"track\"> & {\n  track: (code: string) => Promise<void>;\n};\n\ndeclare global {\n  interface Window {\n    formbricks: TFormbricks | undefined;\n  }\n}\n\nconst formbricksProxyHandler: ProxyHandler<TFormbricks> = {\n  get(_target, prop, _receiver) {\n    return (...args: unknown[]) =>\n      loadFormbricksToProxy(prop as keyof TFormbricks, ...args);\n  },\n};\n\nconst formbricks: TFormbricksCore = new Proxy(\n  {} as TFormbricks,\n  formbricksProxyHandler\n);\n\nexport default formbricks;\n"],"names":["isInitializing","isInitialized","functionsToProcess","handleSetupCall","async","args","console","warn","validatedArgs","argsTyped","appUrl","environmentId","endsWith","slice","error","validateSetupArgs","loadSDKResult","apiHostParam","globalThis","formbricks","scriptTag","document","createElement","type","src","getFormbricks","Promise","resolve","reject","timeoutId","setTimeout","Error","onload","clearTimeout","onerror","head","appendChild","ok","data","message","loadFormbricksSDK","formbricksInstance","setup","prop","functionProp","functionArgs","processQueuedFunctions","err","loadFormbricksToProxy","executeFormbricksMethod","push","Proxy","get","_target","_receiver"],"mappings":"aASA,IAAIA,GAAiB,EACjBC,GAAgB,EAEpB,MAqCMC,EAA0D,GA2C1DC,EAAkBC,MAAOC,IAC7B,GAAIL,EAIF,YAHAM,QAAQC,KACN,gEAIJ,MAAMC,EAhDkB,CACxBH,IAEA,MAAMI,EAAYJ,EAAK,IACjBK,OAAEA,EAAAC,cAAQA,GAAkBF,EAElC,OAAKC,EAKAC,EAUE,CAAED,OAJ0BA,EAAOE,SAAS,KAC/CF,EAAOG,MAAM,GAAG,GAChBH,EAEyCC,kBAT3CL,QAAQQ,MAAM,oDACP,OANPR,QAAQQ,MAAM,6CACP,OAwCaC,CAAkBV,GACxC,GAAKG,EAAL,CACAR,GAAiB,EACjB,IACE,MAAMgB,OA3FgBZ,OACxBa,IAEA,IAAMC,WAAkDC,WAAY,CAClE,MAAMC,EAAYC,SAASC,cAAc,UACzCF,EAAUG,KAAO,kBACjBH,EAAUI,IAAM,GAAGP,0BACnBG,EAAUhB,OAAQ,EAClB,MAAMqB,EAAgBrB,SACpB,IAAIsB,QAAc,CAACC,EAASC,KAC1B,MAAMC,EAAYC,WAAW,KAC3BF,EAAO,IAAIG,MAAM,sCAChB,KACHX,EAAUY,OAAS,KACjBC,aAAaJ,GACbF,KAEFP,EAAUc,QAAU,KAClBD,aAAaJ,GACbD,EAAO,IAAIG,MAAM,qCAGvBV,SAASc,KAAKC,YAAYhB,GAC1B,IAEE,aADMK,IACC,CAAEY,IAAI,EAAMC,UAAM,EAC3B,OAASxB,GAEP,MAAO,CACLuB,IAAI,EACJvB,MAAO,IAAIiB,MAHDjB,EAGWyB,SAAW,iCAEpC,CACF,CACA,MAAO,CAAEF,IAAI,EAAMC,UAAM,IAyDKE,CAAkBhC,EAAcE,QACtD+B,EACJvB,WACAC,WACF,IAAKH,EAAcqB,KAAOI,EAExB,YADAnC,QAAQQ,MAAM,8DAGV2B,EAAmBC,MAAM,IAAKlC,IACpCP,GAAgB,EArCW,CAACwC,IAC9B,IAAA,MAAaE,KAAMC,EAAcvC,KAAMwC,KAAkB3C,EAI/C,mBAFCuC,EACLG,GASHH,EAAmBG,MAA6BC,GAN/CvC,QAAQQ,MACN,iCAAiC8B,mCA8BrCE,CAAuB3B,WACzB,OAAS4B,GACPzC,QAAQQ,MAAM,sCAAuCiC,EACvD,CAAA,QACE/C,GAAiB,CACnB,CAlBoB,GAmCTgD,EAAwB5C,MACnCuC,KACGtC,KAECJ,OAlB0BG,OAC9BuC,EACAtC,KAEA,MAAMoC,EAAsBvB,WACzBC,WAEEsB,SAICA,EAAmBE,MAAStC,IAQ1B4C,CAAwBN,EAAMtC,GAClB,UAATsC,QACHxC,EAAgBE,IAEtBC,QAAQC,KACN,sHAEFL,EAAmBgD,KAAK,CAAEP,OAAMtC,WC/H9Bc,EAA8B,IAAIgC,MACtC,CAAA,EARwD,CACxDC,IAAA,CAAIC,EAASV,EAAMW,IACV,IAAIjD,IACT2C,EAAsBL,KAA8BtC"}