@mochabug/adapt-sdk 0.1.5 → 0.1.6

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,2 +1,2 @@
1
- var e=null;function h(i=!1){if(i)return"dev-token";if(e!==null)return e;let t="mb_token";if(typeof globalThis.window>"u"||typeof globalThis.location>"u")throw new Error("getToken() is only available in browser environments");let n=globalThis,a=n.location.hash.slice(1);if(!a)throw new Error("No token found in URL hash");let o=new URLSearchParams(a),r=o.get(t);if(!r)throw new Error('Token "mb_token" not found in URL hash');e=decodeURIComponent(r),o.delete(t);let s=o.toString(),l=n.location.pathname+n.location.search+(s?"#"+s:"");return n.history.replaceState(null,"",l),e}export{h as getToken};
1
+ var c=null;function z(e=!1){if(e)return"dev-token";if(c!==null)return c;if(typeof window>"u"||typeof location>"u")throw new Error("getToken() is only available in browser environments");let t=location.hash.slice(1);if(!t)throw new Error("No token found in URL hash");let n=new URLSearchParams(t).get("mb_token");if(!n)throw new Error('Token "mb_token" not found in URL hash');return c=decodeURIComponent(n),c}function M(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function k(e){return M(e)&&e.type==="adapt-darkMode"&&typeof e.darkMode=="boolean"}function b(e){return Number.isFinite(e)&&e>=1}function v(e){return M(e)&&typeof e.postMessage=="function"}var d=null,p=null,l=null,i=!1,h=-1,m=-1,r=null,a=null,R=16;function s(){return typeof window<"u"&&typeof document<"u"&&typeof window.postMessage=="function"}function w(){if(!s())return!1;try{return window.self!==window.top}catch{return!0}}function E(){let{body:e,documentElement:t}=document;if(!e||!t)return null;let n=Math.max(e.scrollHeight,e.offsetHeight,t.clientHeight,t.scrollHeight,t.offsetHeight),o=Math.max(e.scrollWidth,e.offsetWidth,t.clientWidth,t.scrollWidth,t.offsetWidth);return!b(o)||!b(n)?null:{width:o,height:n}}function f(){!i||r!==null||(r=setTimeout(()=>{r=null,i&&u()},R))}function u(){if(!s()||!w())return;let e=window.parent;if(!v(e))return;let t=E();if(!t)return;let{width:n,height:o}=t;if(!(n===h&&o===m)){h=n,m=o;try{e.postMessage({type:"adapt-resize",width:n,height:o},"*")}catch{}}}function y(e){let t;try{t=e.data}catch{return}if(k(t)&&l)try{l(t.darkMode)}catch{}}function T(){!s()||!w()||(d=new ResizeObserver(f),document.body&&d.observe(document.body),document.documentElement&&d.observe(document.documentElement),document.body&&(p=new MutationObserver(f),p.observe(document.body,{childList:!0,subtree:!0,attributes:!0,characterData:!0})),document.addEventListener("load",f,!0),document.fonts?.ready?.then(()=>{i&&u()}),document.readyState==="complete"?u():(a=u,window.addEventListener("load",a)))}function g(){s()&&(window.removeEventListener("message",y),document.removeEventListener("load",f,!0),a&&(window.removeEventListener("load",a),a=null),r!==null&&(clearTimeout(r),r=null),d?.disconnect(),d=null,p?.disconnect(),p=null,l=null,i=!1,h=-1,m=-1)}function L(e){return s()?i?(e&&(l=e),g):(l=e??null,window.addEventListener("message",y),T(),i=!0,g):()=>{}}function A(){u()}function x(e){if(!s()||!w())return;let t=window.parent;if(v(t))try{t.postMessage(e,"*")}catch{}}export{z as getToken,L as initIframeCommunication,A as sendResize,x as sendToParent};
2
2
  //# sourceMappingURL=frontend.mjs.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/frontend.ts"],
4
- "sourcesContent": ["/**\n * Simple token utility for waiting on hash-based tokens\n */\n\n/**\n * Simple token utility for waiting on hash-based tokens\n */\n\nlet cachedToken: string | null = null;\n\n/**\n * Gets the token from URL hash (first call) or returns cached value (subsequent calls)\n * @param isDevelopment - If true, returns 'dev-token' for local development\n * @returns The token string\n */\nexport function getToken(isDevelopment = false): string {\n // Development mode - return immediately\n if (isDevelopment) {\n return 'dev-token';\n }\n\n // Return cached token if already retrieved\n if (cachedToken !== null) {\n return cachedToken;\n }\n\n const tokenKey = 'mb_token';\n\n // Non-browser environment - throw error\n if (\n typeof (globalThis as any).window === 'undefined' ||\n typeof (globalThis as any).location === 'undefined'\n ) {\n throw new Error('getToken() is only available in browser environments');\n }\n\n const win = globalThis as any;\n\n const hash = win.location.hash.slice(1);\n if (!hash) {\n throw new Error('No token found in URL hash');\n }\n\n const params = new URLSearchParams(hash);\n const token = params.get(tokenKey);\n if (!token) {\n throw new Error('Token \"mb_token\" not found in URL hash');\n }\n\n // Cache the token BEFORE removing from URL\n cachedToken = decodeURIComponent(token);\n\n // Clean URL\n params.delete(tokenKey);\n const newHash = params.toString();\n const newUrl =\n win.location.pathname +\n win.location.search +\n (newHash ? '#' + newHash : '');\n win.history.replaceState(null, '', newUrl);\n\n return cachedToken;\n}\n"],
5
- "mappings": "AAQA,IAAIA,EAA6B,KAO1B,SAASC,EAASC,EAAgB,GAAe,CAEtD,GAAIA,EACF,MAAO,YAIT,GAAIF,IAAgB,KAClB,OAAOA,EAGT,IAAMG,EAAW,WAGjB,GACE,OAAQ,WAAmB,OAAW,KACtC,OAAQ,WAAmB,SAAa,IAExC,MAAM,IAAI,MAAM,sDAAsD,EAGxE,IAAMC,EAAM,WAENC,EAAOD,EAAI,SAAS,KAAK,MAAM,CAAC,EACtC,GAAI,CAACC,EACH,MAAM,IAAI,MAAM,4BAA4B,EAG9C,IAAMC,EAAS,IAAI,gBAAgBD,CAAI,EACjCE,EAAQD,EAAO,IAAIH,CAAQ,EACjC,GAAI,CAACI,EACH,MAAM,IAAI,MAAM,wCAAwC,EAI1DP,EAAc,mBAAmBO,CAAK,EAGtCD,EAAO,OAAOH,CAAQ,EACtB,IAAMK,EAAUF,EAAO,SAAS,EAC1BG,EACJL,EAAI,SAAS,SACbA,EAAI,SAAS,QACZI,EAAU,IAAMA,EAAU,IAC7B,OAAAJ,EAAI,QAAQ,aAAa,KAAM,GAAIK,CAAM,EAElCT,CACT",
6
- "names": ["cachedToken", "getToken", "isDevelopment", "tokenKey", "win", "hash", "params", "token", "newHash", "newUrl"]
4
+ "sourcesContent": ["/**\n * Frontend utilities for Adapt plugins running in browser/iframe contexts\n */\n\nlet cachedToken: string | null = null;\n\nexport function getToken(isDevelopment = false): string {\n if (isDevelopment) return 'dev-token';\n if (cachedToken !== null) return cachedToken;\n\n if (typeof window === 'undefined' || typeof location === 'undefined') {\n throw new Error('getToken() is only available in browser environments');\n }\n\n const hash = location.hash.slice(1);\n if (!hash) throw new Error('No token found in URL hash');\n\n const token = new URLSearchParams(hash).get('mb_token');\n if (!token) throw new Error('Token \"mb_token\" not found in URL hash');\n\n cachedToken = decodeURIComponent(token);\n return cachedToken;\n}\n\n// Message types\nexport interface AdaptResizeMessage {\n type: 'adapt-resize';\n width: number;\n height: number;\n}\n\nexport interface AdaptDarkModeMessage {\n type: 'adapt-darkMode';\n darkMode: boolean;\n}\n\nexport type AdaptParentMessage = AdaptDarkModeMessage;\nexport type AdaptChildMessage = AdaptResizeMessage;\n\n// Type guards\nfunction isObject(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\nfunction isDarkModeMessage(data: unknown): data is AdaptDarkModeMessage {\n return (\n isObject(data) &&\n data.type === 'adapt-darkMode' &&\n typeof data.darkMode === 'boolean'\n );\n}\n\nfunction isValidDimension(value: number): boolean {\n return Number.isFinite(value) && value >= 1;\n}\n\nfunction hasPostMessage(\n obj: unknown\n): obj is { postMessage: typeof postMessage } {\n return isObject(obj) && typeof obj.postMessage === 'function';\n}\n\n// State\nlet resizeObserver: ResizeObserver | null = null;\nlet mutationObserver: MutationObserver | null = null;\nlet darkModeCallback: ((darkMode: boolean) => void) | null = null;\nlet initialized = false;\nlet lastSentWidth = -1;\nlet lastSentHeight = -1;\nlet throttleTimer: ReturnType<typeof setTimeout> | null = null;\nlet windowLoadHandler: (() => void) | null = null;\n\nconst THROTTLE_MS = 16;\n\nfunction isBrowser(): boolean {\n return (\n typeof window !== 'undefined' &&\n typeof document !== 'undefined' &&\n typeof window.postMessage === 'function'\n );\n}\n\nfunction isInIframe(): boolean {\n if (!isBrowser()) return false;\n try {\n return window.self !== window.top;\n } catch {\n return true;\n }\n}\n\nfunction getContentDimensions(): { width: number; height: number } | null {\n const { body, documentElement: html } = document;\n if (!body || !html) return null;\n\n const height = Math.max(\n body.scrollHeight,\n body.offsetHeight,\n html.clientHeight,\n html.scrollHeight,\n html.offsetHeight\n );\n\n const width = Math.max(\n body.scrollWidth,\n body.offsetWidth,\n html.clientWidth,\n html.scrollWidth,\n html.offsetWidth\n );\n\n if (!isValidDimension(width) || !isValidDimension(height)) return null;\n\n return { width, height };\n}\n\nfunction sendResizeThrottled(): void {\n if (!initialized || throttleTimer !== null) return;\n\n throttleTimer = setTimeout(() => {\n throttleTimer = null;\n if (initialized) sendResizeImmediate();\n }, THROTTLE_MS);\n}\n\nfunction sendResizeImmediate(): void {\n if (!isBrowser() || !isInIframe()) return;\n\n const parent = window.parent;\n if (!hasPostMessage(parent)) return;\n\n const dims = getContentDimensions();\n if (!dims) return;\n\n const { width, height } = dims;\n if (width === lastSentWidth && height === lastSentHeight) return;\n\n lastSentWidth = width;\n lastSentHeight = height;\n\n try {\n parent.postMessage(\n { type: 'adapt-resize', width, height } satisfies AdaptResizeMessage,\n '*'\n );\n } catch {}\n}\n\nfunction handleMessage(event: MessageEvent): void {\n let data: unknown;\n try {\n data = event.data;\n } catch {\n return;\n }\n\n if (isDarkModeMessage(data) && darkModeCallback) {\n try {\n darkModeCallback(data.darkMode);\n } catch {}\n }\n}\n\nfunction setupObservers(): void {\n if (!isBrowser() || !isInIframe()) return;\n\n resizeObserver = new ResizeObserver(sendResizeThrottled);\n if (document.body) resizeObserver.observe(document.body);\n if (document.documentElement)\n resizeObserver.observe(document.documentElement);\n\n if (document.body) {\n mutationObserver = new MutationObserver(sendResizeThrottled);\n mutationObserver.observe(document.body, {\n childList: true,\n subtree: true,\n attributes: true,\n characterData: true\n });\n }\n\n document.addEventListener('load', sendResizeThrottled, true);\n\n document.fonts?.ready?.then(() => {\n if (initialized) sendResizeImmediate();\n });\n\n if (document.readyState === 'complete') {\n sendResizeImmediate();\n } else {\n windowLoadHandler = sendResizeImmediate;\n window.addEventListener('load', windowLoadHandler);\n }\n}\n\nfunction cleanup(): void {\n if (!isBrowser()) return;\n\n window.removeEventListener('message', handleMessage);\n document.removeEventListener('load', sendResizeThrottled, true);\n\n if (windowLoadHandler) {\n window.removeEventListener('load', windowLoadHandler);\n windowLoadHandler = null;\n }\n\n if (throttleTimer !== null) {\n clearTimeout(throttleTimer);\n throttleTimer = null;\n }\n\n resizeObserver?.disconnect();\n resizeObserver = null;\n\n mutationObserver?.disconnect();\n mutationObserver = null;\n\n darkModeCallback = null;\n initialized = false;\n lastSentWidth = -1;\n lastSentHeight = -1;\n}\n\nexport function initIframeCommunication(\n onDarkModeChange?: (darkMode: boolean) => void\n): () => void {\n if (!isBrowser()) return () => {};\n\n if (initialized) {\n if (onDarkModeChange) darkModeCallback = onDarkModeChange;\n return cleanup;\n }\n\n darkModeCallback = onDarkModeChange ?? null;\n window.addEventListener('message', handleMessage);\n setupObservers();\n initialized = true;\n\n return cleanup;\n}\n\nexport function sendResize(): void {\n sendResizeImmediate();\n}\n\nexport function sendToParent(message: AdaptChildMessage): void {\n if (!isBrowser() || !isInIframe()) return;\n\n const parent = window.parent;\n if (!hasPostMessage(parent)) return;\n\n try {\n parent.postMessage(message, '*');\n } catch {}\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["cachedToken", "getToken", "isDevelopment", "hash", "token", "isObject", "value", "isDarkModeMessage", "data", "isValidDimension", "hasPostMessage", "obj", "resizeObserver", "mutationObserver", "darkModeCallback", "initialized", "lastSentWidth", "lastSentHeight", "throttleTimer", "windowLoadHandler", "THROTTLE_MS", "isBrowser", "isInIframe", "getContentDimensions", "body", "html", "height", "width", "sendResizeThrottled", "sendResizeImmediate", "parent", "dims", "handleMessage", "event", "setupObservers", "cleanup", "initIframeCommunication", "onDarkModeChange", "sendResize", "sendToParent", "message"]
7
7
  }