@saasquatch/squatch-js 2.8.2-8 → 2.8.2

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.
@@ -1 +1 @@
1
- {"version":3,"file":"squatch.cjs.js","sources":["../node_modules/ms/index.js","../node_modules/debug/src/common.js","../node_modules/debug/src/browser.js","../node_modules/js-cookie/dist/js.cookie.mjs","../src/globals.ts","../src/utils/validate.ts","../src/utils/io.ts","../src/api/graphql.ts","../src/api/WidgetApi.ts","../src/utils/domready.ts","../src/utils/widgetUtils.ts","../src/api/AnalyticsApi.ts","../src/widgets/Widget.ts","../src/widgets/SkeletonTemplate.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":["/**\n * Helpers.\n */\n\nvar s = 1000;\nvar m = s * 60;\nvar h = m * 60;\nvar d = h * 24;\nvar w = d * 7;\nvar y = d * 365.25;\n\n/**\n * Parse or format the given `val`.\n *\n * Options:\n *\n * - `long` verbose formatting [false]\n *\n * @param {String|Number} val\n * @param {Object} [options]\n * @throws {Error} throw an error if val is not a non-empty string or a number\n * @return {String|Number}\n * @api public\n */\n\nmodule.exports = function (val, options) {\n options = options || {};\n var type = typeof val;\n if (type === 'string' && val.length > 0) {\n return parse(val);\n } else if (type === 'number' && isFinite(val)) {\n return options.long ? fmtLong(val) : fmtShort(val);\n }\n throw new Error(\n 'val is not a non-empty string or a valid number. val=' +\n JSON.stringify(val)\n );\n};\n\n/**\n * Parse the given `str` and return milliseconds.\n *\n * @param {String} str\n * @return {Number}\n * @api private\n */\n\nfunction parse(str) {\n str = String(str);\n if (str.length > 100) {\n return;\n }\n var match = /^(-?(?:\\d+)?\\.?\\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(\n str\n );\n if (!match) {\n return;\n }\n var n = parseFloat(match[1]);\n var type = (match[2] || 'ms').toLowerCase();\n switch (type) {\n case 'years':\n case 'year':\n case 'yrs':\n case 'yr':\n case 'y':\n return n * y;\n case 'weeks':\n case 'week':\n case 'w':\n return n * w;\n case 'days':\n case 'day':\n case 'd':\n return n * d;\n case 'hours':\n case 'hour':\n case 'hrs':\n case 'hr':\n case 'h':\n return n * h;\n case 'minutes':\n case 'minute':\n case 'mins':\n case 'min':\n case 'm':\n return n * m;\n case 'seconds':\n case 'second':\n case 'secs':\n case 'sec':\n case 's':\n return n * s;\n case 'milliseconds':\n case 'millisecond':\n case 'msecs':\n case 'msec':\n case 'ms':\n return n;\n default:\n return undefined;\n }\n}\n\n/**\n * Short format for `ms`.\n *\n * @param {Number} ms\n * @return {String}\n * @api private\n */\n\nfunction fmtShort(ms) {\n var msAbs = Math.abs(ms);\n if (msAbs >= d) {\n return Math.round(ms / d) + 'd';\n }\n if (msAbs >= h) {\n return Math.round(ms / h) + 'h';\n }\n if (msAbs >= m) {\n return Math.round(ms / m) + 'm';\n }\n if (msAbs >= s) {\n return Math.round(ms / s) + 's';\n }\n return ms + 'ms';\n}\n\n/**\n * Long format for `ms`.\n *\n * @param {Number} ms\n * @return {String}\n * @api private\n */\n\nfunction fmtLong(ms) {\n var msAbs = Math.abs(ms);\n if (msAbs >= d) {\n return plural(ms, msAbs, d, 'day');\n }\n if (msAbs >= h) {\n return plural(ms, msAbs, h, 'hour');\n }\n if (msAbs >= m) {\n return plural(ms, msAbs, m, 'minute');\n }\n if (msAbs >= s) {\n return plural(ms, msAbs, s, 'second');\n }\n return ms + ' ms';\n}\n\n/**\n * Pluralization helper.\n */\n\nfunction plural(ms, msAbs, n, name) {\n var isPlural = msAbs >= n * 1.5;\n return Math.round(ms / n) + ' ' + name + (isPlural ? 's' : '');\n}\n","\"use strict\";\n\n/**\n * This is the common logic for both the Node.js and web browser\n * implementations of `debug()`.\n */\nfunction setup(env) {\n createDebug.debug = createDebug;\n createDebug.default = createDebug;\n createDebug.coerce = coerce;\n createDebug.disable = disable;\n createDebug.enable = enable;\n createDebug.enabled = enabled;\n createDebug.humanize = require('ms');\n Object.keys(env).forEach(function (key) {\n createDebug[key] = env[key];\n });\n /**\n * Active `debug` instances.\n */\n\n createDebug.instances = [];\n /**\n * The currently active debug mode names, and names to skip.\n */\n\n createDebug.names = [];\n createDebug.skips = [];\n /**\n * Map of special \"%n\" handling functions, for the debug \"format\" argument.\n *\n * Valid key names are a single, lower or upper-case letter, i.e. \"n\" and \"N\".\n */\n\n createDebug.formatters = {};\n /**\n * Selects a color for a debug namespace\n * @param {String} namespace The namespace string for the for the debug instance to be colored\n * @return {Number|String} An ANSI color code for the given namespace\n * @api private\n */\n\n function selectColor(namespace) {\n var hash = 0;\n\n for (var i = 0; i < namespace.length; i++) {\n hash = (hash << 5) - hash + namespace.charCodeAt(i);\n hash |= 0; // Convert to 32bit integer\n }\n\n return createDebug.colors[Math.abs(hash) % createDebug.colors.length];\n }\n\n createDebug.selectColor = selectColor;\n /**\n * Create a debugger with the given `namespace`.\n *\n * @param {String} namespace\n * @return {Function}\n * @api public\n */\n\n function createDebug(namespace) {\n var prevTime;\n\n function debug() {\n // Disabled?\n if (!debug.enabled) {\n return;\n }\n\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n var self = debug; // Set `diff` timestamp\n\n var curr = Number(new Date());\n var ms = curr - (prevTime || curr);\n self.diff = ms;\n self.prev = prevTime;\n self.curr = curr;\n prevTime = curr;\n args[0] = createDebug.coerce(args[0]);\n\n if (typeof args[0] !== 'string') {\n // Anything else let's inspect with %O\n args.unshift('%O');\n } // Apply any `formatters` transformations\n\n\n var index = 0;\n args[0] = args[0].replace(/%([a-zA-Z%])/g, function (match, format) {\n // If we encounter an escaped % then don't increase the array index\n if (match === '%%') {\n return match;\n }\n\n index++;\n var formatter = createDebug.formatters[format];\n\n if (typeof formatter === 'function') {\n var val = args[index];\n match = formatter.call(self, val); // Now we need to remove `args[index]` since it's inlined in the `format`\n\n args.splice(index, 1);\n index--;\n }\n\n return match;\n }); // Apply env-specific formatting (colors, etc.)\n\n createDebug.formatArgs.call(self, args);\n var logFn = self.log || createDebug.log;\n logFn.apply(self, args);\n }\n\n debug.namespace = namespace;\n debug.enabled = createDebug.enabled(namespace);\n debug.useColors = createDebug.useColors();\n debug.color = selectColor(namespace);\n debug.destroy = destroy;\n debug.extend = extend; // Debug.formatArgs = formatArgs;\n // debug.rawLog = rawLog;\n // env-specific initialization logic for debug instances\n\n if (typeof createDebug.init === 'function') {\n createDebug.init(debug);\n }\n\n createDebug.instances.push(debug);\n return debug;\n }\n\n function destroy() {\n var index = createDebug.instances.indexOf(this);\n\n if (index !== -1) {\n createDebug.instances.splice(index, 1);\n return true;\n }\n\n return false;\n }\n\n function extend(namespace, delimiter) {\n return createDebug(this.namespace + (typeof delimiter === 'undefined' ? ':' : delimiter) + namespace);\n }\n /**\n * Enables a debug mode by namespaces. This can include modes\n * separated by a colon and wildcards.\n *\n * @param {String} namespaces\n * @api public\n */\n\n\n function enable(namespaces) {\n createDebug.save(namespaces);\n createDebug.names = [];\n createDebug.skips = [];\n var i;\n var split = (typeof namespaces === 'string' ? namespaces : '').split(/[\\s,]+/);\n var len = split.length;\n\n for (i = 0; i < len; i++) {\n if (!split[i]) {\n // ignore empty strings\n continue;\n }\n\n namespaces = split[i].replace(/\\*/g, '.*?');\n\n if (namespaces[0] === '-') {\n createDebug.skips.push(new RegExp('^' + namespaces.substr(1) + '$'));\n } else {\n createDebug.names.push(new RegExp('^' + namespaces + '$'));\n }\n }\n\n for (i = 0; i < createDebug.instances.length; i++) {\n var instance = createDebug.instances[i];\n instance.enabled = createDebug.enabled(instance.namespace);\n }\n }\n /**\n * Disable debug output.\n *\n * @api public\n */\n\n\n function disable() {\n createDebug.enable('');\n }\n /**\n * Returns true if the given mode name is enabled, false otherwise.\n *\n * @param {String} name\n * @return {Boolean}\n * @api public\n */\n\n\n function enabled(name) {\n if (name[name.length - 1] === '*') {\n return true;\n }\n\n var i;\n var len;\n\n for (i = 0, len = createDebug.skips.length; i < len; i++) {\n if (createDebug.skips[i].test(name)) {\n return false;\n }\n }\n\n for (i = 0, len = createDebug.names.length; i < len; i++) {\n if (createDebug.names[i].test(name)) {\n return true;\n }\n }\n\n return false;\n }\n /**\n * Coerce `val`.\n *\n * @param {Mixed} val\n * @return {Mixed}\n * @api private\n */\n\n\n function coerce(val) {\n if (val instanceof Error) {\n return val.stack || val.message;\n }\n\n return val;\n }\n\n createDebug.enable(createDebug.load());\n return createDebug;\n}\n\nmodule.exports = setup;\n\n","\"use strict\";\n\nfunction _typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\n/* eslint-env browser */\n\n/**\n * This is the web browser implementation of `debug()`.\n */\nexports.log = log;\nexports.formatArgs = formatArgs;\nexports.save = save;\nexports.load = load;\nexports.useColors = useColors;\nexports.storage = localstorage();\n/**\n * Colors.\n */\n\nexports.colors = ['#0000CC', '#0000FF', '#0033CC', '#0033FF', '#0066CC', '#0066FF', '#0099CC', '#0099FF', '#00CC00', '#00CC33', '#00CC66', '#00CC99', '#00CCCC', '#00CCFF', '#3300CC', '#3300FF', '#3333CC', '#3333FF', '#3366CC', '#3366FF', '#3399CC', '#3399FF', '#33CC00', '#33CC33', '#33CC66', '#33CC99', '#33CCCC', '#33CCFF', '#6600CC', '#6600FF', '#6633CC', '#6633FF', '#66CC00', '#66CC33', '#9900CC', '#9900FF', '#9933CC', '#9933FF', '#99CC00', '#99CC33', '#CC0000', '#CC0033', '#CC0066', '#CC0099', '#CC00CC', '#CC00FF', '#CC3300', '#CC3333', '#CC3366', '#CC3399', '#CC33CC', '#CC33FF', '#CC6600', '#CC6633', '#CC9900', '#CC9933', '#CCCC00', '#CCCC33', '#FF0000', '#FF0033', '#FF0066', '#FF0099', '#FF00CC', '#FF00FF', '#FF3300', '#FF3333', '#FF3366', '#FF3399', '#FF33CC', '#FF33FF', '#FF6600', '#FF6633', '#FF9900', '#FF9933', '#FFCC00', '#FFCC33'];\n/**\n * Currently only WebKit-based Web Inspectors, Firefox >= v31,\n * and the Firebug extension (any Firefox version) are known\n * to support \"%c\" CSS customizations.\n *\n * TODO: add a `localStorage` variable to explicitly enable/disable colors\n */\n// eslint-disable-next-line complexity\n\nfunction useColors() {\n // NB: In an Electron preload script, document will be defined but not fully\n // initialized. Since we know we're in Chrome, we'll just detect this case\n // explicitly\n if (typeof window !== 'undefined' && window.process && (window.process.type === 'renderer' || window.process.__nwjs)) {\n return true;\n } // Internet Explorer and Edge do not support colors.\n\n\n if (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/(edge|trident)\\/(\\d+)/)) {\n return false;\n } // Is webkit? http://stackoverflow.com/a/16459606/376773\n // document is undefined in react-native: https://github.com/facebook/react-native/pull/1632\n\n\n return typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance || // Is firebug? http://stackoverflow.com/a/398120/376773\n typeof window !== 'undefined' && window.console && (window.console.firebug || window.console.exception && window.console.table) || // Is firefox >= v31?\n // https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages\n typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/firefox\\/(\\d+)/) && parseInt(RegExp.$1, 10) >= 31 || // Double check webkit in userAgent just in case we are in a worker\n typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\\/(\\d+)/);\n}\n/**\n * Colorize log arguments if enabled.\n *\n * @api public\n */\n\n\nfunction formatArgs(args) {\n args[0] = (this.useColors ? '%c' : '') + this.namespace + (this.useColors ? ' %c' : ' ') + args[0] + (this.useColors ? '%c ' : ' ') + '+' + module.exports.humanize(this.diff);\n\n if (!this.useColors) {\n return;\n }\n\n var c = 'color: ' + this.color;\n args.splice(1, 0, c, 'color: inherit'); // The final \"%c\" is somewhat tricky, because there could be other\n // arguments passed either before or after the %c, so we need to\n // figure out the correct index to insert the CSS into\n\n var index = 0;\n var lastC = 0;\n args[0].replace(/%[a-zA-Z%]/g, function (match) {\n if (match === '%%') {\n return;\n }\n\n index++;\n\n if (match === '%c') {\n // We only are interested in the *last* %c\n // (the user may have provided their own)\n lastC = index;\n }\n });\n args.splice(lastC, 0, c);\n}\n/**\n * Invokes `console.log()` when available.\n * No-op when `console.log` is not a \"function\".\n *\n * @api public\n */\n\n\nfunction log() {\n var _console;\n\n // This hackery is required for IE8/9, where\n // the `console.log` function doesn't have 'apply'\n return (typeof console === \"undefined\" ? \"undefined\" : _typeof(console)) === 'object' && console.log && (_console = console).log.apply(_console, arguments);\n}\n/**\n * Save `namespaces`.\n *\n * @param {String} namespaces\n * @api private\n */\n\n\nfunction save(namespaces) {\n try {\n if (namespaces) {\n exports.storage.setItem('debug', namespaces);\n } else {\n exports.storage.removeItem('debug');\n }\n } catch (error) {// Swallow\n // XXX (@Qix-) should we be logging these?\n }\n}\n/**\n * Load `namespaces`.\n *\n * @return {String} returns the previously persisted debug modes\n * @api private\n */\n\n\nfunction load() {\n var r;\n\n try {\n r = exports.storage.getItem('debug');\n } catch (error) {} // Swallow\n // XXX (@Qix-) should we be logging these?\n // If debug isn't set in LS, and we're in Electron, try to load $DEBUG\n\n\n if (!r && typeof process !== 'undefined' && 'env' in process) {\n r = process.env.DEBUG;\n }\n\n return r;\n}\n/**\n * Localstorage attempts to return the localstorage.\n *\n * This is necessary because safari throws\n * when a user disables cookies/localstorage\n * and you attempt to access it.\n *\n * @return {LocalStorage}\n * @api private\n */\n\n\nfunction localstorage() {\n try {\n // TVMLKit (Apple TV JS Runtime) does not have a window object, just localStorage in the global context\n // The Browser also has localStorage in the global context.\n return localStorage;\n } catch (error) {// Swallow\n // XXX (@Qix-) should we be logging these?\n }\n}\n\nmodule.exports = require('./common')(exports);\nvar formatters = module.exports.formatters;\n/**\n * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default.\n */\n\nformatters.j = function (v) {\n try {\n return JSON.stringify(v);\n } catch (error) {\n return '[UnexpectedJSONParseError]: ' + error.message;\n }\n};\n\n","/*! js-cookie v3.0.5 | MIT */\n/* eslint-disable no-var */\nfunction assign (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n for (var key in source) {\n target[key] = source[key];\n }\n }\n return target\n}\n/* eslint-enable no-var */\n\n/* eslint-disable no-var */\nvar defaultConverter = {\n read: function (value) {\n if (value[0] === '\"') {\n value = value.slice(1, -1);\n }\n return value.replace(/(%[\\dA-F]{2})+/gi, decodeURIComponent)\n },\n write: function (value) {\n return encodeURIComponent(value).replace(\n /%(2[346BF]|3[AC-F]|40|5[BDE]|60|7[BCD])/g,\n decodeURIComponent\n )\n }\n};\n/* eslint-enable no-var */\n\n/* eslint-disable no-var */\n\nfunction init (converter, defaultAttributes) {\n function set (name, value, attributes) {\n if (typeof document === 'undefined') {\n return\n }\n\n attributes = assign({}, defaultAttributes, attributes);\n\n if (typeof attributes.expires === 'number') {\n attributes.expires = new Date(Date.now() + attributes.expires * 864e5);\n }\n if (attributes.expires) {\n attributes.expires = attributes.expires.toUTCString();\n }\n\n name = encodeURIComponent(name)\n .replace(/%(2[346B]|5E|60|7C)/g, decodeURIComponent)\n .replace(/[()]/g, escape);\n\n var stringifiedAttributes = '';\n for (var attributeName in attributes) {\n if (!attributes[attributeName]) {\n continue\n }\n\n stringifiedAttributes += '; ' + attributeName;\n\n if (attributes[attributeName] === true) {\n continue\n }\n\n // Considers RFC 6265 section 5.2:\n // ...\n // 3. If the remaining unparsed-attributes contains a %x3B (\";\")\n // character:\n // Consume the characters of the unparsed-attributes up to,\n // not including, the first %x3B (\";\") character.\n // ...\n stringifiedAttributes += '=' + attributes[attributeName].split(';')[0];\n }\n\n return (document.cookie =\n name + '=' + converter.write(value, name) + stringifiedAttributes)\n }\n\n function get (name) {\n if (typeof document === 'undefined' || (arguments.length && !name)) {\n return\n }\n\n // To prevent the for loop in the first place assign an empty array\n // in case there are no cookies at all.\n var cookies = document.cookie ? document.cookie.split('; ') : [];\n var jar = {};\n for (var i = 0; i < cookies.length; i++) {\n var parts = cookies[i].split('=');\n var value = parts.slice(1).join('=');\n\n try {\n var found = decodeURIComponent(parts[0]);\n jar[found] = converter.read(value, found);\n\n if (name === found) {\n break\n }\n } catch (e) {}\n }\n\n return name ? jar[name] : jar\n }\n\n return Object.create(\n {\n set,\n get,\n remove: function (name, attributes) {\n set(\n name,\n '',\n assign({}, attributes, {\n expires: -1\n })\n );\n },\n withAttributes: function (attributes) {\n return init(this.converter, assign({}, this.attributes, attributes))\n },\n withConverter: function (converter) {\n return init(assign({}, this.converter, converter), this.attributes)\n }\n },\n {\n attributes: { value: Object.freeze(defaultAttributes) },\n converter: { value: Object.freeze(converter) }\n }\n )\n}\n\nvar api = init(defaultConverter, { path: '/' });\n/* eslint-enable no-var */\n\nexport { api as default };\n","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 console.log({ params });\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","/*!\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","export function formatWidth({\n value,\n unit,\n}: {\n value: number;\n unit: \"px\" | \"%\";\n}) {\n switch (unit) {\n case \"px\":\n return `${value}px`;\n case \"%\":\n return `${value}%`;\n default:\n return `${value}px`;\n }\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};\nexport type WidthSetting = {\n value: number;\n unit: \"px\" | \"%\";\n};\nexport type WidgetWidths = {\n minWidth: WidthSetting;\n maxWidth: WidthSetting;\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(options?: {\n minWidth?: string;\n maxWidth?: string;\n initialHeight?: string;\n }) {\n const frame = document.createElement(\"iframe\");\n frame[\"squatchJsApi\"] = this;\n frame.id = \"squatchFrame\";\n frame.width = \"100%\";\n\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 if (options?.minWidth) frame.style.minWidth = options.minWidth;\n if (options?.maxWidth) frame.style.maxWidth = options.maxWidth;\n if (options?.maxWidth || options?.minWidth) {\n // Avoid 1px width when custom width is set\n frame.style.width = \"100%\";\n }\n if (options?.initialHeight) {\n frame.height = options.initialHeight;\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","interface SkeletonProps {\n height?: string | number;\n skeletonBackgroundColor?: string;\n skeletonShimmerColor?: string;\n borderColor?: string;\n}\n\n/**\n * Returns the complete HTML string (including <style>) for the skeleton.\n * Values are injected directly into the CSS string.\n */\nexport const getSkeleton = ({\n height = \"500px\",\n skeletonBackgroundColor = \"#e0e0e0\",\n skeletonShimmerColor = \"#f5f5f5\",\n borderColor = \"#ccc\",\n}: SkeletonProps) => {\n // Normalize height to px if it's a number\n const heightVal = typeof height === \"number\" ? `${height}px` : height;\n\n return `\n <style>\n * {\n box-sizing: border-box;\n padding: 0;\n margin: 0;\n }\n\n\t\t\t.widget-container {\n\t\t\t\tbackground: white;\n\t\t\t\twidth: 100%;\n\t\t\t\tmax-width: 900px;\n\t\t\t\tpadding: 40px;\n\t\t\t\tborder-radius: 12px;\n\t\t\t\tbox-shadow: 0 4px 20px rgba(0, 0, 0, 0.08);\n\t\t\t\tbox-sizing: border-box;\n\t\t\t}\n\n\t\t\t@keyframes shimmer {\n\t\t\t\t0% {\n\t\t\t\t\tbackground-position: -100% 0;\n\t\t\t\t}\n\t\t\t\t100% {\n\t\t\t\t\tbackground-position: 100% 0;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t.skeleton {\n\t\t\t\tbackground: ${skeletonBackgroundColor};\n\t\t\t\tbackground: linear-gradient(\n\t\t\t\t\t90deg,\n\t\t\t\t\t${skeletonBackgroundColor} 25%,\n\t\t\t\t\t${skeletonShimmerColor} 50%,\n\t\t\t\t\t${skeletonBackgroundColor} 75%\n\t\t\t\t);\n\t\t\t\tbackground-size: 200% 100%;\n\t\t\t\tanimation: shimmer 1.5s infinite linear;\n\t\t\t\tborder-radius: 6px;\n\t\t\t\tmargin-bottom: 12px;\n\t\t\t}\n\n\t\t\t.sk-title-lg {\n\t\t\t\theight: 36px;\n\t\t\t\twidth: 50%;\n\t\t\t\tmargin-bottom: 16px;\n\t\t\t}\n\t\t\t.sk-title-md {\n\t\t\t\theight: 28px;\n\t\t\t\twidth: 30%;\n\t\t\t\tmargin-bottom: 20px;\n\t\t\t\tmargin-top: 40px;\n\t\t\t}\n\t\t\t.sk-text {\n\t\t\t\theight: 16px;\n\t\t\t\twidth: 80%;\n\t\t\t\tmargin-bottom: 8px;\n\t\t\t}\n\t\t\t.sk-text-short {\n\t\t\t\twidth: 40%;\n\t\t\t}\n\t\t\t.sk-label {\n\t\t\t\theight: 14px;\n\t\t\t\twidth: 25%;\n\t\t\t\tmargin-bottom: 10px;\n\t\t\t}\n\n\t\t\t.hero-section {\n\t\t\t\tdisplay: flex;\n\t\t\t\tgap: 40px;\n\t\t\t\tmargin-bottom: 40px;\n\t\t\t\tborder-bottom: 1px solid ${borderColor};\n\t\t\t\tpadding-bottom: 40px;\n\t\t\t\tflex-direction: row;\n\t\t\t}\n\t\t\t.hero-content {\n\t\t\t\tflex: 1;\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-direction: column;\n\t\t\t\tjustify-content: center;\n\t\t\t}\n\t\t\t.hero-image {\n\t\t\t\tflex: 1;\n\t\t\t\theight: 300px;\n\t\t\t\tborder-radius: 12px;\n\t\t\t}\n\n\t\t\t.share-section {\n\t\t\t\tmargin-bottom: 40px;\n\t\t\t}\n\t\t\t.sk-input {\n\t\t\t\theight: 50px;\n\t\t\t\twidth: 100%;\n\t\t\t\tborder-radius: 8px;\n\t\t\t\tmargin-bottom: 16px;\n\t\t\t}\n\t\t\t.social-buttons {\n\t\t\t\tdisplay: flex;\n\t\t\t\tgap: 12px;\n\t\t\t}\n\t\t\t.sk-btn-social {\n\t\t\t\tflex: 1;\n\t\t\t\theight: 50px;\n\t\t\t\tborder-radius: 8px;\n\t\t\t}\n\n\t\t\t.stats-section {\n\t\t\t\tdisplay: flex;\n\t\t\t\tgap: 24px;\n\t\t\t\tmargin-bottom: 40px;\n\t\t\t\tpadding: 30px 0;\n\t\t\t\tborder-top: 1px solid ${borderColor};\n\t\t\t\tborder-bottom: 1px solid ${borderColor};\n\t\t\t}\n\t\t\t.stat-card {\n\t\t\t\tflex: 1;\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-direction: column;\n\t\t\t\talign-items: center;\n\t\t\t}\n\t\t\t.stat-divider {\n\t\t\t\tpadding-left: 24px;\n\t\t\t}\n\n\t\t\t.sk-stat-num {\n\t\t\t\theight: 48px;\n\t\t\t\twidth: 120px;\n\t\t\t\tmargin-bottom: 8px;\n\t\t\t}\n\t\t\t.sk-stat-label {\n\t\t\t\theight: 18px;\n\t\t\t\twidth: 80px;\n\t\t\t}\n\n\t\t\t.table-header {\n\t\t\t\tdisplay: flex;\n\t\t\t\tgap: 16px;\n\t\t\t\tmargin-bottom: 16px;\n\t\t\t}\n\t\t\t.sk-th {\n\t\t\t\theight: 16px;\n\t\t\t}\n\t\t\t.table-row {\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tgap: 16px;\n\t\t\t\tpadding: 16px 0;\n\t\t\t\tborder-bottom: 1px solid ${borderColor};\n\t\t\t}\n\n\t\t\t.col-user {\n\t\t\t\tflex: 2;\n\t\t\t}\n\t\t\t.col-status {\n\t\t\t\tflex: 1;\n\t\t\t}\n\t\t\t.col-reward {\n\t\t\t\tflex: 2;\n\t\t\t}\n\t\t\t.col-date {\n\t\t\t\tflex: 1;\n\t\t\t}\n\n\t\t\t.sk-badge {\n\t\t\t\theight: 28px;\n\t\t\t\twidth: 90px;\n\t\t\t\tborder-radius: 14px;\n\t\t\t}\n\t\t\t.sk-reward-block {\n\t\t\t\theight: 36px;\n\t\t\t\twidth: 100%;\n\t\t\t\tborder-radius: 6px;\n\t\t\t}\n\n\t\t\t.pagination {\n\t\t\t\tdisplay: flex;\n\t\t\t\tjustify-content: flex-end;\n\t\t\t\tgap: 8px;\n\t\t\t\tmargin-top: 24px;\n\t\t\t}\n\t\t\t.sk-btn-page {\n\t\t\t\theight: 36px;\n\t\t\t\twidth: 64px;\n\t\t\t\tborder-radius: 6px;\n\t\t\t\tmargin-bottom: 0;\n\t\t\t}\n\n\t\t\t@media (max-width: 768px) {\n\t\t\t\tbody {\n\t\t\t\t\tpadding: 20px;\n\t\t\t\t}\n\t\t\t\t.widget-container {\n\t\t\t\t\tpadding: 24px;\n\t\t\t\t}\n\n\t\t\t\t.hero-section {\n\t\t\t\t\tflex-direction: column-reverse;\n\t\t\t\t\tgap: 24px;\n\t\t\t\t}\n\t\t\t\t.hero-image {\n\t\t\t\t\theight: 220px;\n\t\t\t\t\twidth: 100%;\n\t\t\t\t}\n\t\t\t\t.sk-title-lg {\n\t\t\t\t\twidth: 80%;\n\t\t\t\t}\n\n\t\t\t\t.col-date {\n\t\t\t\t\tdisplay: none;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t@media (max-width: 480px) {\n\t\t\t\tbody {\n\t\t\t\t\tpadding: 10px;\n\t\t\t\t}\n\t\t\t\t.widget-container {\n\t\t\t\t\tpadding: 16px;\n\t\t\t\t}\n\n\t\t\t\t.sk-stat-num {\n\t\t\t\t\twidth: 80px;\n\t\t\t\t\theight: 40px;\n\t\t\t\t}\n\n\t\t\t\t.col-reward {\n\t\t\t\t\tdisplay: none;\n\t\t\t\t}\n\n\t\t\t\t.col-user {\n\t\t\t\t\tflex: 3;\n\t\t\t\t}\n\t\t\t\t.col-status {\n\t\t\t\t\tflex: 2;\n\t\t\t\t\tdisplay: flex;\n\t\t\t\t\tjustify-content: flex-end;\n\t\t\t\t}\n\t\t\t}\n </style>\n\n <div class=\"widget-container\">\n\t\t\t<div class=\"hero-section\">\n\t\t\t\t<div class=\"hero-content\">\n\t\t\t\t\t<div class=\"skeleton sk-title-lg\"></div>\n\t\t\t\t\t<div class=\"skeleton sk-text\"></div>\n\t\t\t\t\t<div class=\"skeleton sk-text sk-text-short\"></div>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"skeleton hero-image\"></div>\n\t\t\t</div>\n\n\t\t\t<div class=\"share-section\">\n\t\t\t\t<div class=\"skeleton sk-label\"></div>\n\t\t\t\t<div class=\"skeleton sk-input\"></div>\n\t\t\t\t<div class=\"social-buttons\">\n\t\t\t\t\t<div class=\"skeleton sk-btn-social\"></div>\n\t\t\t\t\t<div class=\"skeleton sk-btn-social\"></div>\n\t\t\t\t\t<div class=\"skeleton sk-btn-social\"></div>\n\t\t\t\t\t<div class=\"skeleton sk-btn-social\"></div>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div\n\t\t\t\tclass=\"skeleton sk-title-md\"\n\t\t\t\tstyle=\"margin-top: 0; width: 30%; margin-left: auto; margin-right: auto\"\n\t\t\t></div>\n\t\t\t<div\n\t\t\t\tclass=\"skeleton sk-text\"\n\t\t\t\tstyle=\"width: 60%; margin-left: auto; margin-right: auto\"\n\t\t\t></div>\n\n\t\t\t<div class=\"stats-section\">\n\t\t\t\t<div class=\"stat-card\">\n\t\t\t\t\t<div class=\"skeleton sk-stat-num\"></div>\n\t\t\t\t\t<div class=\"skeleton sk-stat-label\"></div>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"stat-card stat-divider\">\n\t\t\t\t\t<div class=\"skeleton sk-stat-num\"></div>\n\t\t\t\t\t<div class=\"skeleton sk-stat-label\"></div>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"skeleton sk-title-md\"></div>\n\n\t\t\t<div class=\"table-header\">\n\t\t\t\t<div class=\"skeleton sk-th col-user\"></div>\n\t\t\t\t<div class=\"skeleton sk-th col-status\"></div>\n\t\t\t\t<div class=\"skeleton sk-th col-reward\"></div>\n\t\t\t\t<div class=\"skeleton sk-th col-date\"></div>\n\t\t\t</div>\n\n\t\t\t<div class=\"table-row\">\n\t\t\t\t<div class=\"col-user\">\n\t\t\t\t\t<div class=\"skeleton sk-text\" style=\"width: 70%; margin: 0\"></div>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"col-status\">\n\t\t\t\t\t<div class=\"skeleton sk-badge\" style=\"margin: 0\"></div>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"col-reward\">\n\t\t\t\t\t<div class=\"skeleton sk-reward-block\" style=\"margin: 0\"></div>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"col-date\">\n\t\t\t\t\t<div class=\"skeleton sk-text\" style=\"width: 80%; margin: 0\"></div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div class=\"table-row\">\n\t\t\t\t<div class=\"col-user\">\n\t\t\t\t\t<div class=\"skeleton sk-text\" style=\"width: 60%; margin: 0\"></div>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"col-status\">\n\t\t\t\t\t<div class=\"skeleton sk-badge\" style=\"margin: 0\"></div>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"col-reward\">\n\t\t\t\t\t<div class=\"skeleton sk-reward-block\" style=\"margin: 0\"></div>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"col-date\">\n\t\t\t\t\t<div class=\"skeleton sk-text\" style=\"width: 80%; margin: 0\"></div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div class=\"table-row\">\n\t\t\t\t<div class=\"col-user\">\n\t\t\t\t\t<div class=\"skeleton sk-text\" style=\"width: 75%; margin: 0\"></div>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"col-status\">\n\t\t\t\t\t<div class=\"skeleton sk-badge\" style=\"margin: 0\"></div>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"col-reward\">\n\t\t\t\t\t<div class=\"skeleton sk-reward-block\" style=\"margin: 0\"></div>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"col-date\">\n\t\t\t\t\t<div class=\"skeleton sk-text\" style=\"width: 80%; margin: 0\"></div>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"pagination\">\n\t\t\t\t<div class=\"skeleton sk-btn-page\"></div>\n\t\t\t\t<div class=\"skeleton sk-btn-page\"></div>\n\t\t\t</div>\n\t\t</div>\n `;\n};\n","// @ts-check\n\nimport { debug } from \"debug\";\nimport { UpsertWidgetContext } from \"../types\";\nimport { domready } from \"../utils/domready\";\nimport { formatWidth } from \"../utils/widgetUtils\";\nimport Widget, { Params } from \"./Widget\";\nimport { getSkeleton } from \"./SkeletonTemplate\";\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) {\n this.container = container;\n }\n }\n\n async load() {\n const brandingConfig = this.context.widgetConfig?.values?.brandingConfig;\n // @ts-ignore\n const initialHeight = brandingConfig?.loadingHeight;\n const skeletonBackgroundColor =\n brandingConfig?.color?.loadingSkeleton?.background;\n const skeletonShimmerColor =\n brandingConfig?.color?.loadingSkeleton?.animationBackground;\n const borderColor = brandingConfig?.border?.borderColor;\n const sizes = brandingConfig?.widgetSize?.embeddedWidgets;\n const maxWidth = sizes?.maxWidth ? formatWidth(sizes.maxWidth) : \"\";\n const minWidth = sizes?.minWidth ? formatWidth(sizes.minWidth) : \"\";\n\n console.log({\n brandingConfig,\n initialHeight,\n widgetConfig: this.context.widgetConfig,\n });\n\n const skeletonHTML = getSkeleton({\n height: initialHeight,\n skeletonBackgroundColor,\n skeletonShimmerColor,\n borderColor,\n });\n\n const skeletonContainer = document.createElement(\"div\");\n skeletonContainer.innerHTML = skeletonHTML;\n\n const frame = this._createFrame({\n minWidth,\n maxWidth,\n initialHeight,\n });\n const element = this._findElement();\n\n element.innerHTML = skeletonHTML;\n\n // Hide frame initially\n frame.style.display = \"none\";\n\n const injectContents = (target: HTMLElement | ShadowRoot) => {\n // Optional: Clear target to prevent duplicates if load() is called twice\n // target.innerHTML = \"\";\n target.appendChild(skeletonContainer);\n target.appendChild(frame);\n };\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 injectContents(element.shadowRoot);\n }\n } else if (element.firstChild) {\n // If replacing, wipe and reload\n element.innerHTML = \"\";\n injectContents(element);\n } else {\n injectContents(element);\n }\n } else if (!element.firstChild || element.firstChild.nodeName === \"#text\") {\n injectContents(element);\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\n console.log({ content: this.content, context: this.context, this: this });\n\n const domain = this.widgetApi.domain;\n\n frameDoc.write(`\n ${\n brandingConfig?.main?.brandFont &&\n `\n <link rel=\"preconnect\" href=\"https://fast${\n domain === \"https://staging.referralsaasquatch.com\" && \"-staging\"\n }.ssqt.io\">\n <link rel=\"preconnect\" href=\"https://fonts.gstatic.com\">\n <link rel=\"preconnect\" href=\"https://fonts.googleapis.com\">\n <link rel=\"preload\" href=\"https://fonts.googleapis.com/css2?family=${encodeURIComponent(\n brandingConfig?.main?.brandFont\n )}\" as=\"style\">`\n }\n <script src=\"${this.npmCdn}/resize-observer-polyfill@1.5.x\"></script>\n <style data-styles>\n html { visibility:hidden;}\n </style>\n ${this.content}\n\n `);\n\n frameDoc.close();\n domready(frameDoc, async () => {\n if (skeletonContainer && skeletonContainer.parentNode) {\n skeletonContainer.parentNode.removeChild(skeletonContainer);\n }\n\n frame.style.display = \"block\";\n\n const _sqh = contentWindow.squatch || contentWindow.widgetIdent;\n\n // @ts-ignore -- number will be cast to string by browsers\n frame.height = initialHeight || frameDoc.body.scrollHeight;\n console.log({ 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 { UpsertWidgetContext } from \"../types\";\nimport { domready } from \"../utils/domready\";\nimport { formatWidth } from \"../utils/widgetUtils\";\nimport Widget, { Params } from \"./Widget\";\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 const brandingConfig = this.context.widgetConfig?.values?.brandingConfig;\n const sizes = brandingConfig?.widgetSize?.popupWidgets;\n\n // Still styling the dialog to keep consistent with previous versions\n const minWidth = sizes?.minWidth ? formatWidth(sizes.minWidth) : \"auto\";\n const maxWidth = sizes?.maxWidth ? formatWidth(sizes.maxWidth) : \"500px\";\n dialog.id = this.id;\n dialog.setAttribute(\n \"style\",\n `width: 100%; min-width: ${minWidth}; max-width: ${maxWidth}; 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 widgetConfig: {\n values: {\n brandingConfig: response?.brandingConfig,\n },\n },\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 widgetConfig: {\n values: {\n brandingConfig: response?.brandingConfig,\n },\n },\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\";\nimport { validateConfig } from \"./validate\";\n\n/** @hidden */\nconst _log = debug(\"squatch-js\");\n\nexport function _getAutoConfig():\n | { widgetConfig: WidgetConfig; squatchConfig: ConfigOptions }\n | 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 const config = validateConfig({\n tenantAlias: \"UNKNOWN\",\n });\n\n if (!config.domain) {\n _log(\"domain must be provided in config to use _saasquatchExtra\");\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 // Normalize the domain by removing protocol (e.g., 'https://')\n function normalizeDomain(domain: string): string {\n return domain.replace(/^https?:\\/\\//, \"\");\n }\n\n const normalizedDomain = normalizeDomain(config.domain);\n\n // _saasquatchExtra is expected to be structured as:\n // {\n // [domain]: {\n // [tenantAlias]: {\n // autoPopupWidgetType: string,\n // ...otherWidgetConfig\n // }\n // }\n // }\n //\n\n const tenantAlias = Object.keys(raw?.[normalizedDomain] || {})[0];\n const widgetConfig = raw?.[normalizedDomain]?.[tenantAlias];\n\n if (!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 ...config,\n tenantAlias,\n },\n };\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 { DEFAULT_DOMAIN, DEFAULT_NPM_CDN } from \"../../globals\";\nimport {\n ConfigOptions,\n DeclarativeConfigOptions,\n User,\n WidgetValueConfig,\n} from \"../../types\";\nimport { decodeUserJwt } from \"../../utils/decodeUserJwt\";\nimport { getConfig, getToken } from \"../../utils/validate\";\nimport EmbedWidget from \"../EmbedWidget\";\nimport PopupWidget from \"../PopupWidget\";\nimport type { Params } from \"../Widget\";\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, { 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 await this.widgetApi.upsertUser({\n user: userObj,\n locale: this.locale,\n engagementMedium: this.type,\n widgetType: this.widgetType,\n jwt: this.token,\n });\n\n const widgetInstance = await this.widgetApi\n .render({\n locale: this.locale,\n engagementMedium: this.type,\n widgetType: this.widgetType,\n })\n .then((res) => {\n return this._setWidget(res, { type: \"upsert\", user: userObj });\n })\n .catch(this.setErrorWidget);\n\n return widgetInstance;\n }\n\n private _setWidget = (\n res: { template: any; widgetConfig: WidgetValueConfig },\n config: { type: \"upsert\" | \"passwordless\"; user?: User }\n ) => {\n const params = {\n api: this.widgetApi,\n content: res.template,\n context: {\n type: config.type,\n user: config.user,\n container: this.container || undefined,\n engagementMedium: this.type,\n widgetConfig: res.widgetConfig,\n },\n type: this.widgetType!,\n domain: this.config?.domain || DEFAULT_DOMAIN,\n npmCdn: DEFAULT_NPM_CDN,\n container: this,\n } as Params;\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 const skeletonHTML = `\n <div>\n <h1>Dynamic Content</h1>\n <p>This content was dynamically added to the widget before it loaded.</p>\n </div>\n `;\n const skeletonContainer = document.createElement(\"div\");\n skeletonContainer.id = \"loading-skeleton\";\n skeletonContainer.innerHTML = skeletonHTML;\n\n // Inject dynamic content before rendering the widget\n\n if (!this.shadowRoot) {\n this.attachShadow({ mode: \"open\" });\n }\n if (this.shadowRoot) {\n this.shadowRoot.innerHTML = skeletonHTML;\n }\n\n // Render the widget\n await this.renderWidget();\n\n // Remove the dynamic content after the widget loads\n const loadingElement = this.shadowRoot?.getElementById(\"loading-skeleton\");\n if (loadingElement) {\n loadingElement.remove();\n }\n\n if (this.getAttribute(\"open\") !== null) this.open();\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 const skeletonHTML = `\n <div>\n <h1>Dynamic Content</h1>\n <p>This content was dynamically added to the widget before it loaded.</p>\n </div>\n `;\n const skeletonContainer = document.createElement(\"div\");\n skeletonContainer.id = \"loading-skeleton\";\n skeletonContainer.innerHTML = skeletonHTML;\n\n // Inject dynamic content before rendering the widget\n\n if (!this.shadowRoot) {\n this.attachShadow({ mode: \"open\" });\n }\n if (this.shadowRoot) {\n this.shadowRoot.innerHTML = skeletonHTML;\n }\n\n // Render the widget\n await this.renderWidget();\n\n // Remove the dynamic content after the widget loads\n const loadingElement = this.shadowRoot?.getElementById(\"loading-skeleton\");\n if (loadingElement) {\n loadingElement.remove();\n }\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(): Promise<WidgetResult | undefined> | undefined {\n const configs = _getAutoConfig();\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":["ms","require$$0","debug","_typeof","obj","exports","module","init","converter","api","isObject","Cookies","_a","_log","widget"],"mappings":"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AAAA;AAAA,4BAwCd,WAAW;AAAA,+BACR,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,+BAmCX,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAgM1C;AC7VA,MAAMA,S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","x_google_ignoreList":[0,1,2,3]}
1
+ {"version":3,"file":"squatch.cjs.js","sources":["../node_modules/ms/index.js","../node_modules/debug/src/common.js","../node_modules/debug/src/browser.js","../node_modules/js-cookie/dist/js.cookie.mjs","../src/globals.ts","../src/utils/validate.ts","../src/utils/io.ts","../src/api/graphql.ts","../src/api/WidgetApi.ts","../src/utils/domready.ts","../src/utils/widgetUtils.ts","../src/api/AnalyticsApi.ts","../src/widgets/Widget.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":["/**\n * Helpers.\n */\n\nvar s = 1000;\nvar m = s * 60;\nvar h = m * 60;\nvar d = h * 24;\nvar w = d * 7;\nvar y = d * 365.25;\n\n/**\n * Parse or format the given `val`.\n *\n * Options:\n *\n * - `long` verbose formatting [false]\n *\n * @param {String|Number} val\n * @param {Object} [options]\n * @throws {Error} throw an error if val is not a non-empty string or a number\n * @return {String|Number}\n * @api public\n */\n\nmodule.exports = function (val, options) {\n options = options || {};\n var type = typeof val;\n if (type === 'string' && val.length > 0) {\n return parse(val);\n } else if (type === 'number' && isFinite(val)) {\n return options.long ? fmtLong(val) : fmtShort(val);\n }\n throw new Error(\n 'val is not a non-empty string or a valid number. val=' +\n JSON.stringify(val)\n );\n};\n\n/**\n * Parse the given `str` and return milliseconds.\n *\n * @param {String} str\n * @return {Number}\n * @api private\n */\n\nfunction parse(str) {\n str = String(str);\n if (str.length > 100) {\n return;\n }\n var match = /^(-?(?:\\d+)?\\.?\\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(\n str\n );\n if (!match) {\n return;\n }\n var n = parseFloat(match[1]);\n var type = (match[2] || 'ms').toLowerCase();\n switch (type) {\n case 'years':\n case 'year':\n case 'yrs':\n case 'yr':\n case 'y':\n return n * y;\n case 'weeks':\n case 'week':\n case 'w':\n return n * w;\n case 'days':\n case 'day':\n case 'd':\n return n * d;\n case 'hours':\n case 'hour':\n case 'hrs':\n case 'hr':\n case 'h':\n return n * h;\n case 'minutes':\n case 'minute':\n case 'mins':\n case 'min':\n case 'm':\n return n * m;\n case 'seconds':\n case 'second':\n case 'secs':\n case 'sec':\n case 's':\n return n * s;\n case 'milliseconds':\n case 'millisecond':\n case 'msecs':\n case 'msec':\n case 'ms':\n return n;\n default:\n return undefined;\n }\n}\n\n/**\n * Short format for `ms`.\n *\n * @param {Number} ms\n * @return {String}\n * @api private\n */\n\nfunction fmtShort(ms) {\n var msAbs = Math.abs(ms);\n if (msAbs >= d) {\n return Math.round(ms / d) + 'd';\n }\n if (msAbs >= h) {\n return Math.round(ms / h) + 'h';\n }\n if (msAbs >= m) {\n return Math.round(ms / m) + 'm';\n }\n if (msAbs >= s) {\n return Math.round(ms / s) + 's';\n }\n return ms + 'ms';\n}\n\n/**\n * Long format for `ms`.\n *\n * @param {Number} ms\n * @return {String}\n * @api private\n */\n\nfunction fmtLong(ms) {\n var msAbs = Math.abs(ms);\n if (msAbs >= d) {\n return plural(ms, msAbs, d, 'day');\n }\n if (msAbs >= h) {\n return plural(ms, msAbs, h, 'hour');\n }\n if (msAbs >= m) {\n return plural(ms, msAbs, m, 'minute');\n }\n if (msAbs >= s) {\n return plural(ms, msAbs, s, 'second');\n }\n return ms + ' ms';\n}\n\n/**\n * Pluralization helper.\n */\n\nfunction plural(ms, msAbs, n, name) {\n var isPlural = msAbs >= n * 1.5;\n return Math.round(ms / n) + ' ' + name + (isPlural ? 's' : '');\n}\n","\"use strict\";\n\n/**\n * This is the common logic for both the Node.js and web browser\n * implementations of `debug()`.\n */\nfunction setup(env) {\n createDebug.debug = createDebug;\n createDebug.default = createDebug;\n createDebug.coerce = coerce;\n createDebug.disable = disable;\n createDebug.enable = enable;\n createDebug.enabled = enabled;\n createDebug.humanize = require('ms');\n Object.keys(env).forEach(function (key) {\n createDebug[key] = env[key];\n });\n /**\n * Active `debug` instances.\n */\n\n createDebug.instances = [];\n /**\n * The currently active debug mode names, and names to skip.\n */\n\n createDebug.names = [];\n createDebug.skips = [];\n /**\n * Map of special \"%n\" handling functions, for the debug \"format\" argument.\n *\n * Valid key names are a single, lower or upper-case letter, i.e. \"n\" and \"N\".\n */\n\n createDebug.formatters = {};\n /**\n * Selects a color for a debug namespace\n * @param {String} namespace The namespace string for the for the debug instance to be colored\n * @return {Number|String} An ANSI color code for the given namespace\n * @api private\n */\n\n function selectColor(namespace) {\n var hash = 0;\n\n for (var i = 0; i < namespace.length; i++) {\n hash = (hash << 5) - hash + namespace.charCodeAt(i);\n hash |= 0; // Convert to 32bit integer\n }\n\n return createDebug.colors[Math.abs(hash) % createDebug.colors.length];\n }\n\n createDebug.selectColor = selectColor;\n /**\n * Create a debugger with the given `namespace`.\n *\n * @param {String} namespace\n * @return {Function}\n * @api public\n */\n\n function createDebug(namespace) {\n var prevTime;\n\n function debug() {\n // Disabled?\n if (!debug.enabled) {\n return;\n }\n\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n var self = debug; // Set `diff` timestamp\n\n var curr = Number(new Date());\n var ms = curr - (prevTime || curr);\n self.diff = ms;\n self.prev = prevTime;\n self.curr = curr;\n prevTime = curr;\n args[0] = createDebug.coerce(args[0]);\n\n if (typeof args[0] !== 'string') {\n // Anything else let's inspect with %O\n args.unshift('%O');\n } // Apply any `formatters` transformations\n\n\n var index = 0;\n args[0] = args[0].replace(/%([a-zA-Z%])/g, function (match, format) {\n // If we encounter an escaped % then don't increase the array index\n if (match === '%%') {\n return match;\n }\n\n index++;\n var formatter = createDebug.formatters[format];\n\n if (typeof formatter === 'function') {\n var val = args[index];\n match = formatter.call(self, val); // Now we need to remove `args[index]` since it's inlined in the `format`\n\n args.splice(index, 1);\n index--;\n }\n\n return match;\n }); // Apply env-specific formatting (colors, etc.)\n\n createDebug.formatArgs.call(self, args);\n var logFn = self.log || createDebug.log;\n logFn.apply(self, args);\n }\n\n debug.namespace = namespace;\n debug.enabled = createDebug.enabled(namespace);\n debug.useColors = createDebug.useColors();\n debug.color = selectColor(namespace);\n debug.destroy = destroy;\n debug.extend = extend; // Debug.formatArgs = formatArgs;\n // debug.rawLog = rawLog;\n // env-specific initialization logic for debug instances\n\n if (typeof createDebug.init === 'function') {\n createDebug.init(debug);\n }\n\n createDebug.instances.push(debug);\n return debug;\n }\n\n function destroy() {\n var index = createDebug.instances.indexOf(this);\n\n if (index !== -1) {\n createDebug.instances.splice(index, 1);\n return true;\n }\n\n return false;\n }\n\n function extend(namespace, delimiter) {\n return createDebug(this.namespace + (typeof delimiter === 'undefined' ? ':' : delimiter) + namespace);\n }\n /**\n * Enables a debug mode by namespaces. This can include modes\n * separated by a colon and wildcards.\n *\n * @param {String} namespaces\n * @api public\n */\n\n\n function enable(namespaces) {\n createDebug.save(namespaces);\n createDebug.names = [];\n createDebug.skips = [];\n var i;\n var split = (typeof namespaces === 'string' ? namespaces : '').split(/[\\s,]+/);\n var len = split.length;\n\n for (i = 0; i < len; i++) {\n if (!split[i]) {\n // ignore empty strings\n continue;\n }\n\n namespaces = split[i].replace(/\\*/g, '.*?');\n\n if (namespaces[0] === '-') {\n createDebug.skips.push(new RegExp('^' + namespaces.substr(1) + '$'));\n } else {\n createDebug.names.push(new RegExp('^' + namespaces + '$'));\n }\n }\n\n for (i = 0; i < createDebug.instances.length; i++) {\n var instance = createDebug.instances[i];\n instance.enabled = createDebug.enabled(instance.namespace);\n }\n }\n /**\n * Disable debug output.\n *\n * @api public\n */\n\n\n function disable() {\n createDebug.enable('');\n }\n /**\n * Returns true if the given mode name is enabled, false otherwise.\n *\n * @param {String} name\n * @return {Boolean}\n * @api public\n */\n\n\n function enabled(name) {\n if (name[name.length - 1] === '*') {\n return true;\n }\n\n var i;\n var len;\n\n for (i = 0, len = createDebug.skips.length; i < len; i++) {\n if (createDebug.skips[i].test(name)) {\n return false;\n }\n }\n\n for (i = 0, len = createDebug.names.length; i < len; i++) {\n if (createDebug.names[i].test(name)) {\n return true;\n }\n }\n\n return false;\n }\n /**\n * Coerce `val`.\n *\n * @param {Mixed} val\n * @return {Mixed}\n * @api private\n */\n\n\n function coerce(val) {\n if (val instanceof Error) {\n return val.stack || val.message;\n }\n\n return val;\n }\n\n createDebug.enable(createDebug.load());\n return createDebug;\n}\n\nmodule.exports = setup;\n\n","\"use strict\";\n\nfunction _typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\n/* eslint-env browser */\n\n/**\n * This is the web browser implementation of `debug()`.\n */\nexports.log = log;\nexports.formatArgs = formatArgs;\nexports.save = save;\nexports.load = load;\nexports.useColors = useColors;\nexports.storage = localstorage();\n/**\n * Colors.\n */\n\nexports.colors = ['#0000CC', '#0000FF', '#0033CC', '#0033FF', '#0066CC', '#0066FF', '#0099CC', '#0099FF', '#00CC00', '#00CC33', '#00CC66', '#00CC99', '#00CCCC', '#00CCFF', '#3300CC', '#3300FF', '#3333CC', '#3333FF', '#3366CC', '#3366FF', '#3399CC', '#3399FF', '#33CC00', '#33CC33', '#33CC66', '#33CC99', '#33CCCC', '#33CCFF', '#6600CC', '#6600FF', '#6633CC', '#6633FF', '#66CC00', '#66CC33', '#9900CC', '#9900FF', '#9933CC', '#9933FF', '#99CC00', '#99CC33', '#CC0000', '#CC0033', '#CC0066', '#CC0099', '#CC00CC', '#CC00FF', '#CC3300', '#CC3333', '#CC3366', '#CC3399', '#CC33CC', '#CC33FF', '#CC6600', '#CC6633', '#CC9900', '#CC9933', '#CCCC00', '#CCCC33', '#FF0000', '#FF0033', '#FF0066', '#FF0099', '#FF00CC', '#FF00FF', '#FF3300', '#FF3333', '#FF3366', '#FF3399', '#FF33CC', '#FF33FF', '#FF6600', '#FF6633', '#FF9900', '#FF9933', '#FFCC00', '#FFCC33'];\n/**\n * Currently only WebKit-based Web Inspectors, Firefox >= v31,\n * and the Firebug extension (any Firefox version) are known\n * to support \"%c\" CSS customizations.\n *\n * TODO: add a `localStorage` variable to explicitly enable/disable colors\n */\n// eslint-disable-next-line complexity\n\nfunction useColors() {\n // NB: In an Electron preload script, document will be defined but not fully\n // initialized. Since we know we're in Chrome, we'll just detect this case\n // explicitly\n if (typeof window !== 'undefined' && window.process && (window.process.type === 'renderer' || window.process.__nwjs)) {\n return true;\n } // Internet Explorer and Edge do not support colors.\n\n\n if (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/(edge|trident)\\/(\\d+)/)) {\n return false;\n } // Is webkit? http://stackoverflow.com/a/16459606/376773\n // document is undefined in react-native: https://github.com/facebook/react-native/pull/1632\n\n\n return typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance || // Is firebug? http://stackoverflow.com/a/398120/376773\n typeof window !== 'undefined' && window.console && (window.console.firebug || window.console.exception && window.console.table) || // Is firefox >= v31?\n // https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages\n typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/firefox\\/(\\d+)/) && parseInt(RegExp.$1, 10) >= 31 || // Double check webkit in userAgent just in case we are in a worker\n typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\\/(\\d+)/);\n}\n/**\n * Colorize log arguments if enabled.\n *\n * @api public\n */\n\n\nfunction formatArgs(args) {\n args[0] = (this.useColors ? '%c' : '') + this.namespace + (this.useColors ? ' %c' : ' ') + args[0] + (this.useColors ? '%c ' : ' ') + '+' + module.exports.humanize(this.diff);\n\n if (!this.useColors) {\n return;\n }\n\n var c = 'color: ' + this.color;\n args.splice(1, 0, c, 'color: inherit'); // The final \"%c\" is somewhat tricky, because there could be other\n // arguments passed either before or after the %c, so we need to\n // figure out the correct index to insert the CSS into\n\n var index = 0;\n var lastC = 0;\n args[0].replace(/%[a-zA-Z%]/g, function (match) {\n if (match === '%%') {\n return;\n }\n\n index++;\n\n if (match === '%c') {\n // We only are interested in the *last* %c\n // (the user may have provided their own)\n lastC = index;\n }\n });\n args.splice(lastC, 0, c);\n}\n/**\n * Invokes `console.log()` when available.\n * No-op when `console.log` is not a \"function\".\n *\n * @api public\n */\n\n\nfunction log() {\n var _console;\n\n // This hackery is required for IE8/9, where\n // the `console.log` function doesn't have 'apply'\n return (typeof console === \"undefined\" ? \"undefined\" : _typeof(console)) === 'object' && console.log && (_console = console).log.apply(_console, arguments);\n}\n/**\n * Save `namespaces`.\n *\n * @param {String} namespaces\n * @api private\n */\n\n\nfunction save(namespaces) {\n try {\n if (namespaces) {\n exports.storage.setItem('debug', namespaces);\n } else {\n exports.storage.removeItem('debug');\n }\n } catch (error) {// Swallow\n // XXX (@Qix-) should we be logging these?\n }\n}\n/**\n * Load `namespaces`.\n *\n * @return {String} returns the previously persisted debug modes\n * @api private\n */\n\n\nfunction load() {\n var r;\n\n try {\n r = exports.storage.getItem('debug');\n } catch (error) {} // Swallow\n // XXX (@Qix-) should we be logging these?\n // If debug isn't set in LS, and we're in Electron, try to load $DEBUG\n\n\n if (!r && typeof process !== 'undefined' && 'env' in process) {\n r = process.env.DEBUG;\n }\n\n return r;\n}\n/**\n * Localstorage attempts to return the localstorage.\n *\n * This is necessary because safari throws\n * when a user disables cookies/localstorage\n * and you attempt to access it.\n *\n * @return {LocalStorage}\n * @api private\n */\n\n\nfunction localstorage() {\n try {\n // TVMLKit (Apple TV JS Runtime) does not have a window object, just localStorage in the global context\n // The Browser also has localStorage in the global context.\n return localStorage;\n } catch (error) {// Swallow\n // XXX (@Qix-) should we be logging these?\n }\n}\n\nmodule.exports = require('./common')(exports);\nvar formatters = module.exports.formatters;\n/**\n * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default.\n */\n\nformatters.j = function (v) {\n try {\n return JSON.stringify(v);\n } catch (error) {\n return '[UnexpectedJSONParseError]: ' + error.message;\n }\n};\n\n","/*! js-cookie v3.0.5 | MIT */\n/* eslint-disable no-var */\nfunction assign (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n for (var key in source) {\n target[key] = source[key];\n }\n }\n return target\n}\n/* eslint-enable no-var */\n\n/* eslint-disable no-var */\nvar defaultConverter = {\n read: function (value) {\n if (value[0] === '\"') {\n value = value.slice(1, -1);\n }\n return value.replace(/(%[\\dA-F]{2})+/gi, decodeURIComponent)\n },\n write: function (value) {\n return encodeURIComponent(value).replace(\n /%(2[346BF]|3[AC-F]|40|5[BDE]|60|7[BCD])/g,\n decodeURIComponent\n )\n }\n};\n/* eslint-enable no-var */\n\n/* eslint-disable no-var */\n\nfunction init (converter, defaultAttributes) {\n function set (name, value, attributes) {\n if (typeof document === 'undefined') {\n return\n }\n\n attributes = assign({}, defaultAttributes, attributes);\n\n if (typeof attributes.expires === 'number') {\n attributes.expires = new Date(Date.now() + attributes.expires * 864e5);\n }\n if (attributes.expires) {\n attributes.expires = attributes.expires.toUTCString();\n }\n\n name = encodeURIComponent(name)\n .replace(/%(2[346B]|5E|60|7C)/g, decodeURIComponent)\n .replace(/[()]/g, escape);\n\n var stringifiedAttributes = '';\n for (var attributeName in attributes) {\n if (!attributes[attributeName]) {\n continue\n }\n\n stringifiedAttributes += '; ' + attributeName;\n\n if (attributes[attributeName] === true) {\n continue\n }\n\n // Considers RFC 6265 section 5.2:\n // ...\n // 3. If the remaining unparsed-attributes contains a %x3B (\";\")\n // character:\n // Consume the characters of the unparsed-attributes up to,\n // not including, the first %x3B (\";\") character.\n // ...\n stringifiedAttributes += '=' + attributes[attributeName].split(';')[0];\n }\n\n return (document.cookie =\n name + '=' + converter.write(value, name) + stringifiedAttributes)\n }\n\n function get (name) {\n if (typeof document === 'undefined' || (arguments.length && !name)) {\n return\n }\n\n // To prevent the for loop in the first place assign an empty array\n // in case there are no cookies at all.\n var cookies = document.cookie ? document.cookie.split('; ') : [];\n var jar = {};\n for (var i = 0; i < cookies.length; i++) {\n var parts = cookies[i].split('=');\n var value = parts.slice(1).join('=');\n\n try {\n var found = decodeURIComponent(parts[0]);\n jar[found] = converter.read(value, found);\n\n if (name === found) {\n break\n }\n } catch (e) {}\n }\n\n return name ? jar[name] : jar\n }\n\n return Object.create(\n {\n set,\n get,\n remove: function (name, attributes) {\n set(\n name,\n '',\n assign({}, attributes, {\n expires: -1\n })\n );\n },\n withAttributes: function (attributes) {\n return init(this.converter, assign({}, this.attributes, attributes))\n },\n withConverter: function (converter) {\n return init(assign({}, this.converter, converter), this.attributes)\n }\n },\n {\n attributes: { value: Object.freeze(defaultAttributes) },\n converter: { value: Object.freeze(converter) }\n }\n )\n}\n\nvar api = init(defaultConverter, { path: '/' });\n/* eslint-enable no-var */\n\nexport { api as default };\n","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","/*!\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","export function formatWidth({\n value,\n unit,\n}: {\n value: number;\n unit: \"px\" | \"%\";\n}) {\n switch (unit) {\n case \"px\":\n return `${value}px`;\n case \"%\":\n return `${value}%`;\n default:\n return `${value}px`;\n }\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};\nexport type WidthSetting = {\n value: number;\n unit: \"px\" | \"%\";\n};\nexport type WidgetWidths = {\n minWidth: WidthSetting;\n maxWidth: WidthSetting;\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(options?: { minWidth?: string; maxWidth?: string }) {\n const frame = document.createElement(\"iframe\");\n frame[\"squatchJsApi\"] = this;\n frame.id = \"squatchFrame\";\n frame.width = \"100%\";\n\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 if (options?.minWidth) frame.style.minWidth = options.minWidth;\n if (options?.maxWidth) frame.style.maxWidth = options.maxWidth;\n if (options?.maxWidth || options?.minWidth) {\n // Avoid 1px width when custom width is set\n frame.style.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","// @ts-check\n\nimport { debug } from \"debug\";\nimport { UpsertWidgetContext } from \"../types\";\nimport { domready } from \"../utils/domready\";\nimport { formatWidth } from \"../utils/widgetUtils\";\nimport Widget, { Params } from \"./Widget\";\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 brandingConfig = this.context.widgetConfig?.values?.brandingConfig;\n const sizes = brandingConfig?.widgetSize?.embeddedWidgets;\n const maxWidth = sizes?.maxWidth ? formatWidth(sizes.maxWidth) : \"\";\n const minWidth = sizes?.minWidth ? formatWidth(sizes.minWidth) : \"\";\n\n const frame = this._createFrame({ minWidth, maxWidth });\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 { UpsertWidgetContext } from \"../types\";\nimport { domready } from \"../utils/domready\";\nimport { formatWidth } from \"../utils/widgetUtils\";\nimport Widget, { Params } from \"./Widget\";\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 const brandingConfig = this.context.widgetConfig?.values?.brandingConfig;\n const sizes = brandingConfig?.widgetSize?.popupWidgets;\n\n // Still styling the dialog to keep consistent with previous versions\n const minWidth = sizes?.minWidth ? formatWidth(sizes.minWidth) : \"auto\";\n const maxWidth = sizes?.maxWidth ? formatWidth(sizes.maxWidth) : \"500px\";\n dialog.id = this.id;\n dialog.setAttribute(\n \"style\",\n `width: 100%; min-width: ${minWidth}; max-width: ${maxWidth}; 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 widgetConfig: {\n values: {\n brandingConfig: response?.brandingConfig,\n },\n },\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 widgetConfig: response?.widgetConfig,\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\";\nimport { validateConfig } from \"./validate\";\n\n/** @hidden */\nconst _log = debug(\"squatch-js\");\n\nexport function _getAutoConfig():\n | { widgetConfig: WidgetConfig; squatchConfig: ConfigOptions }\n | 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 const config = validateConfig({\n tenantAlias: \"UNKNOWN\",\n });\n\n if (!config.domain) {\n _log(\"domain must be provided in config to use _saasquatchExtra\");\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 // Normalize the domain by removing protocol (e.g., 'https://')\n function normalizeDomain(domain: string): string {\n return domain.replace(/^https?:\\/\\//, \"\");\n }\n\n const normalizedDomain = normalizeDomain(config.domain);\n\n // _saasquatchExtra is expected to be structured as:\n // {\n // [domain]: {\n // [tenantAlias]: {\n // autoPopupWidgetType: string,\n // ...otherWidgetConfig\n // }\n // }\n // }\n //\n\n const tenantAlias = Object.keys(raw?.[normalizedDomain] || {})[0];\n const widgetConfig = raw?.[normalizedDomain]?.[tenantAlias];\n\n if (!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 ...config,\n tenantAlias,\n },\n };\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 { DEFAULT_DOMAIN, DEFAULT_NPM_CDN } from \"../../globals\";\nimport {\n ConfigOptions,\n DeclarativeConfigOptions,\n User,\n WidgetValueConfig,\n} from \"../../types\";\nimport { decodeUserJwt } from \"../../utils/decodeUserJwt\";\nimport { getConfig, getToken } from \"../../utils/validate\";\nimport EmbedWidget from \"../EmbedWidget\";\nimport PopupWidget from \"../PopupWidget\";\nimport type { Params } from \"../Widget\";\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, { 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 await this.widgetApi.upsertUser({\n user: userObj,\n locale: this.locale,\n engagementMedium: this.type,\n widgetType: this.widgetType,\n jwt: this.token,\n });\n\n const widgetInstance = await this.widgetApi\n .render({\n locale: this.locale,\n engagementMedium: this.type,\n widgetType: this.widgetType,\n })\n .then((res) => {\n return this._setWidget(res, { type: \"upsert\", user: userObj });\n })\n .catch(this.setErrorWidget);\n\n return widgetInstance;\n }\n\n private _setWidget = (\n res: { template: any; widgetConfig: WidgetValueConfig },\n config: { type: \"upsert\" | \"passwordless\"; user?: User }\n ) => {\n const params = {\n api: this.widgetApi,\n content: res.template,\n context: {\n type: config.type,\n user: config.user,\n container: this.container || undefined,\n engagementMedium: this.type,\n widgetConfig: res.widgetConfig,\n },\n type: this.widgetType!,\n domain: this.config?.domain || DEFAULT_DOMAIN,\n npmCdn: DEFAULT_NPM_CDN,\n container: this,\n } as Params;\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(): Promise<WidgetResult | undefined> | undefined {\n const configs = _getAutoConfig();\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":["ms","require$$0","debug","_typeof","obj","exports","module","init","converter","api","isObject","Cookies","_a","_log","widget"],"mappings":"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","x_google_ignoreList":[0,1,2,3]}