@formbricks/js
Version:
Formbricks-js allows you to connect your index to Formbricks, display surveys and trigger events.
1 lines • 7.81 kB
Source Map (JSON)
{"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"}