@saasquatch/squatch-js 2.7.0-3 → 2.7.0-4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/dist/squatch.cjs.js +2119 -7
  2. package/dist/squatch.cjs.js.map +1 -1
  3. package/dist/squatch.esm.js +2161 -0
  4. package/dist/squatch.esm.js.map +1 -0
  5. package/dist/squatch.js +2125 -9
  6. package/dist/squatch.js.map +1 -1
  7. package/dist/squatch.min.js +6 -0
  8. package/package.json +8 -8
  9. package/vite.config.ts +10 -3
  10. package/coverage/clover.xml +0 -917
  11. package/coverage/coverage-final.json +0 -21
  12. package/coverage/lcov-report/base.css +0 -224
  13. package/coverage/lcov-report/block-navigation.js +0 -87
  14. package/coverage/lcov-report/favicon.png +0 -0
  15. package/coverage/lcov-report/prettify.css +0 -1
  16. package/coverage/lcov-report/prettify.js +0 -2
  17. package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  18. package/coverage/lcov-report/sorter.js +0 -196
  19. package/coverage/lcov.info +0 -1669
  20. package/dist/squatch.es.js +0 -1623
  21. package/dist/squatch.es.js.map +0 -1
  22. package/dist copy/api/AnalyticsApi.d.ts +0 -32
  23. package/dist copy/api/EventsApi.d.ts +0 -52
  24. package/dist copy/api/WidgetApi.d.ts +0 -64
  25. package/dist copy/api/graphql.d.ts +0 -1
  26. package/dist copy/async.d.ts +0 -20
  27. package/dist copy/docs.d.ts +0 -1
  28. package/dist copy/globals.d.ts +0 -4
  29. package/dist copy/squatch.cjs.js +0 -48
  30. package/dist copy/squatch.d.ts +0 -122
  31. package/dist copy/squatch.es.js +0 -1622
  32. package/dist copy/squatch.esm.js +0 -2317
  33. package/dist copy/squatch.esm.js.map +0 -1
  34. package/dist copy/squatch.js +0 -2337
  35. package/dist copy/squatch.js.map +0 -1
  36. package/dist copy/types.d.ts +0 -109
  37. package/dist copy/utils/cookieUtils.d.ts +0 -3
  38. package/dist copy/utils/decodeUserJwt.d.ts +0 -2
  39. package/dist copy/utils/domready.d.ts +0 -6
  40. package/dist copy/utils/io.d.ts +0 -5
  41. package/dist copy/utils/utmUtils.d.ts +0 -14
  42. package/dist copy/utils/validate.d.ts +0 -12
  43. package/dist copy/widgets/EmbedWidget.d.ts +0 -25
  44. package/dist copy/widgets/PopupWidget.d.ts +0 -30
  45. package/dist copy/widgets/Widget.d.ts +0 -57
  46. package/dist copy/widgets/Widgets.d.ts +0 -112
  47. package/dist copy/widgets/declarative/DeclarativeWidget.d.ts +0 -100
  48. package/dist copy/widgets/declarative/DeclarativeWidgets.d.ts +0 -35
@@ -1 +0,0 @@
1
- {"version":3,"file":"squatch.js","sources":["../src/globals.ts","../src/utils/validate.ts","../src/utils/io.ts","../src/api/graphql.ts","../src/api/WidgetApi.ts","../src/api/AnalyticsApi.ts","../src/widgets/Widget.ts","../src/utils/domready.ts","../src/widgets/EmbedWidget.ts","../src/widgets/PopupWidget.ts","../src/widgets/Widgets.ts","../src/api/EventsApi.ts","../src/async.ts","../src/utils/cookieUtils.ts","../src/utils/utmUtils.ts","../src/utils/decodeUserJwt.ts","../src/widgets/declarative/DeclarativeWidget.ts","../src/widgets/declarative/DeclarativeWidgets.ts","../src/docs.ts","../src/squatch.ts"],"sourcesContent":["export const DEFAULT_DOMAIN = \"https://app.referralsaasquatch.com\";\nexport const DEFAULT_NPM_CDN = \"https://fast.ssqt.io/npm\";\nexport const DEFAULT_NAMESPACE = \"squatch\";\nexport const IMPACT_NAMESPACE = \"impact\";\n","import { DEFAULT_DOMAIN, DEFAULT_NPM_CDN } from \"../globals\";\nimport { ConfigOptions, WidgetConfig } from \"../types\";\n\ntype Required<T> = T extends object\n ? { [P in keyof T]-?: NonNullable<T[P]> }\n : T;\n\nexport function validateConfig(\n _raw?: unknown | undefined\n): Required<ConfigOptions> {\n if (typeof _raw !== \"object\") throw new Error(\"config must be an object\");\n\n const tenant = window.squatchTenant;\n const config = getConfig();\n\n const raw = {\n tenantAlias: _raw?.[\"tenantAlias\"] || tenant,\n domain: _raw?.[\"domain\"] || config?.domain,\n npmCdn: _raw?.[\"npmCdn\"] || config?.npmCdn,\n debug: _raw?.[\"debug\"] || config?.debug,\n };\n\n if (typeof raw.tenantAlias !== \"string\")\n throw new Error(\"tenantAlias not provided\");\n const tenantAlias = raw.tenantAlias;\n const domain =\n (typeof raw.domain === \"string\" && raw.domain) || DEFAULT_DOMAIN;\n const debug = (typeof raw.debug === \"boolean\" && raw.debug) || false;\n const npmCdn =\n (typeof raw.npmCdn === \"string\" && raw.npmCdn) || DEFAULT_NPM_CDN;\n\n return {\n tenantAlias,\n domain,\n debug,\n npmCdn,\n };\n}\n\nexport function isObject(obj: unknown): obj is object {\n return typeof obj === \"object\" && !Array.isArray(obj) && obj !== null;\n}\n\nexport function validateLocale(locale?: string) {\n if (locale && /^[a-z]{2}_(?:[A-Z]{2}|[0-9]{3})$/.test(locale)) {\n return locale;\n }\n}\n\nexport function validateWidgetConfig(raw: unknown | undefined): WidgetConfig {\n if (!isObject(raw)) throw new Error(\"Widget properties must be an object\");\n if (!raw?.[\"user\"]) throw new Error(\"Required properties missing.\");\n\n return raw as WidgetConfig;\n}\n\nexport function validatePasswordlessConfig(\n raw: unknown | undefined\n): WidgetConfig {\n if (!isObject(raw)) throw new Error(\"Widget properties must be an object\");\n\n return raw as WidgetConfig;\n}\n\nexport function getToken() {\n return window.impactToken || window.squatchToken;\n}\nexport function getConfig() {\n return window.impactConfig || window.squatchConfig;\n}\n","import { debug } from \"debug\";\nimport { JWT } from \"../types\";\nimport { getToken } from \"./validate\";\n\nconst _log = debug(\"squatch-js:io\");\n\nexport async function doQuery(\n url: string,\n query: string,\n variables: Record<string, unknown>,\n jwt: string | undefined\n) {\n const token = jwt || getToken();\n const headers = {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\",\n ...(token ? { Authorization: `Bearer ${token}` } : {}),\n \"X-SaaSquatch-Referrer\": window ? window.location.href : \"\",\n };\n\n try {\n const res = await fetch(url, {\n method: \"POST\",\n body: JSON.stringify({ query, variables }),\n headers,\n });\n if (!res.ok) throw new Error(await res.text());\n return await res.json();\n } catch (e) {\n throw e;\n }\n}\n\nexport async function doGet<T>(url, jwt = \"\"): Promise<T> {\n const headers = {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\",\n };\n\n const token = jwt || getToken();\n if (token) headers[\"X-SaaSquatch-User-Token\"] = token;\n\n try {\n const res = await fetch(url, {\n method: \"GET\",\n credentials: \"include\",\n headers,\n });\n const reply = await res.text();\n if (!res.ok) throw new Error(reply);\n\n return reply ? JSON.parse(reply) : reply;\n } catch (e) {\n throw e;\n }\n}\nexport async function doPost(url: string, data: any, jwt?: JWT) {\n const headers = {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\",\n };\n\n const token = jwt || getToken();\n if (token) headers[\"X-SaaSquatch-User-Token\"] = token;\n\n try {\n const res = await fetch(url, {\n method: \"POST\",\n body: data,\n headers,\n });\n\n const reply = await res.text();\n if (!res.ok) throw new Error(reply);\n\n return reply ? JSON.parse(reply) : reply;\n } catch (e) {\n throw e;\n }\n}\n\nexport async function doPut(url: string, data: any, jwt?: JWT) {\n const headers = {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\",\n \"X-SaaSquatch-Referrer\": window ? window.location.href : \"\",\n };\n\n const token = jwt || getToken();\n if (token) headers[\"X-SaaSquatch-User-Token\"] = token;\n\n try {\n const res = await fetch(url, {\n headers,\n method: \"PUT\",\n credentials: \"include\",\n body: data,\n });\n const reply = await res.text();\n if (!res.ok) throw new Error(reply);\n\n return reply ? JSON.parse(reply) : reply;\n } catch (e) {\n throw e;\n }\n}\n","export const RENDER_WIDGET_QUERY = `\n query renderWidget ($user: UserIdInput, $engagementMedium: UserEngagementMedium, $widgetType: WidgetType, $locale: RSLocale) {\n renderWidget(user: $user, engagementMedium: $engagementMedium, widgetType: $widgetType, locale: $locale) {\n template\n user {\n id\n accountId\n }\n jsOptions\n widgetConfig {\n values\n }\n }\n }\n`;\n","import Cookies from \"js-cookie\";\nimport {\n ConfigOptions,\n EngagementMedium,\n ReferralCookie,\n WidgetConfig,\n WidgetType,\n WithRequired,\n} from \"../types\";\nimport { doGet, doPut, doQuery } from \"../utils/io\";\nimport {\n validateConfig,\n validateLocale,\n validatePasswordlessConfig,\n validateWidgetConfig,\n} from \"../utils/validate\";\nimport { RENDER_WIDGET_QUERY } from \"./graphql\";\n\n/**\n *\n * The WidgetApi class is a wrapper around the Widget Endpoints of the SaaSquatch REST API.\n *\n */\nexport default class WidgetApi {\n tenantAlias: string;\n domain: string;\n npmCdn: string;\n\n /**\n * Initialize a new {@link WidgetApi} instance.\n *\n * @param {ConfigOptions} config Config details\n *\n * @example <caption>Browser example</caption>\n * var squatchApi = new squatch.WidgetApi({tenantAlias:'test_12b5bo1b25125'});\n *\n * @example <caption>Browserify/Webpack example</caption>\n * var WidgetApi = require('@saasquatch/squatch-js').WidgetApi;\n * var squatchApi = new WidgetApi({tenantAlias:'test_12b5bo1b25125'});\n *\n * @example <caption>Babel+Browserify/Webpack example</caption>\n * import {WidgetApi} from '@saasquatch/squatch-js';\n * let squatchApi = new WidgetApi({tenantAlias:'test_12b5bo1b25125'});\n */\n constructor(config?: ConfigOptions) {\n const raw = config as unknown;\n const clean = validateConfig(raw);\n\n this.tenantAlias = clean.tenantAlias;\n this.domain = clean.domain;\n this.npmCdn = clean.npmCdn;\n }\n\n /**\n * Creates/upserts user, requests widget template.\n *\n * @param {Object} params Parameters for request\n * @param {Object?} params.user The user details\n * @param {string} params.user.id The user id\n * @param {string} params.user.accountId The user account id\n * @param {WidgetType} params.widgetType The content of the widget.\n * @param {EngagementMedium?} params.engagementMedium How to display the widget.\n * @param {string?} params.jwt the JSON Web Token (JWT) that is used\n * to validate the data (can be disabled)\n *\n * @return {Promise} string if true, with the widget template, jsOptions and user details.\n */\n upsertUser(params: WithRequired<WidgetConfig, \"user\">): Promise<any> {\n const raw = params as unknown;\n const clean = validateWidgetConfig(raw);\n const {\n widgetType,\n engagementMedium = \"POPUP\",\n jwt,\n locale,\n user,\n } = clean as WithRequired<WidgetConfig, \"user\">;\n\n const tenantAlias = encodeURIComponent(this.tenantAlias);\n const accountId = user.accountId\n ? encodeURIComponent(user.accountId)\n : null;\n const userId = user.id ? encodeURIComponent(user.id) : null;\n\n const optionalParams = _buildParams({\n widgetType,\n engagementMedium,\n locale,\n });\n\n const path = `/api/v1/${tenantAlias}/widget/account/${accountId}/user/${userId}/upsert${optionalParams}`;\n const url = this.domain + path;\n const cookies = (Cookies || window.Cookies).get(\"_saasquatch\");\n if (cookies) user[\"cookies\"] = cookies;\n return doPut(url, JSON.stringify(user), jwt);\n }\n\n /**\n * Requests widget template\n *\n * @param {Object} params Parameters for request\n * @param {Object} params.user The user details\n * @param {string} params.user.id The user id\n * @param {string} params.user.accountId The user account id\n * @param {WidgetType} params.widgetType The content of the widget.\n * @param {EngagementMedium} params.engagementMedium How to display the widget.\n * @param {string} params.jwt the JSON Web Token (JWT) that is used\n * to validate the data (can be disabled)\n * @return {Promise} template html if true.\n */\n render(params: WidgetConfig): Promise<any> {\n const raw = params as unknown;\n const clean = validatePasswordlessConfig(raw);\n const { widgetType, engagementMedium = \"POPUP\", jwt, user } = clean;\n\n const tenantAlias = encodeURIComponent(this.tenantAlias);\n const accountId = user?.accountId\n ? encodeURIComponent(user.accountId)\n : null;\n const userId = user?.id ? encodeURIComponent(user.id) : null;\n\n const locale =\n clean.locale ?? validateLocale(navigator.language.replace(/\\-/g, \"_\"));\n\n const path = `/api/v1/${tenantAlias}/graphql`;\n const url = this.domain + path;\n return new Promise(async (resolve, reject) => {\n try {\n const res = await doQuery(\n url,\n RENDER_WIDGET_QUERY,\n {\n user: userId && accountId ? { id: userId, accountId } : null,\n engagementMedium,\n widgetType,\n locale,\n },\n jwt\n );\n resolve(res?.data?.renderWidget);\n } catch (e) {\n reject(e);\n }\n });\n }\n\n /**\n * Looks up the referral code of the current user, if there is any.\n *\n * @return {Promise<ReferralCookie>} code referral code if true.\n */\n async squatchReferralCookie(): Promise<ReferralCookie> {\n const tenantAlias = encodeURIComponent(this.tenantAlias);\n const _saasquatch = (Cookies || window.Cookies).get(\"_saasquatch\") || \"\";\n\n const cookie = _saasquatch\n ? `?cookies=${encodeURIComponent(_saasquatch)}`\n : ``;\n\n const url = `${this.domain}/a/${tenantAlias}/widgets/squatchcookiejson${cookie}`;\n\n const response = await doGet<ReferralCookie>(url);\n\n return Promise.resolve({\n ...response,\n encodedCookie: _saasquatch,\n });\n }\n\n referralCookie = this.squatchReferralCookie;\n}\n\n// builds a param string for widgets\nfunction _buildParams({\n widgetType,\n engagementMedium,\n locale,\n}: {\n engagementMedium: EngagementMedium;\n widgetType?: WidgetType;\n locale?: string;\n}) {\n const queryParams = new URLSearchParams();\n queryParams.append(\"engagementMedium\", engagementMedium);\n if (widgetType) queryParams.append(\"widgetType\", widgetType);\n if (locale) queryParams.append(\"locale\", locale);\n\n return `?${queryParams.toString()}`;\n}\n","// @ts-check\nimport { DEFAULT_DOMAIN } from \"../globals\";\nimport { EngagementMedium } from \"../types\";\nimport { doPost } from \"../utils/io\";\nimport { getConfig, isObject } from \"../utils/validate\";\n\n/**\n *\n * The AnalyticsApi class is a wrapper around the Analytics Endpoints of\n * the SaaSquatch REST API. Used to record Widget events.\n *\n * @hidden\n */\nexport default class AnalyticsApi {\n domain: string;\n /**\n * Initialize a new {@link AnalyticsApi} instance.\n *\n * @param {Object} config Config details\n * @param {string} [config.domain='https://app.referralsaasquatch.com'] The server domain.\n *\n */\n constructor(config: { domain: string }) {\n const raw = config as unknown | undefined;\n const clean = _validateAnalyticsConfig(raw);\n this.domain = clean?.[\"domain\"] || getConfig()?.domain || DEFAULT_DOMAIN;\n }\n\n pushAnalyticsLoadEvent(params: SQHDetails) {\n if (!params.externalUserId || !params.externalAccountId) return;\n\n const tenantAlias = encodeURIComponent(params.tenantAlias);\n const accountId = encodeURIComponent(params.externalAccountId);\n const userId = encodeURIComponent(params.externalUserId);\n const engagementMedium = encodeURIComponent(params.engagementMedium);\n const programId = params.programId\n ? `&programId=${encodeURIComponent(params.programId)}`\n : ``;\n\n const path = `/a/${tenantAlias}/widgets/analytics/loaded?externalAccountId=${accountId}&externalUserId=${userId}&engagementMedium=${engagementMedium}${programId}`;\n const url = this.domain + path;\n\n return doPost(url, JSON.stringify({}));\n }\n\n pushAnalyticsShareClickedEvent(params: SQHDetails & { shareMedium: string }) {\n const tenantAlias = encodeURIComponent(params.tenantAlias);\n const accountId = encodeURIComponent(params.externalAccountId);\n const userId = encodeURIComponent(params.externalUserId);\n const engagementMedium = encodeURIComponent(params.engagementMedium);\n const shareMedium = encodeURIComponent(params.shareMedium);\n\n const path = `/a/${tenantAlias}/widgets/analytics/shared?externalAccountId=${accountId}&externalUserId=${userId}&engagementMedium=${engagementMedium}&shareMedium=${shareMedium}`;\n const url = this.domain + path;\n\n return doPost(url, JSON.stringify({}));\n }\n}\n\nfunction _validateAnalyticsConfig(raw: unknown | undefined): {\n domain?: string;\n} {\n if (!isObject(raw)) throw new Error(\"'options' should be an object\");\n return raw as { domain?: string };\n}\n\nexport type SQHDetails = {\n tenantAlias: string;\n externalAccountId: string;\n externalUserId: string;\n engagementMedium: EngagementMedium;\n programId?: string;\n};\n","// @ts-check\nimport { debug } from \"debug\";\nimport AnalyticsApi, { SQHDetails } from \"../api/AnalyticsApi\";\nimport WidgetApi from \"../api/WidgetApi\";\nimport { EngagementMedium, WidgetContext, WidgetType } from \"../types\";\nimport { isObject } from \"../utils/validate\";\n\n/** @hidden */\nconst _log = debug(\"squatch-js:widget\");\n\nexport interface Params {\n type: WidgetType;\n domain: string;\n npmCdn: string;\n content: string;\n api: WidgetApi;\n rsCode?: string;\n context: WidgetContext;\n container?: string | HTMLElement | null | undefined;\n}\n\nexport type ProgramLoadEvent = {\n programId: string;\n tenantAlias?: string;\n accountId?: string;\n userId?: string;\n engagementMedium?: EngagementMedium;\n};\nexport type GenericLoadEvent = {\n mode: any;\n analytics: any;\n};\n\n/*\n * The Widget class is the base class for the different widget types available\n *\n * Creates an `iframe` in which the html content of the widget gets embedded.\n * Uses element-resize-detector (https://github.com/wnr/element-resize-detector)\n * for listening to the height of the widget content and make the iframe responsive.\n *\n */\nexport default abstract class Widget {\n type: WidgetType;\n content: string;\n analyticsApi: AnalyticsApi;\n widgetApi: WidgetApi;\n context: WidgetContext;\n npmCdn: string;\n container: string | HTMLElement | undefined | null;\n loadEventListener: EventListener | null = null;\n\n protected constructor(params: Params) {\n _log(\"widget initializing ...\");\n this.content =\n params.content === \"error\" ? this._error(params.rsCode) : params.content;\n this.type = params.type;\n this.widgetApi = params.api;\n this.npmCdn = params.npmCdn;\n this.analyticsApi = new AnalyticsApi({ domain: params.domain });\n this.context = params.context;\n this.container = params.context?.container || params.container;\n }\n\n _findElement(): HTMLElement {\n let element: Element | null;\n\n if (typeof this.container === \"string\") {\n // selector is a string\n element = document.querySelector(this.container);\n _log(\"loading widget with selector\", element);\n // selector is an HTML element\n } else if (this.container instanceof HTMLElement) {\n element = this.container;\n _log(\"loading widget with container\", element);\n // garbage container found\n } else if (this.container) {\n element = null;\n _log(\"container must be an HTMLElement or string\", this.container);\n // find element on page\n } else {\n element =\n document.querySelector(\"#squatchembed\") ||\n document.querySelector(\".squatchembed\") ||\n document.querySelector(\"#impactembed\") ||\n document.querySelector(\".impactembed\");\n\n _log(\"loading widget with default selector\", element);\n }\n\n if (!(element instanceof HTMLElement))\n throw new Error(\n `element with selector '${\n this.container ||\n \"#squatchembed, .squatchembed, #impactembed, or .impactembed\"\n }' not found.'`\n );\n\n return element;\n }\n\n _createFrame() {\n const frame = document.createElement(\"iframe\");\n frame[\"squatchJsApi\"] = this;\n frame.id = \"squatchFrame\";\n frame.width = \"100%\";\n frame.src = \"about:blank\";\n frame.scrolling = \"no\";\n frame.setAttribute(\n \"style\",\n \"border: 0; background-color: none; width: 1px; min-width: 100%;\"\n );\n\n return frame;\n }\n\n _findFrame() {\n const element = this.container ? this._findElement() : document.body;\n const parent = element.shadowRoot || element;\n return parent.querySelector(\n \"iframe#squatchFrame\"\n ) as HTMLIFrameElement | null;\n }\n\n abstract load(): void;\n\n protected _detachLoadEventListener(frameDoc: Document) {\n if (this.loadEventListener) {\n frameDoc.removeEventListener(\n \"sq:user-registration\",\n this.loadEventListener\n );\n\n this.loadEventListener = null;\n }\n }\n\n protected _attachLoadEventListener(\n frameDoc: Document,\n sqh: ProgramLoadEvent | GenericLoadEvent\n ) {\n if (this.loadEventListener === null) {\n this.loadEventListener = (\n e: CustomEvent<{ userId: string; accountId: string }>\n ) => {\n this._loadEvent({\n ...sqh,\n userId: e.detail.userId,\n accountId: e.detail.accountId,\n });\n };\n\n frameDoc.addEventListener(\"sq:user-registration\", this.loadEventListener);\n }\n }\n\n protected _loadEvent(sqh: ProgramLoadEvent | GenericLoadEvent) {\n if (!sqh) return; // No non-truthy value\n if (!isObject(sqh)) {\n throw new Error(\"Widget Load event identity property is not an object\");\n }\n\n let params: SQHDetails;\n if (\"programId\" in sqh) {\n if (\n !sqh.tenantAlias ||\n !sqh.accountId ||\n !sqh.userId ||\n !sqh.engagementMedium\n )\n throw new Error(\"Widget Load event missing required properties\");\n\n params = {\n tenantAlias: sqh.tenantAlias,\n externalAccountId: sqh.accountId,\n externalUserId: sqh.userId,\n engagementMedium: sqh.engagementMedium,\n programId: sqh.programId,\n };\n } else {\n const { analytics, mode } = sqh;\n params = {\n tenantAlias: analytics.attributes.tenant,\n externalAccountId: analytics.attributes.accountId,\n externalUserId: analytics.attributes.userId,\n engagementMedium: mode.widgetMode,\n };\n }\n\n this.analyticsApi\n .pushAnalyticsLoadEvent(params)\n ?.then((response) => {\n _log(`${params.engagementMedium} loaded event recorded.`);\n })\n .catch((ex) => {\n _log(`ERROR: pushAnalyticsLoadEvent() ${ex}`);\n });\n }\n\n protected _shareEvent(sqh, medium) {\n if (sqh) {\n this.analyticsApi\n .pushAnalyticsShareClickedEvent({\n tenantAlias: sqh.analytics.attributes.tenant,\n externalAccountId: sqh.analytics.attributes.accountId,\n externalUserId: sqh.analytics.attributes.userId,\n engagementMedium: sqh.mode.widgetMode,\n shareMedium: medium,\n })\n .then((response) => {\n _log(\n `${sqh.mode.widgetMode} share ${medium} event recorded. ${response}`\n );\n })\n .catch((ex) => {\n _log(`ERROR: pushAnalyticsShareClickedEvent() ${ex}`);\n });\n }\n }\n\n protected _error(rs, mode = \"modal\", style = \"\") {\n const errorTemplate = `<!DOCTYPE html>\n <!--[if IE 7]><html class=\"ie7 oldie\" lang=\"en\"><![endif]-->\n <!--[if IE 8]><html class=\"ie8 oldie\" lang=\"en\"><![endif]-->\n <!--[if gt IE 8]><!--><html lang=\"en\"><!--<![endif]-->\n <head>\n <link rel=\"stylesheet\" media=\"all\" href=\"https://fast.ssqt.io/assets/css/widget/errorpage.css\">\n <style>\n ${style}\n </style>\n </head>\n <body>\n\n <div class=\"squatch-container ${mode}\" style=\"width:100%\">\n <div class=\"errorheader\">\n <button type=\"button\" class=\"close\" onclick=\"window.frameElement.squatchJsApi.close();\">&times;</button>\n <p class=\"errortitle\">Error</p>\n </div>\n <div class=\"errorbody\">\n <div class=\"sadface\"><img src=\"https://fast.ssqt.io/assets/images/face.png\"></div>\n <h4>Our referral program is temporarily unavailable.</h4><br>\n <p>Please reload the page or check back later.</p>\n <p>If the persists please contact our support team.</p>\n <br>\n <br>\n <div class=\"right-align errtxt\">\n Error Code: ${rs}\n </div>\n </div>\n </div>\n </body>\n </html>`;\n\n return errorTemplate;\n }\n\n protected async _findInnerContainer(\n frame: HTMLIFrameElement\n ): Promise<Element> {\n const { contentWindow } = frame;\n if (!contentWindow)\n throw new Error(\"Squatch.js frame inner frame is empty\");\n const frameDoc = contentWindow.document;\n\n function search() {\n const containers = frameDoc.getElementsByTagName(\"sqh-global-container\");\n const legacyContainers =\n frameDoc.getElementsByClassName(\"squatch-container\");\n const fallback =\n containers.length > 0\n ? containers[0]\n : legacyContainers.length > 0\n ? legacyContainers[0]\n : null;\n return fallback;\n }\n\n let found: Element | null = null;\n for (let i = 0; i < 5; i++) {\n found = search();\n if (found) break;\n await delay(100);\n }\n if (!found) {\n return frameDoc.body;\n }\n return found;\n }\n\n /**\n * Reloads the current widget, makes updated request to API and renders result.\n * Primarily for Classic widgets with registration\n * @param param0 Form field values\n * @param jwt JWT for API authentication\n */\n reload({ email, firstName, lastName }, jwt) {\n const frame = this._findFrame();\n if (!frame) throw new Error(\"Could not find widget iframe\");\n const frameWindow = frame.contentWindow;\n\n const engagementMedium = this.context.engagementMedium || \"POPUP\";\n\n if (!frameWindow) {\n throw new Error(\"Frame needs a content window\");\n }\n\n let response;\n\n if (this.context.type === \"upsert\") {\n if (!this.context.user) throw new Error(\"Can't reload without user ids\");\n\n let userObj = {\n email: email || null,\n firstName: firstName || null,\n lastName: lastName || null,\n\n id: this.context.user!.id,\n accountId: this.context.user!.accountId,\n };\n\n response = this.widgetApi.upsertUser({\n user: userObj,\n engagementMedium,\n widgetType: this.type,\n jwt,\n });\n } else if (this.context.type === \"passwordless\") {\n response = this.widgetApi.render({\n user: undefined,\n engagementMedium,\n widgetType: this.type,\n jwt: undefined,\n });\n } else {\n throw new Error(\"can't reload an error widget\");\n }\n\n response\n .then(({ template }) => {\n if (template) {\n this.content = template;\n\n // Support for classic widget registration forms\n this.__deprecated__register(\n frame,\n { email, engagementMedium },\n () => {\n this.load();\n\n // @ts-ignore -- open exists in the PopupWidget, so this call will always exist when it's called.\n engagementMedium === \"POPUP\" && this.open();\n }\n );\n }\n })\n .catch(({ message }) => {\n _log(`${message}`);\n });\n }\n\n private __deprecated__register(frame, params, onClick) {\n const frameWindow = frame.contentWindow;\n const frameDoc = frameWindow.document;\n const showStatsBtn = frameDoc.createElement(\"button\");\n const registerForm = frameDoc.getElementsByClassName(\"squatch-register\")[0];\n\n if (registerForm) {\n showStatsBtn.className = \"btn btn-primary\";\n showStatsBtn.id = \"show-stats-btn\";\n\n showStatsBtn.textContent =\n this.type === \"REFERRER_WIDGET\" ? \"Show Stats\" : \"Show Reward\";\n\n const widgetStyle =\n params.engagementMedium === \"POPUP\"\n ? \"margin-top: 10px; max-width: 130px; width: 100%;\"\n : \"margin-top: 10px;\";\n\n showStatsBtn.setAttribute(\"style\", widgetStyle);\n showStatsBtn.onclick = onClick;\n\n // @ts-ignore -- expect register form to be a stylable element\n registerForm.style.paddingTop = \"30px\";\n registerForm.innerHTML = `<p><strong>${params.email}</strong><br>Has been successfully registered</p>`;\n registerForm.appendChild(showStatsBtn);\n }\n }\n}\n\nfunction delay(duration) {\n return new Promise((resolve) => {\n setTimeout(resolve, duration);\n });\n}\n","/*!\n * domready (c) Dustin Diaz 2014 - License MIT\n *\n */\nexport function domready(targetDoc, fn) {\n let fns = [];\n let listener;\n let doc = targetDoc;\n let hack = doc.documentElement.doScroll;\n let domContentLoaded = \"DOMContentLoaded\";\n let loaded = (hack ? /^loaded|^c/ : /^loaded|^i|^c/).test(doc.readyState);\n\n if (!loaded)\n doc.addEventListener(\n domContentLoaded,\n (listener = () => {\n doc.removeEventListener(domContentLoaded, listener);\n loaded = true;\n while ((listener = fns.shift())) listener();\n })\n );\n\n // @ts-ignore\n return loaded ? setTimeout(fn, 0) : fns.push(fn);\n}\n","// @ts-check\n\nimport { debug } from \"debug\";\nimport Widget, { Params } from \"./Widget\";\nimport { domready } from \"../utils/domready\";\nimport { UpsertWidgetContext } from \"../types\";\n\nconst _log = debug(\"squatch-js:EMBEDwidget\");\n\n/**\n * An EmbedWidget is displayed inline in part of your page.\n *\n * To create an EmbedWidget use {@link Widgets}\n *\n * @example\n * const widget = new EmbedWidget({ ... })\n * widget.load() // Loads widget into the DOM\n * widget.open() // Makes the iframe container visible\n * widget.close() // Hides the iframe container\n */\nexport default class EmbedWidget extends Widget {\n constructor(params: Params, container?: HTMLElement | string) {\n super(params);\n\n if (container) this.container = container;\n }\n\n async load() {\n const frame = this._createFrame();\n const element = this._findElement();\n\n if (this.context?.container) {\n // Custom container is used\n element.style.visibility = \"hidden\";\n element.style.height = \"0\";\n element.style[\"overflow-y\"] = \"hidden\";\n }\n\n if (this.container) {\n if (element.shadowRoot) {\n if (element.shadowRoot.lastChild?.nodeName === \"IFRAME\") {\n element.shadowRoot.replaceChild(frame, element.shadowRoot.lastChild);\n } else {\n element.shadowRoot.appendChild(frame);\n }\n }\n // Widget reloaded - replace existing element\n else if (element.firstChild) {\n element.replaceChild(frame, element.firstChild);\n // Add iframe for the first time\n } else {\n element.appendChild(frame);\n }\n } else if (!element.firstChild || element.firstChild.nodeName === \"#text\") {\n element.appendChild(frame);\n }\n\n const { contentWindow } = frame;\n if (!contentWindow) {\n throw new Error(\"Frame needs a content window\");\n }\n\n const frameDoc = contentWindow.document;\n frameDoc.open();\n frameDoc.write(this.content);\n frameDoc.write(\n `<script src=\"${this.npmCdn}/resize-observer-polyfill@1.5.x\"></script>`\n );\n frameDoc.close();\n domready(frameDoc, async () => {\n const _sqh = contentWindow.squatch || contentWindow.widgetIdent;\n\n // @ts-ignore -- number will be cast to string by browsers\n frame.height = frameDoc.body.scrollHeight;\n\n // Adjust frame height when size of body changes\n /* istanbul ignore next: hard to test */\n const ro = new contentWindow[\"ResizeObserver\"]((entries) => {\n for (const entry of entries) {\n const { height } = entry.contentRect;\n // @ts-ignore -- number will be cast to string by browsers\n frame.height = height;\n }\n });\n\n const container = await this._findInnerContainer(frame);\n ro.observe(container);\n\n if (this._shouldFireLoadEvent()) {\n this._loadEvent(_sqh);\n _log(\"loaded\");\n } else if (frameDoc) {\n this._attachLoadEventListener(frameDoc, _sqh);\n }\n });\n }\n\n /**\n * Un-hide if element is available and refresh data\n */\n open() {\n const frame = this._findFrame();\n if (!frame) return _log(\"no target element to open\");\n if (!frame.contentWindow) return _log(\"Frame needs a content window\");\n\n const element = this._findElement();\n\n element.style.visibility = \"unset\";\n element.style.height = \"auto\";\n element.style[\"overflow-y\"] = \"auto\";\n\n frame.contentWindow.document.dispatchEvent(new CustomEvent(\"sq:refresh\"));\n const _sqh = frame.contentWindow.squatch || frame.contentWindow.widgetIdent;\n\n if ((this.context as UpsertWidgetContext).user) {\n this._loadEvent(_sqh);\n _log(\"loaded\");\n } else {\n if (!frame.contentDocument) return;\n this._attachLoadEventListener(frame.contentDocument, _sqh);\n }\n }\n\n close() {\n const frame = this._findFrame();\n if (!frame) return _log(\"no target element to close\");\n\n if (frame.contentDocument)\n this._detachLoadEventListener(frame.contentDocument);\n\n const element = this._findElement();\n\n element.style.visibility = \"hidden\";\n element.style.height = \"0\";\n element.style[\"overflow-y\"] = \"hidden\";\n\n _log(\"Embed widget closed\");\n }\n\n protected _error(rs, mode = \"embed\", style = \"\") {\n return super._error(rs, mode, style);\n }\n\n private _shouldFireLoadEvent() {\n const noContainer = !this.container;\n const isComponent =\n this.container instanceof HTMLElement &&\n (this.container.tagName.startsWith(\"SQUATCH-\") ||\n this.container.tagName.startsWith(\"IMPACT-\"));\n const isVerified = !!(this.context as UpsertWidgetContext).user;\n\n return isVerified && (noContainer || isComponent);\n }\n\n show = this.open;\n hide = this.close;\n}\n","// @ts-check\n\nimport { debug } from \"debug\";\nimport { domready } from \"../utils/domready\";\nimport Widget, { Params } from \"./Widget\";\nimport DeclarativeWidget from \"./declarative/DeclarativeWidget\";\nimport { UpsertWidgetContext } from \"../types\";\n\nconst _log = debug(\"squatch-js:POPUPwidget\");\n\nlet popupId = 0;\n/**\n * The PopupWidget is used to display popups (also known as \"Modals\").\n * Popups widgets are rendered on top of other elements in a page.\n *\n * To create a PopupWidget use {@link Widgets}\n *\n * @example\n * const widget = new PopupWidget({ ... })\n * widget.load() // Loads the widget into a dialog element\n * widget.open() // Opens the dialog element\n * widget.close() // Hides the dialog element\n */\nexport default class PopupWidget extends Widget {\n trigger: string | null;\n id: string;\n\n constructor(params: Params, trigger: string | null = \".squatchpop\") {\n super(params);\n\n this.trigger = trigger;\n\n if (this.container) {\n this.id = \"squatchModal\";\n } else {\n this.id = popupId === 0 ? `squatchModal` : `squatchModal__${popupId}`;\n popupId = popupId + 1;\n }\n\n document.head.insertAdjacentHTML(\n \"beforeend\",\n `<style>#${this.id}::-webkit-scrollbar { display: none; }</style>`\n );\n }\n\n _initialiseCTA() {\n if (!this.trigger) return;\n\n let triggerElement;\n try {\n triggerElement /* HTMLButton */ =\n document.querySelector(this.trigger) ||\n document.querySelector(\".impactpop\");\n\n if (this.trigger && !triggerElement)\n _log(\"No element found with trigger selector\", this.trigger);\n } catch {\n _log(\"Not a valid selector\", this.trigger);\n }\n\n // Trigger is optional\n if (triggerElement) {\n triggerElement.onclick = () => {\n this.open();\n };\n }\n }\n\n _createPopupDialog(): HTMLDialogElement {\n const dialog = document.createElement(\"dialog\");\n dialog.id = this.id;\n dialog.setAttribute(\n \"style\",\n \"width: 100%; max-width: 500px; border: none; padding: 0;\"\n );\n const onClick = (e) => {\n e.stopPropagation();\n if (e.target === dialog) dialog.close();\n };\n\n dialog.addEventListener(\"click\", onClick);\n\n return dialog;\n }\n\n async load() {\n const frame = this._createFrame();\n this._initialiseCTA();\n\n const element = this.container ? this._findElement() : document.body;\n\n const dialogParent = element.shadowRoot || element;\n const dialog = this._createPopupDialog();\n dialog.appendChild(frame);\n\n if (dialogParent.lastChild?.nodeName === \"DIALOG\") {\n // Was reloaded\n dialogParent.replaceChild(dialog, dialogParent.lastChild);\n } else {\n // First time rendering\n dialogParent.appendChild(dialog);\n }\n\n const { contentWindow } = frame;\n if (!contentWindow) {\n throw new Error(\"Frame needs a content window\");\n }\n\n const frameDoc = contentWindow.document;\n frameDoc.open();\n frameDoc.write(this.content);\n frameDoc.write(\n `<script src=\"${this.npmCdn}/resize-observer-polyfill@1.5.x\"></script>`\n );\n frameDoc.close();\n _log(\"Popup template loaded into iframe\");\n await this._setupResizeHandler(frame);\n }\n\n protected async _setupResizeHandler(frame: HTMLIFrameElement) {\n const { contentWindow } = frame;\n\n if (!contentWindow) {\n throw new Error(\"Frame needs a content window\");\n }\n\n const frameDoc = contentWindow.document;\n\n // Adjust frame height when size of body changes\n domready(frameDoc, async () => {\n frameDoc.body.style.overflowY = \"hidden\";\n frame.height = `${frameDoc.body.offsetHeight}px`;\n // Adjust frame height when size of body changes\n const ro = new contentWindow[\"ResizeObserver\"]((entries) => {\n for (const entry of entries) {\n const { top, bottom } = entry.contentRect;\n\n const computedHeight = bottom + top;\n frame.height = computedHeight + \"\";\n\n // Don't let anything else set the height of this element\n entry.target.style = ``;\n }\n });\n ro.observe(await this._findInnerContainer(frame));\n });\n }\n\n open() {\n const element = this.container ? this._findElement() : document.body;\n const parent = element.shadowRoot || element;\n const dialog = parent.querySelector(`#${this.id}`) as HTMLDialogElement;\n if (!dialog) throw new Error(\"Could not determine container div\");\n\n dialog.showModal();\n\n const frame = this._findFrame();\n if (!frame) throw new Error(\"Could not find iframe\");\n const { contentWindow } = frame;\n if (!contentWindow) throw new Error(\"Squatch.js has an empty iframe\");\n const frameDoc = contentWindow.document;\n\n // Adjust frame height when size of body changes\n domready(frameDoc, () => {\n const _sqh = contentWindow.squatch || contentWindow.widgetIdent;\n frame.contentDocument?.dispatchEvent(new CustomEvent(\"sq:refresh\"));\n\n if ((this.context as UpsertWidgetContext).user) {\n this._loadEvent(_sqh);\n _log(\"Popup opened\");\n } else {\n this._attachLoadEventListener(frameDoc, _sqh);\n }\n });\n }\n\n close() {\n const frame = this._findFrame();\n if (frame?.contentDocument)\n this._detachLoadEventListener(frame.contentDocument);\n\n const element = this.container ? this._findElement() : document.body;\n const parent = element.shadowRoot || element;\n const dialog = parent.querySelector(`#${this.id}`) as HTMLDialogElement;\n if (!dialog) throw new Error(\"Could not determine container div\");\n\n dialog.close();\n\n _log(\"Popup closed\");\n }\n\n protected _clickedOutside({ target }) {}\n\n protected _error(rs, mode = \"modal\", style = \"\") {\n const _style =\n \"body { margin: 0; } .modal { box-shadow: none; border: 0; }\";\n\n return super._error(rs, mode, style || _style);\n }\n\n show = this.open;\n hide = this.close;\n}\n","import { debug } from \"debug\";\nimport WidgetApi from \"../api/WidgetApi\";\nimport {\n ConfigOptions,\n EngagementMedium,\n WidgetConfig,\n WidgetContext,\n WidgetResult,\n WithRequired,\n} from \"../types\";\nimport {\n validateConfig,\n validatePasswordlessConfig,\n validateWidgetConfig,\n} from \"../utils/validate\";\nimport EmbedWidget from \"./EmbedWidget\";\nimport PopupWidget from \"./PopupWidget\";\nimport Widget, { Params } from \"./Widget\";\n\nconst _log = debug(\"squatch-js:widgets\");\n\n/**\n * `Widgets` is a factory for creating widgets. It's possible to build your own widgets using the\n * {@link WidgetApi} but most people will prefer to use these easy methods.\n * @class\n */\nexport default class Widgets {\n /**\n * Instance of {@link WidgetApi}\n */\n api: WidgetApi;\n\n /**\n * Tenant alias of SaaSquatch tenant\n */\n tenantAlias: string;\n\n /**\n * SaaSquatch domain for API requests\n * @default \"https://app.referralsaasquatch.com\"\n */\n domain: string;\n\n /**\n * Hosted CDN for npm packages\n * @default \"https://fast.ssqt.io/npm\"\n */\n npmCdn: string;\n\n /**\n * Initialize a new {@link Widgets} instance.\n *\n * @param {ConfigOptions} config Config details\n *\n * @example <caption>Browser example</caption>\n * var widgets = new squatch.Widgets({tenantAlias:'test_12b5bo1b25125'});\n *\n * @example <caption>Browserify/Webpack example</caption>\n * var Widgets = require('@saasquatch/squatch-js').Widgets;\n * var widgets = new Widgets({tenantAlias:'test_12b5bo1b25125'});\n *\n * @example <caption>Babel+Browserify/Webpack example</caption>\n * import {Widgets} from '@saasquatch/squatch-js';\n * let widgets = new Widgets({tenantAlias:'test_12b5bo1b25125'});\n */\n constructor(configin: ConfigOptions) {\n const config = validateConfig(configin);\n this.tenantAlias = config.tenantAlias;\n this.domain = config.domain;\n this.npmCdn = config.npmCdn;\n this.api = new WidgetApi(config);\n }\n\n /**\n * This function calls the {@link WidgetApi.upsertUser} method, and it renders\n * the widget if it is successful. Otherwise it shows the \"error\" widget.\n *\n * @param {Object} config Config details\n * @param {Object} config.user The user details\n * @param {string} config.user.id The user id\n * @param {string} config.user.accountId The user account id\n * @param {WidgetType} config.widgetType The content of the widget\n * @param {EngagementMedium} config.engagementMedium How to display the widget\n * @param {string} config.jwt the JSON Web Token (JWT) that is used to validate the data (can be disabled)\n * @param {HTMLElement | string | undefined} config.container Element to load the widget into\n * @param {string | undefined} config.trigger Trigger element for opening the popup widget\n *\n * @return {Promise<WidgetResult>} json object if true, with a Widget and user details\n */\n async upsertUser(config: WithRequired<WidgetConfig, \"user\">) {\n const raw = config as unknown;\n const clean = validateWidgetConfig(raw) as WithRequired<\n WidgetConfig,\n \"user\"\n >;\n try {\n const response = await this.api.upsertUser(clean);\n return {\n widget: this._renderWidget(response, clean, {\n type: \"upsert\",\n user: clean.user,\n engagementMedium: config.engagementMedium,\n container: config.container,\n trigger: config.trigger,\n }),\n user: response.user,\n };\n } catch (err) {\n _log(err);\n if (err.apiErrorCode) {\n this._renderErrorWidget(err, config.engagementMedium);\n }\n throw new Error(err);\n }\n }\n\n /**\n * This function calls the {@link WidgetApi.render} method, and it renders\n * the widget if it is successful. Otherwise it shows the \"error\" widget.\n *\n * @param {Object} config Config details\n * @param {Object} config.user The user details\n * @param {string} config.user.id The user id\n * @param {string} config.user.accountId The user account id\n * @param {WidgetType} config.widgetType The content of the widget\n * @param {EngagementMedium} config.engagementMedium How to display the widget\n * @param {string} config.jwt the JSON Web Token (JWT) that is used\n * to validate the data (can be disabled)\n *\n * @return {Promise<WidgetResult>} json object if true, with a Widget and user details\n */\n async render(config: WidgetConfig): Promise<WidgetResult | undefined> {\n const raw = config as unknown;\n const clean = validatePasswordlessConfig(raw);\n\n try {\n const response = await this.api.render(clean);\n\n return {\n widget: this._renderWidget(response, clean, {\n type: \"passwordless\",\n engagementMedium: clean.engagementMedium,\n container: clean.container,\n trigger: clean.trigger,\n }),\n user: response.user,\n };\n } catch (err) {\n if (err.apiErrorCode) {\n this._renderErrorWidget(err, clean.engagementMedium);\n }\n throw new Error(err);\n }\n }\n\n /**\n * Autofills a referral code into an element when someone has been referred.\n * Uses {@link WidgetApi.squatchReferralCookie} behind the scenes.\n *\n * @param selector Element class/id selector, or a callback function\n * @returns\n */\n async autofill(selector: string | Function): Promise<void> {\n const input = selector as unknown;\n if (typeof input === \"function\") {\n try {\n const response = await this.api.squatchReferralCookie();\n input(response);\n } catch (e) {\n _log(\"Autofill error\", e);\n throw new Error(e);\n }\n\n return;\n }\n if (typeof input !== \"string\")\n throw new Error(\"Autofill accepts a string or function\");\n\n let elems = document.querySelectorAll(input);\n let elem;\n if (elems.length > 0) {\n // Only use the first element found\n elem = elems[0];\n } else {\n _log(\"Element id/class or function missing\");\n throw new Error(\"Element id/class or function missing\");\n }\n\n try {\n const response = await this.api.squatchReferralCookie();\n elem.value = response.codes[0];\n } catch (e) {\n throw new Error(e);\n }\n }\n\n /**\n * @hidden\n * @param {Object} response The json object return from the WidgetApi\n * @param {Object} config Config details\n * @param {string} config.widgetType The widget type (REFERRER_WIDGET, CONVERSION_WIDGET)\n * @param {string} config.engagementMedium (POPUP, EMBED)\n * @returns {Widget} widget (PopupWidget or EmbedWidget)\n */\n private _renderWidget(\n response: any,\n config: WidgetConfig,\n context: WidgetContext\n ) {\n _log(\"Rendering Widget...\");\n if (!response) throw new Error(\"Unable to get a response\");\n\n let widget;\n let displayOnLoad = !!config.displayOnLoad;\n const opts = response.jsOptions || {};\n\n const params = {\n content: response.template,\n type: config.widgetType || opts.widget?.defaultWidgetType,\n api: this.api,\n domain: this.domain,\n npmCdn: this.npmCdn,\n context: context,\n };\n\n if (opts.widgetUrlMappings) {\n opts.widgetUrlMappings.forEach((rule) => {\n if (Widgets._matchesUrl(rule.url)) {\n if (\n rule.widgetType !== \"CONVERSION_WIDGET\" ||\n response.user?.referredBy?.code\n ) {\n displayOnLoad = rule.displayOnLoad;\n _log(`Display ${rule.widgetType} on ${rule.url}`);\n } else {\n _log(\n `Don't display ${rule.widgetType} when no referral on widget rule match ${rule.url}`\n );\n }\n }\n });\n }\n\n if (opts.fuelTankAutofillUrls) {\n _log(\"We found a fuel tank autofill!\");\n\n opts.fuelTankAutofillUrls.forEach(({ url, formSelector }) => {\n if (Widgets._matchesUrl(url)) {\n _log(\"Fuel Tank URL matches\");\n if (response.user?.referredBy?.code) {\n const formAutofill = document.querySelector(formSelector);\n\n if (formAutofill) {\n formAutofill.value =\n response.user.referredBy.referredReward?.fuelTankCode || \"\";\n } else {\n _log(\n new Error(\n `Element with id/class ${formSelector} was not found.`\n )\n );\n }\n }\n }\n });\n }\n\n if (config.engagementMedium === \"EMBED\") {\n widget = this._renderEmbedWidget(params);\n } else {\n widget = this._renderPopupWidget(params);\n if (displayOnLoad) widget.open();\n }\n\n return widget;\n }\n\n private _renderPopupWidget(params: Params) {\n const widget = new PopupWidget(params, params.context.trigger);\n widget.load();\n\n return widget;\n }\n\n private _renderEmbedWidget(params) {\n const widget = new EmbedWidget(params, params.context.container);\n widget.load();\n\n return widget;\n }\n\n /**\n * @hidden\n * @param {Object} error The json object containing the error details\n * @param {string} em The engagementMedium\n * @returns {void}\n */\n private _renderErrorWidget(\n props: { apiErrorCode: string; rsCode: string; message: string },\n em: EngagementMedium = \"POPUP\"\n ) {\n const { apiErrorCode, rsCode, message } = props;\n _log(new Error(`${apiErrorCode} (${rsCode}) ${message}`));\n\n const params: Params = {\n content: \"error\",\n rsCode,\n api: this.api,\n domain: this.domain,\n npmCdn: this.npmCdn,\n type: \"ERROR_WIDGET\",\n context: { type: \"error\" },\n };\n\n let widget: Widget;\n\n if (em === \"EMBED\") {\n widget = new EmbedWidget(params);\n widget.load();\n } else if (em === \"POPUP\") {\n widget = new PopupWidget(params);\n widget.load();\n }\n }\n\n /**\n * @hidden\n * @param {string} rule A regular expression\n * @returns {boolean} true if rule matches Url, false otherwise\n */\n private static _matchesUrl(rule) {\n // If there were no matches, null is returned.\n return window.location.href.match(new RegExp(rule)) ? true : false;\n }\n}\n","import { doPost } from \"../utils/io\";\nimport { ConfigOptions, JWT } from \"../types\";\nimport { isObject, validateConfig } from \"../utils/validate\";\n\ntype TrackOptions = { jwt?: JWT };\n\ninterface UserEventInput {\n userId: string;\n accountId: string;\n idempotencyKey?: string;\n events: UserEventDataInput[];\n}\n\ninterface UserEventDataInput {\n key: string; // Require -- the name of the event\n id?: string; // Optional -- a globally unique ID for the event\n fields?: object; // Arbitrary JSON data\n dateTriggered?: number; // The date triggered\n}\n\n/**\n *\n * The EventsApi class is a wrapper around the open endpoints of the SaaSquatch REST API.\n *\n */\nexport default class EventsApi {\n tenantAlias: string;\n domain: string;\n /**\n * Initialize a new {@link EventsApi} instance.\n *\n * @param {ConfigOptions} config Config details\n *\n * @example <caption>Browser example</caption>\n * var squatchApi = new squatch.EventsApi({tenantAlias:'test_12b5bo1b25125'});\n *\n * @example <caption>Browserify/Webpack example</caption>\n * var EventsApi = require('@saasquatch/squatch-js').EventsApi;\n * var squatchApi = new EventsApi({tenantAlias:'test_12b5bo1b25125'});\n *\n * @example <caption>Babel+Browserify/Webpack example</caption>\n * import {EventsApi} from '@saasquatch/squatch-js';\n * let squatchApi = new EventsApi({tenantAlias:'test_12b5bo1b25125'});\n */\n constructor(config: ConfigOptions) {\n const raw = config as unknown | undefined; // Flags that we need to validate anything we use from this type\n const clean = validateConfig(raw);\n this.tenantAlias = clean.tenantAlias;\n this.domain = clean.domain;\n }\n\n /**\n * Track an event for a user\n *\n * @param params Parameters for request\n * @param options.jwt the JSON Web Token (JWT) that is used to authenticate the user\n *\n * @return An ID to confirm the event has been accepted for asynchronous processing\n */\n track(params: UserEventInput, options?: TrackOptions): Promise<any> {\n const raw = params as unknown;\n const rawOpts = options as unknown;\n const body = _validateEvent(raw);\n const { jwt } = _validateTrackOptions(rawOpts);\n const ta = encodeURIComponent(this.tenantAlias);\n const userId = encodeURIComponent(body.userId);\n const accountId = encodeURIComponent(body.accountId);\n const path = `/api/v1/${ta}/open/account/${accountId}/user/${userId}/events`;\n const url = this.domain + path;\n return doPost(url, JSON.stringify(body), jwt);\n }\n}\n\nfunction _validateEvent(raw: unknown | undefined): UserEventInput {\n if (!isObject(raw)) throw new Error(\"tracking parameter must be an object\");\n if (!raw?.[\"accountId\"]) throw new Error(\"accountId field is required\");\n if (!raw?.[\"events\"]) throw new Error(\"events field is required\");\n if (!raw?.[\"userId\"]) throw new Error(\"userId field is required\");\n\n const clean = raw as UserEventInput;\n if (!Array.isArray(clean.events))\n throw new Error(\"'events' should be an array\");\n return clean;\n}\n\nfunction _validateTrackOptions(raw: unknown): TrackOptions {\n if (!isObject(raw)) throw new Error(\"'options' should be an object\");\n return raw as TrackOptions;\n}\n","import { DEFAULT_NAMESPACE, IMPACT_NAMESPACE } from \"./globals\";\nimport { ConfigOptions } from \"./types\";\n\ndeclare global {\n interface Window {\n __squatchjsNamespace?: string;\n _squatch?: {\n ready: any[];\n };\n impactOnReady?: () => {};\n squatchOnReady?: () => {};\n\n squatch: any;\n widgetIdent: any;\n\n squatchTenant: string;\n squatchToken: string;\n squatchConfig: Omit<ConfigOptions, \"tenantAlias\">;\n\n impactToken: string;\n impactConfig: Omit<ConfigOptions, \"tenantAlias\">;\n }\n}\n/** @hidden */\nexport default function asyncLoad() {\n const namespace = window[IMPACT_NAMESPACE]\n ? IMPACT_NAMESPACE\n : DEFAULT_NAMESPACE;\n const cached = window[\"_\" + namespace]?.ready || [];\n const declarativeCache = window.impactOnReady || window.squatchOnReady;\n const readyFns = [...cached, declarativeCache].filter((a) => !!a);\n\n\n // Run all of this in a setTimeout because we need to wait for the squatch module to finish loading\n setTimeout(() => {\n // Exit early if module wasn't loaded onto window\n if (!window[DEFAULT_NAMESPACE]) return\n\n // Set window.impact as an alias for window.squatch.\n window[IMPACT_NAMESPACE] = window[DEFAULT_NAMESPACE];\n\n // Run all the ready functions in a set timeout to they happen after namespace aliasing.\n readyFns.forEach((cb) => cb());\n\n // Perform auto popup\n window[DEFAULT_NAMESPACE]._auto();\n\n // @ts-ignore -- intentionally deletes `_squatch` to cleanup initialization\n window[\"_\" + namespace] = undefined;\n delete window[\"_\" + namespace];\n }, 0);\n}\n","import { debug } from \"debug\";\nimport Cookies from \"js-cookie\";\n\n/** @hidden */\nconst _log = debug(\"squatch-js\");\n\nconst isObject = (item: any) =>\n typeof item === \"object\" && !Array.isArray(item);\n\nconst deepMerge = <A = Object, B = Object>(\n target: Object,\n source: Object\n): A & B => {\n const isDeep = (prop: string) =>\n isObject(source[prop]) &&\n target.hasOwnProperty(prop) &&\n isObject(target[prop]);\n const replaced = Object.getOwnPropertyNames(source)\n .map((prop) => ({\n [prop]: isDeep(prop)\n ? deepMerge(target[prop], source[prop])\n : source[prop],\n }))\n .reduce((a, b) => ({ ...a, ...b }), {});\n\n return {\n ...(target as Object),\n ...(replaced as Object),\n } as A & B;\n};\n\n// inspired by https://github.com/panva/jose/blob/3c4ad55c92bcd9cbc0512438819717d185c41fb2/src/util/decode_jwt.ts#L22\nexport function b64decode(input) {\n const binary = atob(input.replace(/_/g, \"/\").replace(/-/g, \"+\"));\n\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n return new TextDecoder(\"utf8\").decode(bytes);\n}\n\n// Suggestion from https://developer.mozilla.org/en-US/docs/Glossary/Base64#the_unicode_problem\nexport function b64encode(input) {\n const encodedInput = new TextEncoder().encode(input);\n\n const binary = Array.from(encodedInput, (byte) =>\n String.fromCodePoint(byte)\n ).join(\"\");\n\n return btoa(binary).replace(/=/g, \"\").replace(/\\+/g, \"-\").replace(/\\//g, \"_\");\n}\n\n// https://stackoverflow.com/a/11319865\nfunction getTopDomain() {\n var i,\n h,\n weird_cookie = \"weird_get_top_level_domain=cookie\",\n hostname = document.location.hostname.split(\".\");\n for (i = hostname.length - 1; i >= 0; i--) {\n h = hostname.slice(i).join(\".\");\n document.cookie = weird_cookie + \";domain=.\" + h + \";\";\n if (document.cookie.indexOf(weird_cookie) > -1) {\n // We were able to store a cookie! This must be it\n document.cookie =\n weird_cookie.split(\"=\")[0] +\n \"=;domain=.\" +\n h +\n \";expires=Thu, 01 Jan 1970 00:00:01 GMT;\";\n return h;\n }\n }\n}\n\nexport function _pushCookie() {\n const queryString = window.location.search;\n const urlParams = new URLSearchParams(queryString);\n const refParam = urlParams.get(\"_saasquatch\") || \"\";\n\n // do nothing if no params\n if (refParam) {\n let paramsJSON = \"\",\n existingCookie = \"\",\n reEncodedCookie = \"\";\n\n try {\n paramsJSON = JSON.parse(b64decode(refParam));\n } catch (error) {\n _log(\"Unable to decode params\", error);\n // don't merge invalid params\n return;\n }\n\n try {\n existingCookie = JSON.parse(b64decode(Cookies.get(\"_saasquatch\")));\n _log(\"existing cookie\", existingCookie);\n } catch (error) {\n _log(\"Unable to retrieve cookie\", error);\n }\n\n // don't merge if there's no existing object\n try {\n const domain = getTopDomain();\n _log(\"domain retrieved:\", domain);\n if (existingCookie) {\n const newCookie = deepMerge(existingCookie, paramsJSON);\n reEncodedCookie = b64encode(JSON.stringify(newCookie));\n _log(\"cookie to store:\", newCookie);\n } else {\n reEncodedCookie = b64encode(JSON.stringify(paramsJSON));\n _log(\"cookie to store:\", paramsJSON);\n }\n Cookies.set(\"_saasquatch\", reEncodedCookie, {\n expires: 365,\n secure: false,\n sameSite: \"Lax\",\n domain,\n path: \"/\",\n });\n } catch (error) {\n _log(\"Unable to set cookie\", error);\n }\n }\n}\n","import { debug } from \"debug\";\nimport { ConfigOptions, WidgetConfig } from \"../types\";\nimport { b64decode } from \"./cookieUtils\";\n\n/** @hidden */\nconst _log = debug(\"squatch-js\");\n\nexport function _getAutoConfig(\n configIn?: ConfigOptions\n): { widgetConfig: WidgetConfig; squatchConfig: ConfigOptions } | undefined {\n const queryString = window.location.search;\n const urlParams = new URLSearchParams(queryString);\n const refParam = urlParams.get(\"_saasquatchExtra\") || \"\";\n\n if (!refParam) {\n _log(\"No _saasquatchExtra param\");\n return;\n }\n\n let raw: any;\n\n try {\n raw = JSON.parse(b64decode(refParam));\n } catch (e) {\n _log(\"Unable to decode _saasquatchExtra config\");\n return;\n }\n\n const { domain, tenantAlias, widgetConfig } = convertExtraToConfig(raw);\n if (!domain || !tenantAlias || !widgetConfig) {\n _log(\"_saasquatchExtra did not have an expected structure\");\n return undefined;\n }\n\n const { autoPopupWidgetType, ...rest } = widgetConfig;\n\n return {\n widgetConfig: {\n widgetType: autoPopupWidgetType,\n displayOnLoad: true,\n ...rest,\n },\n squatchConfig: {\n ...(configIn ? { configIn } : {}),\n domain,\n tenantAlias,\n },\n };\n}\n\n/**\n * Deconstructs _saasquatchExtra into domain, tenantAlias, and widgetConfig\n * @param obj {Record<string, any>} Expected to be of the form `{ [appDomain]: { [tenantAlias]: { autoPopupWidgetType: [widgetType], [rest]?: ... } } }`\n */\nexport function convertExtraToConfig(obj: Record<string, any>) {\n const _domain = Object.keys(obj || {})[0];\n const tenantAlias = Object.keys(obj?.[_domain] || {})[0];\n const widgetConfig = obj?.[_domain]?.[tenantAlias];\n\n // domain in _saasquatchExtra doesn't contain \"https://\"\n const domain = _domain ? `https://${_domain}` : undefined;\n\n return { domain, tenantAlias, widgetConfig };\n}\n","import { debug } from \"debug\";\nimport { User } from \"../types\";\nimport { b64decode } from \"./cookieUtils\";\nconst _log = debug(\"squatch-js:decodeUserJwt\");\n\nexport function decodeUserJwt(tokenStr: string): User | null {\n try {\n const base64Url = tokenStr.split(\".\")[1];\n if (base64Url === undefined) return null;\n const jsonStr = b64decode(base64Url);\n return JSON.parse(jsonStr)?.user;\n } catch (e) {\n _log(e);\n return null;\n }\n}\n","import debug from \"debug\";\nimport AnalyticsApi from \"../../api/AnalyticsApi\";\nimport WidgetApi from \"../../api/WidgetApi\";\nimport { ConfigOptions, DeclarativeConfigOptions, User } from \"../../types\";\nimport { decodeUserJwt } from \"../../utils/decodeUserJwt\";\nimport { getConfig, getToken } from \"../../utils/validate\";\nimport EmbedWidget from \"../EmbedWidget\";\nimport PopupWidget from \"../PopupWidget\";\nimport { DEFAULT_DOMAIN, DEFAULT_NPM_CDN } from \"../../globals\";\n\nconst _log = debug(\"squatch-js:DeclarativeWidget\");\n\n/**\n * Abstract class for building web-components that render SaaSquatch widgets to the DOM\n * @abstract\n * @example\n * class TestWidgetElement extends DeclarativeWidget {}\n * const testWidget = new TestWidgetElement()\n * testWidget.widgetType = 'w/widget-type'\n * testWidget.type = 'EMBED'\n * testWidget.renderWidget()\n */\nexport default abstract class DeclarativeWidget extends HTMLElement {\n /**\n * Configuration overrides\n * @default window.squatchConfig\n */\n config: DeclarativeConfigOptions | undefined;\n\n /**\n * Signed JWT containing user information\n * @default window.squatchToken\n */\n token: string | undefined;\n\n /**\n * Tenant alias of SaaSquatch tenant\n * @default window.squatchTenant\n */\n tenant: string | undefined;\n\n /**\n * widgetType of widget to load\n */\n widgetType: string | undefined;\n\n /**\n * Locale to render the widget in\n */\n locale: string | undefined;\n\n /**\n * Instance of {@link WidgetApi}\n */\n widgetApi: WidgetApi;\n\n /**\n * Instance of {@link AnalyticsApi}\n */\n analyticsApi: AnalyticsApi;\n\n /**\n * Instance of {@link EmbedWidget} or {@link PopupWidget}\n */\n widgetInstance: EmbedWidget | PopupWidget;\n\n /**\n * Determines whether to render the widget as an embedding widget or popup widget\n */\n type: \"EMBED\" | \"POPUP\";\n\n /**\n * Container element to contain the widget iframe\n * @default this\n */\n container: string | HTMLElement | undefined | null;\n element: HTMLElement | undefined;\n\n /**\n * Flag for if the component has been loaded or not\n * @hidden\n */\n loaded: boolean;\n\n constructor() {\n super();\n this.attachShadow({\n mode: \"open\",\n }).innerHTML = `<style>:host { display: block; }</style><slot></slot>`;\n\n this.config = getConfig();\n this.token = getToken();\n this.tenant = window.squatchTenant;\n this.container = this;\n }\n\n private _setupApis(config?: ConfigOptions) {\n if (!this.tenant) throw new Error(\"tenantAlias not provided\");\n\n this.widgetApi = new WidgetApi({\n tenantAlias: config?.tenantAlias || this.tenant,\n domain: config?.domain || this.config?.domain || DEFAULT_DOMAIN,\n });\n this.analyticsApi = new AnalyticsApi({\n domain: config?.domain || this.config?.domain || DEFAULT_DOMAIN,\n });\n }\n\n private async renderPasswordlessVariant() {\n this._setupApis();\n\n _log(\"Rendering as an Instant Access widget\");\n\n return await this.widgetApi\n .render({\n engagementMedium: this.type,\n widgetType: this.widgetType,\n locale: this.locale,\n })\n .then((res) => this._setWidget(res.template, { type: \"passwordless\" }))\n .catch(this.setErrorWidget);\n }\n\n private async renderUserUpsertVariant() {\n this._setupApis();\n\n const userObj = decodeUserJwt(this.token!);\n if (!userObj) {\n return this.setErrorWidget(Error(\"No user object in token.\"));\n }\n\n _log(\"Rendering as a Verified widget\");\n\n const widgetInstance = await this.widgetApi\n .upsertUser({\n user: userObj,\n locale: this.locale,\n engagementMedium: this.type,\n widgetType: this.widgetType,\n jwt: this.token,\n })\n .then((res) =>\n this._setWidget(res.template, { type: \"upsert\", user: userObj })\n )\n .catch(this.setErrorWidget);\n\n return widgetInstance;\n }\n\n private _setWidget = (\n template: any,\n config: { type: \"upsert\" | \"passwordless\"; user?: User }\n ) => {\n const params = {\n api: this.widgetApi,\n content: template,\n context: {\n type: config.type,\n user: config.user,\n container: this.container || undefined,\n engagementMedium: this.type,\n },\n type: this.widgetType!,\n domain: this.config?.domain || DEFAULT_DOMAIN,\n npmCdn: DEFAULT_NPM_CDN,\n container: this,\n };\n if (this.type === \"EMBED\") {\n return new EmbedWidget(params);\n } else {\n const useFirstChildTrigger = this.firstChild ? null : undefined;\n return new PopupWidget(params, useFirstChildTrigger);\n }\n };\n\n /**\n * Fetches widget content from SaaSquatch and builds a Widget instance to support rendering the widget in the DOM\n * @returns Instance of either {@link EmbedWidget} or {@link PopupWidget} depending on `this.type`\n * @throws Throws an Error if `widgetType` is undefined\n */\n async getWidgetInstance() {\n let widgetInstance: EmbedWidget | PopupWidget;\n this.widgetType = this.getAttribute(\"widget\") || undefined;\n this.locale = this.getAttribute(\"locale\") || this.locale;\n\n if (!this.widgetType) throw new Error(\"No widget has been specified\");\n\n if (!this.token) {\n widgetInstance = await this.renderPasswordlessVariant();\n } else {\n widgetInstance = await this.renderUserUpsertVariant();\n }\n\n this.widgetInstance = widgetInstance;\n if (this.widgetInstance)\n this.dispatchEvent(new CustomEvent(\"sq:widget-loaded\"));\n\n return widgetInstance;\n }\n\n /**\n * Calls {@link getWidgetInstance} to build the Widget instance and loads the widget iframe into the DOM\n */\n async renderWidget() {\n await this.getWidgetInstance();\n await this.widgetInstance.load();\n }\n\n /**\n * Builds a Widget instance for the default error widget\n * @returns Instance of either {@link EmbedWidget} or {@link PopupWidget} depending on `this.type`\n */\n setErrorWidget = (e: Error) => {\n const params = {\n api: this.widgetApi,\n content: \"error\",\n context: {\n type: \"error\" as const,\n container: this.container || undefined,\n },\n type: \"ERROR_WIDGET\",\n domain: this.config?.domain || DEFAULT_DOMAIN,\n npmCdn: DEFAULT_NPM_CDN,\n container: this,\n };\n if (this.type === \"EMBED\") {\n return new EmbedWidget(params);\n } else {\n const useFirstChildTrigger = this.firstChild ? null : undefined;\n return new PopupWidget(params, useFirstChildTrigger);\n }\n };\n\n /**\n * Calls `open` method of `widgetInstance`\n * @throws Throws an Error if called before the widget has loaded\n */\n open() {\n if (!this.widgetInstance) throw new Error(\"Widget has not loaded yet\");\n this.widgetInstance.open();\n }\n\n /**\n * Calls `close` method of `widgetInstance`\n * @throws Throws an Error if called before the widget has loaded\n */\n close() {\n if (!this.widgetInstance) throw new Error(\"Widget has not loaded yet\");\n this.widgetInstance.close();\n }\n\n reload = this.renderWidget;\n show = this.open;\n hide = this.close;\n}\n","import DeclarativeWidget from \"./DeclarativeWidget\";\n\n/**\n * Base class for `squatch-embed` web-component\n * @extends {DeclarativeWidget}\n * @class\n * @example\n * window.createCustomElement('squatch-embed', DeclarativeEmbedWidget)\n * const widget = document.querySelector('squatch-embed') as DeclarativeEmbedWidget\n * widget.open()\n * widget.close()\n * widget.reload()\n */\nexport class DeclarativeEmbedWidget extends DeclarativeWidget {\n constructor() {\n super();\n\n /**\n * @static\n */\n this.type = \"EMBED\";\n\n this.loaded = false;\n }\n\n static get observedAttributes() {\n return [\"widget\", \"locale\"];\n }\n\n attributeChangedCallback(attr: string, oldVal: string, newVal: string) {\n if (oldVal === newVal || !this.loaded) return; // nothing to do\n\n switch (attr) {\n case \"locale\":\n case \"widget\":\n this.connectedCallback();\n break;\n }\n }\n\n async connectedCallback() {\n this.loaded = true;\n this.container = this.getAttribute(\"container\");\n\n await this.renderWidget();\n\n const slot = (\n this.shadowRoot && Array.from(this.shadowRoot.children)\n )?.find((c) => c.tagName === \"SLOT\") as Node;\n if (slot) this.shadowRoot?.removeChild(slot);\n\n if (this.getAttribute(\"open\") !== null) this.open();\n }\n}\n\n/**\n * Base class for `squatch-popup` web-component\n * @extends {DeclarativeWidget}\n * @class\n * @example\n * window.createCustomElement('squatch-popup', DeclarativePopupWidget)\n * const widget = document.querySelector('squatch-popup') as DeclarativePopupWidget\n * widget.open()\n * widget.close()\n * widget.reload()\n */\nexport class DeclarativePopupWidget extends DeclarativeWidget {\n constructor() {\n super();\n\n /**\n * @static\n */\n this.type = \"POPUP\";\n\n this.loaded = false;\n\n this.addEventListener(\"click\", (e) => {\n e.stopPropagation();\n\n this.open();\n });\n }\n\n static get observedAttributes() {\n return [\"widget\", \"locale\"];\n }\n\n attributeChangedCallback(attr: string, oldVal: string, newVal: string) {\n if (oldVal === newVal || !this.loaded) return; // nothing to do\n\n switch (attr) {\n case \"locale\":\n case \"widget\":\n this.connectedCallback();\n break;\n }\n }\n\n async connectedCallback() {\n this.loaded = true;\n this.container = this.getAttribute(\"container\");\n\n await this.renderWidget();\n\n if (this.getAttribute(\"open\") !== null) this.open();\n }\n}\n\nclass SquatchEmbed extends DeclarativeEmbedWidget {}\nclass SquatchPopup extends DeclarativePopupWidget {}\nclass ImpactEmbed extends DeclarativeEmbedWidget {}\nclass ImpactPopup extends DeclarativePopupWidget {}\n\nif (!window.customElements.get(\"squatch-embed\"))\n window.customElements.define(\"squatch-embed\", SquatchEmbed);\nif (!window.customElements.get(\"impact-embed\"))\n window.customElements.define(\"impact-embed\", ImpactEmbed);\nif (!window.customElements.get(\"squatch-popup\"))\n window.customElements.define(\"squatch-popup\", SquatchPopup);\nif (!window.customElements.get(\"impact-popup\"))\n window.customElements.define(\"impact-popup\", ImpactPopup);\n","// @ts-check\nexport function help() {\n console.log(\n `Having trouble using Squatch.js? Go to https://docs.referralsaasquatch.com/developer/ for tutorials, references and error codes.`\n );\n}\n","// @ts-check\n/**\n * Squatch.js is the Referral SaaSquatch javascript SDK and a one-stop shop to\n * integrate a referral program into your website or web app.\n * It can show referral widgets on any website, track users, generate unique\n * referral short links and referral codes, and more.\n *\n * @module squatch\n */\nimport { debug } from \"debug\";\nimport Widgets from \"./widgets/Widgets\";\nimport EmbedWidget from \"./widgets/EmbedWidget\";\nimport PopupWidget from \"./widgets/PopupWidget\";\nimport WidgetApi from \"./api/WidgetApi\";\nimport EventsApi from \"./api/EventsApi\";\nimport asyncLoad from \"./async\";\nimport { ConfigOptions, WidgetConfig, WidgetResult } from \"./types\";\nimport { validateConfig } from \"./utils/validate\";\nimport { _pushCookie } from \"./utils/cookieUtils\";\nimport { _getAutoConfig } from \"./utils/utmUtils\";\nimport {\n DeclarativeEmbedWidget,\n DeclarativePopupWidget,\n} from \"./widgets/declarative/DeclarativeWidgets\";\nexport * from \"./types\";\nexport * from \"./docs\";\n\n// @ts-ignore\n// debug.disable(\"squatch-js*\");\n/** @hidden */\nconst _log = debug(\"squatch-js\");\n\nexport {\n Widgets,\n EmbedWidget,\n PopupWidget,\n DeclarativeEmbedWidget,\n DeclarativePopupWidget,\n WidgetApi,\n};\n/** @hidden */\nlet _api: WidgetApi | null = null;\n/** @hidden */\nlet _widgets: Widgets | null = null;\n/** @hidden */\nlet _events: EventsApi | null = null;\n\n/**\n * A static instance of the {@link WidgetApi} created when you call {@link #init init}.\n *\n * Read the {@link WidgetApi} docs.\n *\n * @returns WidgetApi static instance\n * @example\n * squatch.api().render({ ... })\n * squatch.api().upsertUser({ ... })\n * squatch.api().squatchReferralCookie()\n */\nexport function api(): WidgetApi | null {\n if (!_api) init({} as ConfigOptions);\n return _api;\n}\n\n/**\n * A static instance of the {@link Widgets} created when you call {@link #init init}.\n *\n * Read the {@link Widgets} docs.\n *\n * @returns static instance\n * @example\n * squatch.widgets().render({ widgetType: \"w/widget-type\" })\n * squatch.widgets().upsertUser({ user: { ... }, widgetType: \"w/widget-type\" })\n * squatch.widgets().autofill(\".referral-code\")\n */\nexport function widgets(): Widgets | null {\n if (!_widgets) init({} as ConfigOptions);\n return _widgets;\n}\n\n/**\n * A static instance of the {@link EventsApi} created when you call {@link #init init}.\n *\n * Read the {@link EventsApi} docs.\n *\n * @returns EventsApi static instance\n *\n * @example\n * squatch.events().track({ ... })\n */\nexport function events(): EventsApi | null {\n if (!_events) init({} as ConfigOptions);\n return _events;\n}\n\n/**\n * Entry-point for high level API to render a widget using the instance of {@link Widgets} created when you call {@link #init init}.\n *\n * Read the {@link Widgets.render} docs.\n *\n * @example\n * squatch.widget().then(res => {\n * const widget = res.widget\n * }).catch(e => console.error(\"Did not render widget:\", e))\n */\nexport function widget(\n widgetConfig: WidgetConfig\n): Promise<WidgetResult | undefined> | undefined {\n return widgets()?.render(widgetConfig);\n}\n\n/**\n * Extracts widget configuration from `_saasquatchExtra` UTM parameter. Initialises `squatch` and renders the widget as a {@link PopupWidget} via static instanct of {@link Widgets}.\n *\n * Called by default on startup via the loader script.\n * @private\n */\nexport function _auto(\n configIn: ConfigOptions\n): Promise<WidgetResult | undefined> | undefined {\n const configs = _getAutoConfig(configIn);\n\n if (configs) {\n const { squatchConfig, widgetConfig } = configs;\n init(squatchConfig);\n return widgets()?.render(widgetConfig);\n }\n}\n\n/**\n * Initializes the static `squatch` global. This sets up:\n *\n * - `squatch.api()` a static instance of the {@link WidgetApi}\n * - `squatch.widgets()` a static instance of {@link Widgets}\n * - `squatch.events()` a static instance of {@link EventsApi}\n *\n * @param config Configuration details\n *\n * @example\n * squatch.init({\n * tenantAlias:'test_basbtabstq51v',\n * });\n */\nexport function init(configIn: ConfigOptions): void {\n const raw = configIn as unknown | undefined;\n const config = validateConfig(raw);\n if (config.tenantAlias.match(\"^test\") || config.debug) {\n debug.enable(\"squatch-js*\");\n } else {\n debug.disable();\n }\n _log(\"initializing ...\");\n\n _api = new WidgetApi(config);\n _widgets = new Widgets(config);\n _events = new EventsApi(config);\n\n _log(\"Widget API instance\", _api);\n _log(\"Widgets instance\", _widgets);\n _log(\"Events API instance\", _events);\n}\n\n/**\n * Squatch.js can't start safely making operations until it's \"ready\". This\n * function detects that state.\n *\n * @param fn A callback once Squatch.js is ready.\n *\n * @example\n * squatch.ready(function() {\n * console.log(\"ready!\");\n * squatch.api().upsertUser({ ... });\n * });\n */\nexport function ready(fn: () => any): void {\n fn();\n}\n\n/**\n * Autofills a referral code into an element when someone has been referred.\n * Uses {@link WidgetApi.squatchReferralCookie} behind the scenes.\n *\n * @param {string} selector Element class/id\n * @returns {void}\n *\n * @example\n * squatch.autofill(\"input.referral-code\")\n * squatch.autofill(\"input#referral-code\")\n */\nexport function autofill(selector: string): void {\n // @ts-ignore -- will throw occasionally throw a null pointer exception at runtime\n widgets().autofill(selector);\n}\n\n/**\n * Manually set the _saasquatch cookie as a 1st party cookie if available as a URL parameter on the current page.\n * This runs automatically immediately when squatch-js is loaded, except when window.SaaSquatchDoNotAutoDrop is true.\n * Use this function manually if you have a single page application or custom routing that causes the `_saasquatch` URL parameter to not be set when Squatch.js loads.\n \n * It is safe to run this function multiple times. If the `_saasquatch` URL parameter is invalid or missing it will not clear the 1st party cookie.\n \n *\n * @returns {void}\n *\n * @example\n * squatch.pushCookie();\n */\nexport function pushCookie(): void {\n _pushCookie();\n}\n\ndeclare global {\n interface Window {\n SaaSquatchDoNotAutoDrop?: boolean;\n }\n}\n\nif (typeof document !== \"undefined\" && !window.SaaSquatchDoNotAutoDrop) {\n pushCookie();\n}\n\n// Show message if squatchjs has already been loaded on the page\nif (window[\"squatch\"]?.init)\n _log(\n \"Squatchjs is being loaded more than once. This may lead to multiple load events being sent, duplicated widgets, and inaccurate analytics.\"\n );\n\nif (typeof document !== \"undefined\") asyncLoad();\n"],"names":["DEFAULT_DOMAIN","DEFAULT_NPM_CDN","DEFAULT_NAMESPACE","IMPACT_NAMESPACE","validateConfig","_raw","Error","tenant","window","squatchTenant","config","getConfig","raw","tenantAlias","domain","npmCdn","debug","isObject","obj","Array","isArray","validateLocale","locale","test","validateWidgetConfig","validatePasswordlessConfig","getToken","impactToken","squatchToken","impactConfig","squatchConfig","doQuery","url","query","variables","jwt","token","headers","Accept","Authorization","location","href","res","fetch","method","body","JSON","stringify","ok","text","json","e","doGet","credentials","reply","parse","doPost","data","doPut","RENDER_WIDGET_QUERY","WidgetApi","constructor","referralCookie","squatchReferralCookie","clean","upsertUser","params","widgetType","engagementMedium","user","encodeURIComponent","accountId","userId","id","optionalParams","_buildParams","path","cookies","Cookies","get","render","navigator","language","replace","Promise","resolve","reject","renderWidget","_saasquatch","cookie","response","encodedCookie","queryParams","URLSearchParams","append","toString","AnalyticsApi","_validateAnalyticsConfig","pushAnalyticsLoadEvent","externalUserId","externalAccountId","programId","pushAnalyticsShareClickedEvent","shareMedium","_log","Widget","type","content","analyticsApi","widgetApi","context","container","loadEventListener","_error","rsCode","api","_findElement","element","document","querySelector","HTMLElement","_createFrame","frame","createElement","width","src","scrolling","setAttribute","_findFrame","parent","shadowRoot","_detachLoadEventListener","frameDoc","removeEventListener","_attachLoadEventListener","sqh","_loadEvent","detail","addEventListener","analytics","mode","attributes","widgetMode","then","catch","ex","_shareEvent","medium","rs","style","errorTemplate","_findInnerContainer","contentWindow","search","containers","getElementsByTagName","legacyContainers","getElementsByClassName","fallback","length","found","i","delay","reload","email","firstName","lastName","frameWindow","userObj","undefined","template","__deprecated__register","load","open","message","onClick","showStatsBtn","registerForm","className","textContent","widgetStyle","onclick","paddingTop","innerHTML","appendChild","duration","setTimeout","domready","targetDoc","fn","fns","listener","doc","hack","documentElement","doScroll","domContentLoaded","loaded","readyState","shift","push","EmbedWidget","show","hide","close","visibility","height","lastChild","nodeName","replaceChild","firstChild","write","_sqh","squatch","widgetIdent","scrollHeight","ro","entries","entry","contentRect","observe","_shouldFireLoadEvent","dispatchEvent","CustomEvent","contentDocument","noContainer","isComponent","tagName","startsWith","isVerified","popupId","PopupWidget","trigger","head","insertAdjacentHTML","_initialiseCTA","triggerElement","_createPopupDialog","dialog","stopPropagation","target","dialogParent","_setupResizeHandler","overflowY","offsetHeight","top","bottom","computedHeight","showModal","_clickedOutside","_style","Widgets","configin","widget","_renderWidget","err","apiErrorCode","_renderErrorWidget","autofill","selector","input","elems","querySelectorAll","elem","value","codes","displayOnLoad","opts","jsOptions","defaultWidgetType","widgetUrlMappings","forEach","rule","_matchesUrl","referredBy","code","fuelTankAutofillUrls","formSelector","formAutofill","referredReward","fuelTankCode","_renderEmbedWidget","_renderPopupWidget","props","em","match","RegExp","EventsApi","track","options","rawOpts","_validateEvent","_validateTrackOptions","ta","events","asyncLoad","namespace","cached","ready","declarativeCache","impactOnReady","squatchOnReady","readyFns","filter","a","cb","_auto","item","deepMerge","source","isDeep","prop","hasOwnProperty","replaced","Object","getOwnPropertyNames","map","reduce","b","b64decode","binary","atob","bytes","Uint8Array","charCodeAt","TextDecoder","decode","b64encode","encodedInput","TextEncoder","encode","from","byte","String","fromCodePoint","join","btoa","getTopDomain","h","weird_cookie","hostname","split","slice","indexOf","_pushCookie","queryString","urlParams","refParam","paramsJSON","existingCookie","reEncodedCookie","error","newCookie","set","expires","secure","sameSite","_getAutoConfig","configIn","widgetConfig","convertExtraToConfig","autoPopupWidgetType","rest","_domain","keys","decodeUserJwt","tokenStr","base64Url","jsonStr","DeclarativeWidget","widgetInstance","_setWidget","useFirstChildTrigger","setErrorWidget","attachShadow","_setupApis","renderPasswordlessVariant","renderUserUpsertVariant","getWidgetInstance","getAttribute","DeclarativeEmbedWidget","observedAttributes","attributeChangedCallback","attr","oldVal","newVal","connectedCallback","slot","children","find","c","removeChild","DeclarativePopupWidget","SquatchEmbed","SquatchPopup","ImpactEmbed","ImpactPopup","customElements","define","help","console","log","_api","_widgets","_events","init","widgets","configs","enable","disable","pushCookie","SaaSquatchDoNotAutoDrop"],"mappings":"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"}
@@ -1,109 +0,0 @@
1
- import Widget from "./widgets/Widget";
2
- export type WithRequired<T, K extends keyof T> = T & {
3
- [P in K]-?: T[P];
4
- };
5
- /**
6
- * When you load Squatch.js you need to provide these configuration options.
7
- *
8
- * @param tenantAlias The Tenant that you're using.
9
- * @param domain The domain for API. Defaults to `https://app.referralsaasquatch.com`
10
- * @param debug Enables debug logging. Defaults to `false`.
11
- */
12
- export interface ConfigOptions {
13
- tenantAlias: string;
14
- domain?: string;
15
- npmCdn?: string;
16
- debug?: boolean;
17
- }
18
- export type DeclarativeConfigOptions = Omit<ConfigOptions, "tenantAlias">;
19
- /**
20
- * Config options for loading a widget
21
- *
22
- * @param user The user details
23
- * @param widgetType The content of the widget.
24
- * @param engagementMedium How to display the widget.
25
- * @param container Element to load the widget into.
26
- * @param trigger Trigger element's selector for opening the popup widget
27
- * @param jwt the JSON Web Token (JWT) that is used
28
- */
29
- export interface WidgetConfig {
30
- user?: User;
31
- widgetType?: WidgetType;
32
- engagementMedium?: EngagementMedium;
33
- container?: HTMLElement | string;
34
- trigger?: string;
35
- jwt?: JWT;
36
- locale?: string;
37
- displayOnLoad?: boolean;
38
- }
39
- /**
40
- * @param user The user details
41
- * @param widgetType The content of the widget.
42
- * @param engagementMedium How to display the widget.
43
- * @param jwt the JSON Web Token (JWT) that is used
44
- */
45
- export interface CookieWidgetConfig {
46
- user?: CookieUser;
47
- widgetType?: WidgetType;
48
- engagementMedium?: EngagementMedium;
49
- jwt?: JWT;
50
- }
51
- /**
52
- * When a widget is loaded using {@link Widgets} you'll get both the `user` data and the `widget` object back.
53
- *
54
- * @param widget The widget that was created.
55
- * @param user The user that's in the widget.
56
- *
57
- */
58
- export interface WidgetResult {
59
- widget: Widget;
60
- user: User;
61
- }
62
- export type User = {
63
- id: string;
64
- accountId: string;
65
- [key: string]: any;
66
- };
67
- export type CookieUser = {
68
- [key: string]: any;
69
- };
70
- /**
71
- * EngagementMedium is an enum for the content of the widgets.
72
- *
73
- * @example `widgetType: "POPUP"`
74
- */
75
- export type EngagementMedium =
76
- /** Displays the widget as a modal popup. Creates a {@link PopupWidget} */
77
- "POPUP"
78
- /** Displays the widget embedded in the page. Create an {@link EmbedWidget} */
79
- | "EMBED";
80
- export type UpsertWidgetContext = {
81
- type: "upsert";
82
- user?: User | null;
83
- engagementMedium?: EngagementMedium;
84
- container?: HTMLElement | string;
85
- trigger?: string;
86
- };
87
- export type BaseWidgetContext = {
88
- type: "cookie" | "error" | "passwordless";
89
- engagementMedium?: EngagementMedium;
90
- container?: HTMLElement | string;
91
- trigger?: string;
92
- displayOnLoad?: boolean;
93
- };
94
- export type WidgetContext = UpsertWidgetContext | BaseWidgetContext;
95
- export type WidgetContextType = "upsert" | "cookie" | "error" | "passwordless";
96
- /**
97
- * WidgetType is an enum for types of ways a Widget can be displayed.
98
- */
99
- export type WidgetType =
100
- /** Widget content that lets people make referrals */
101
- "REFERRER_WIDGET"
102
- /** Widget content that shows that someone has been referred */
103
- | "CONVERSION_WIDGET" | string;
104
- export type ShareMedium = string;
105
- export type JWT = string;
106
- export type ReferralCookie = {
107
- codes: string[];
108
- encodedCookie: string;
109
- };
@@ -1,3 +0,0 @@
1
- export declare function b64decode(input: any): string;
2
- export declare function b64encode(input: any): string;
3
- export declare function _pushCookie(): void;
@@ -1,2 +0,0 @@
1
- import { User } from "../types";
2
- export declare function decodeUserJwt(tokenStr: string): User | null;
@@ -1,6 +0,0 @@
1
- /// <reference types="node" />
2
- /*!
3
- * domready (c) Dustin Diaz 2014 - License MIT
4
- *
5
- */
6
- export declare function domready(targetDoc: any, fn: any): number | NodeJS.Timeout;
@@ -1,5 +0,0 @@
1
- import { JWT } from "../types";
2
- export declare function doQuery(url: string, query: string, variables: Record<string, unknown>, jwt: string | undefined): Promise<any>;
3
- export declare function doGet<T>(url: any, jwt?: string): Promise<T>;
4
- export declare function doPost(url: string, data: any, jwt?: JWT): Promise<any>;
5
- export declare function doPut(url: string, data: any, jwt?: JWT): Promise<any>;
@@ -1,14 +0,0 @@
1
- import { ConfigOptions, WidgetConfig } from "../types";
2
- export declare function _getAutoConfig(configIn?: ConfigOptions): {
3
- widgetConfig: WidgetConfig;
4
- squatchConfig: ConfigOptions;
5
- } | undefined;
6
- /**
7
- * Deconstructs _saasquatchExtra into domain, tenantAlias, and widgetConfig
8
- * @param obj {Record<string, any>} Expected to be of the form `{ [appDomain]: { [tenantAlias]: { autoPopupWidgetType: [widgetType], [rest]?: ... } } }`
9
- */
10
- export declare function convertExtraToConfig(obj: Record<string, any>): {
11
- domain: string | undefined;
12
- tenantAlias: string;
13
- widgetConfig: any;
14
- };
@@ -1,12 +0,0 @@
1
- import { ConfigOptions, WidgetConfig } from "../types";
2
- type Required<T> = T extends object ? {
3
- [P in keyof T]-?: NonNullable<T[P]>;
4
- } : T;
5
- export declare function validateConfig(_raw?: unknown | undefined): Required<ConfigOptions>;
6
- export declare function isObject(obj: unknown): obj is object;
7
- export declare function validateLocale(locale?: string): string | undefined;
8
- export declare function validateWidgetConfig(raw: unknown | undefined): WidgetConfig;
9
- export declare function validatePasswordlessConfig(raw: unknown | undefined): WidgetConfig;
10
- export declare function getToken(): string;
11
- export declare function getConfig(): Omit<ConfigOptions, "tenantAlias">;
12
- export {};
@@ -1,25 +0,0 @@
1
- import Widget, { Params } from "./Widget";
2
- /**
3
- * An EmbedWidget is displayed inline in part of your page.
4
- *
5
- * To create an EmbedWidget use {@link Widgets}
6
- *
7
- * @example
8
- * const widget = new EmbedWidget({ ... })
9
- * widget.load() // Loads widget into the DOM
10
- * widget.open() // Makes the iframe container visible
11
- * widget.close() // Hides the iframe container
12
- */
13
- export default class EmbedWidget extends Widget {
14
- constructor(params: Params, container?: HTMLElement | string);
15
- load(): Promise<void>;
16
- /**
17
- * Un-hide if element is available and refresh data
18
- */
19
- open(): void;
20
- close(): void;
21
- protected _error(rs: any, mode?: string, style?: string): string;
22
- private _shouldFireLoadEvent;
23
- show: () => void;
24
- hide: () => void;
25
- }
@@ -1,30 +0,0 @@
1
- import Widget, { Params } from "./Widget";
2
- /**
3
- * The PopupWidget is used to display popups (also known as "Modals").
4
- * Popups widgets are rendered on top of other elements in a page.
5
- *
6
- * To create a PopupWidget use {@link Widgets}
7
- *
8
- * @example
9
- * const widget = new PopupWidget({ ... })
10
- * widget.load() // Loads the widget into a dialog element
11
- * widget.open() // Opens the dialog element
12
- * widget.close() // Hides the dialog element
13
- */
14
- export default class PopupWidget extends Widget {
15
- trigger: string | null;
16
- id: string;
17
- constructor(params: Params, trigger?: string | null);
18
- _initialiseCTA(): void;
19
- _createPopupDialog(): HTMLDialogElement;
20
- load(): Promise<void>;
21
- protected _setupResizeHandler(frame: HTMLIFrameElement): Promise<void>;
22
- open(): void;
23
- close(): void;
24
- protected _clickedOutside({ target }: {
25
- target: any;
26
- }): void;
27
- protected _error(rs: any, mode?: string, style?: string): string;
28
- show: () => void;
29
- hide: () => void;
30
- }
@@ -1,57 +0,0 @@
1
- import AnalyticsApi from "../api/AnalyticsApi";
2
- import WidgetApi from "../api/WidgetApi";
3
- import { EngagementMedium, WidgetContext, WidgetType } from "../types";
4
- export interface Params {
5
- type: WidgetType;
6
- domain: string;
7
- npmCdn: string;
8
- content: string;
9
- api: WidgetApi;
10
- rsCode?: string;
11
- context: WidgetContext;
12
- container?: string | HTMLElement | null | undefined;
13
- }
14
- export type ProgramLoadEvent = {
15
- programId: string;
16
- tenantAlias?: string;
17
- accountId?: string;
18
- userId?: string;
19
- engagementMedium?: EngagementMedium;
20
- };
21
- export type GenericLoadEvent = {
22
- mode: any;
23
- analytics: any;
24
- };
25
- export default abstract class Widget {
26
- type: WidgetType;
27
- content: string;
28
- analyticsApi: AnalyticsApi;
29
- widgetApi: WidgetApi;
30
- context: WidgetContext;
31
- npmCdn: string;
32
- container: string | HTMLElement | undefined | null;
33
- loadEventListener: EventListener | null;
34
- protected constructor(params: Params);
35
- _findElement(): HTMLElement;
36
- _createFrame(): HTMLIFrameElement;
37
- _findFrame(): HTMLIFrameElement | null;
38
- abstract load(): void;
39
- protected _detachLoadEventListener(frameDoc: Document): void;
40
- protected _attachLoadEventListener(frameDoc: Document, sqh: ProgramLoadEvent | GenericLoadEvent): void;
41
- protected _loadEvent(sqh: ProgramLoadEvent | GenericLoadEvent): void;
42
- protected _shareEvent(sqh: any, medium: any): void;
43
- protected _error(rs: any, mode?: string, style?: string): string;
44
- protected _findInnerContainer(frame: HTMLIFrameElement): Promise<Element>;
45
- /**
46
- * Reloads the current widget, makes updated request to API and renders result.
47
- * Primarily for Classic widgets with registration
48
- * @param param0 Form field values
49
- * @param jwt JWT for API authentication
50
- */
51
- reload({ email, firstName, lastName }: {
52
- email: any;
53
- firstName: any;
54
- lastName: any;
55
- }, jwt: any): void;
56
- private __deprecated__register;
57
- }