@manototh/do11y 0.2.0 → 0.2.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.
- package/README.md +5 -5
- package/dist/do11y.js +17 -10
- package/dist/do11y.min.js +1 -1
- package/dist/instrumentation/index.js +1 -1
- package/examples/do11y-config.example.js +1 -1
- package/package.json +5 -5
package/README.md
CHANGED
|
@@ -7,7 +7,7 @@ Do11y is a documentation observability tool. It streams behavioral events from y
|
|
|
7
7
|
- Page views
|
|
8
8
|
- Scroll depth
|
|
9
9
|
- Link clicks
|
|
10
|
-
- Search
|
|
10
|
+
- Search usage
|
|
11
11
|
- Code-block copies
|
|
12
12
|
- Section reading time
|
|
13
13
|
- Tab switches
|
|
@@ -19,13 +19,13 @@ Do11y is built for humans and machines alike. It emits observability data design
|
|
|
19
19
|
|
|
20
20
|
Do11y is agent-native: it detects AI platform referrers (ChatGPT, Perplexity, Claude, Gemini, and others) so you can understand how agents and humans engage with your content differently.
|
|
21
21
|
|
|
22
|
-
The
|
|
22
|
+
The standalone artifact is a single dependency-free JavaScript file. The source is TypeScript. [rolldown](https://rolldown.rs) produces the built output.
|
|
23
23
|
|
|
24
24
|
## Privacy
|
|
25
25
|
|
|
26
26
|
Do11y collects anonymous usage data:
|
|
27
27
|
|
|
28
|
-
- No cookies. Do11y uses `sessionStorage`, which the browser clears when
|
|
28
|
+
- No cookies. Do11y uses `sessionStorage`, which the browser clears when the tab closes.
|
|
29
29
|
- No personally identifiable information (PII).
|
|
30
30
|
- No device fingerprinting.
|
|
31
31
|
- No cross-site tracking.
|
|
@@ -49,11 +49,11 @@ For other frameworks, use manual setup with custom selectors.
|
|
|
49
49
|
|
|
50
50
|
## Setup
|
|
51
51
|
|
|
52
|
-
Follow the [get started guide](https://docservable.com/get-started) to set up Do11y.
|
|
52
|
+
You can install Do11y as a standalone script or as an instrumentation layer on top of the official [OpenTelemetry Browser SDK](https://github.com/open-telemetry/opentelemetry-browser). Follow the [get started guide](https://docservable.com/get-started) to set up Do11y.
|
|
53
53
|
|
|
54
54
|
## Configuration
|
|
55
55
|
|
|
56
|
-
You can set
|
|
56
|
+
You can set options via meta tags or a configuration object. See the [configuration docs](https://docservable.com/configuration) for the full reference.
|
|
57
57
|
|
|
58
58
|
## Insights
|
|
59
59
|
|
package/dist/do11y.js
CHANGED
|
@@ -9,7 +9,7 @@ var Do11yBundle = (function(exports) {
|
|
|
9
9
|
* Standard attrs from https://opentelemetry.io/docs/specs/semconv/.
|
|
10
10
|
* Custom do11y attrs use the `browser.do11y.*` namespace.
|
|
11
11
|
*/
|
|
12
|
-
const VERSION = "0.2.
|
|
12
|
+
const VERSION = "0.2.2";
|
|
13
13
|
const ATTR_SESSION_ID = "session.id";
|
|
14
14
|
const ATTR_URL_PATH = "url.path";
|
|
15
15
|
const ATTR_URL_FRAGMENT = "url.fragment";
|
|
@@ -1064,6 +1064,9 @@ var Do11yBundle = (function(exports) {
|
|
|
1064
1064
|
let _otelInitPromise = null;
|
|
1065
1065
|
/** Set once CDN init fails so we don't retry the load on every event. */
|
|
1066
1066
|
let _otelInitFailed = false;
|
|
1067
|
+
/** Set once the self-hosted Supabase hint has been logged, so debug mode
|
|
1068
|
+
* doesn't repeat it on every flush. */
|
|
1069
|
+
let _selfHostedHintLogged = false;
|
|
1067
1070
|
function setIsDisabled(v) {
|
|
1068
1071
|
isDisabled = v;
|
|
1069
1072
|
}
|
|
@@ -1118,12 +1121,12 @@ var Do11yBundle = (function(exports) {
|
|
|
1118
1121
|
if (flushTimeout) return;
|
|
1119
1122
|
flushTimeout = setTimeout(() => flush(config), config.flushInterval);
|
|
1120
1123
|
}
|
|
1121
|
-
function validateSupabaseUrl(url) {
|
|
1124
|
+
function validateSupabaseUrl(url, debug = false) {
|
|
1125
|
+
return validateEndpoint(url, debug);
|
|
1126
|
+
}
|
|
1127
|
+
function isHostedSupabaseUrl(url) {
|
|
1122
1128
|
try {
|
|
1123
|
-
|
|
1124
|
-
if (parsed.protocol !== "https:") return false;
|
|
1125
|
-
if (!parsed.hostname.endsWith(".supabase.co")) return false;
|
|
1126
|
-
return true;
|
|
1129
|
+
return new URL(url).hostname.endsWith(".supabase.co");
|
|
1127
1130
|
} catch {
|
|
1128
1131
|
return false;
|
|
1129
1132
|
}
|
|
@@ -1147,10 +1150,14 @@ var Do11yBundle = (function(exports) {
|
|
|
1147
1150
|
if (config.debug) console.warn("[Do11y] No Supabase URL configured");
|
|
1148
1151
|
return false;
|
|
1149
1152
|
}
|
|
1150
|
-
if (!validateSupabaseUrl(config.supabaseUrl)) {
|
|
1151
|
-
if (config.debug) console.warn("[Do11y] Invalid Supabase URL. Must be
|
|
1153
|
+
if (!validateSupabaseUrl(config.supabaseUrl, config.debug)) {
|
|
1154
|
+
if (config.debug) console.warn("[Do11y] Invalid Supabase URL. Must be a valid HTTPS URL (HTTP is allowed for localhost/private addresses when debug is enabled).");
|
|
1152
1155
|
return false;
|
|
1153
1156
|
}
|
|
1157
|
+
if (config.debug && !_selfHostedHintLogged && !isHostedSupabaseUrl(config.supabaseUrl)) {
|
|
1158
|
+
_selfHostedHintLogged = true;
|
|
1159
|
+
console.warn("[Do11y] Non-hosted Supabase URL. Ensure you configure your instance's REST endpoint and CORS settings.");
|
|
1160
|
+
}
|
|
1154
1161
|
if (!config.supabaseKey || typeof config.supabaseKey !== "string" || config.supabaseKey.length < 10) {
|
|
1155
1162
|
if (config.debug) console.warn("[Do11y] Invalid or missing Supabase publishable key");
|
|
1156
1163
|
return false;
|
|
@@ -1191,7 +1198,7 @@ var Do11yBundle = (function(exports) {
|
|
|
1191
1198
|
const OTEL_CDN_BASE = "https://esm.sh/";
|
|
1192
1199
|
/** Version of the OTel SDK packages loaded from the CDN.
|
|
1193
1200
|
* Keep in sync with the `@opentelemetry/*` peer/dev dependencies in package.json. */
|
|
1194
|
-
const OTEL_SDK_VERSION = "0.
|
|
1201
|
+
const OTEL_SDK_VERSION = "0.222.0";
|
|
1195
1202
|
/** Emit a single event through the OTel Logger. */
|
|
1196
1203
|
function emitOtlpRecord(eventName, event, eventTime) {
|
|
1197
1204
|
if (!_otelLogger) return;
|
|
@@ -1583,7 +1590,7 @@ var Do11yBundle = (function(exports) {
|
|
|
1583
1590
|
return !!config.endpoint;
|
|
1584
1591
|
},
|
|
1585
1592
|
getQueueSize: () => getQueueLength(),
|
|
1586
|
-
version: "0.2.
|
|
1593
|
+
version: "0.2.2",
|
|
1587
1594
|
destroy: () => destroy()
|
|
1588
1595
|
};
|
|
1589
1596
|
//#endregion
|
package/dist/do11y.min.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
var Do11yBundle=(function(e){Object.defineProperty(e,Symbol.toStringTag,{value:`Module`});let t=`0.2.0`,n=`browser.do11y.referrer_category`,r=`browser.do11y.ai_platform`,i=`browser.do11y.scroll.threshold`,a=`browser.do11y.scroll.percent`,o=`browser.do11y.expand.summary`,s=`browser.do11y.expand.action`,c=`browser.do11y.expand.section`,l=`browser.do11y.scroll_depth`,u=`browser.do11y.search_opened`,d=`browser.do11y.expand_collapse`,f=[`searchSelector`,`copyButtonSelector`,`codeBlockSelector`,`navigationSelector`,`footerSelector`,`contentSelector`,`tabContainerSelector`,`tocSelector`,`feedbackSelector`];function p(){let e={};return{allow(t,n,r,a){let o=Date.now(),s=n[`browser.do11y.scroll.threshold`]!==null&&n[`browser.do11y.scroll.threshold`]!==void 0?`${t}:${String(n[i])}`:t;return r>0&&e[s]&&o-e[s]<r?(a&&console.log(`[Do11y] Rate limited:`,t),!1):(e[s]=o,!0)},reset(){for(let t of Object.keys(e))delete e[t]}}}let m={mintlify:{searchSelector:`#search-bar-entry, #search-bar-entry-mobile, [class*="search"]`,copyButtonSelector:`button[class*="copy"], button[aria-label*="copy" i]`,codeBlockSelector:`pre, [class*="code"]`,navigationSelector:`nav, [role="navigation"], #navbar, #sidebar, [class*="nav"], [class*="sidebar"]`,footerSelector:`footer, [role="contentinfo"], [class*="footer"]`,contentSelector:`main, article, [role="main"], [class*="content"]`,tabContainerSelector:`tabs, [role="tablist"], [class*="tab"]`,tocSelector:`#table-of-contents, [data-testid="table-of-contents"], [class*="table-of-contents"], [class*="toc"]`,feedbackSelector:`feedback-toolbar, #feedback-thumbs-up, #feedback-thumbs-down, [class*="feedback"], [class*="helpful"]`},docusaurus:{searchSelector:`.DocSearch, .DocSearch-Button`,copyButtonSelector:`button.clean-btn[aria-label*="copy" i], button[class*="copyButton"]`,codeBlockSelector:`pre, [class*="code"]`,navigationSelector:`nav, [role="navigation"], .navbar, .sidebar, [class*="nav"], [class*="sidebar"]`,footerSelector:`footer, [role="contentinfo"], [class*="footer"]`,contentSelector:`main, article, [role="main"], [class*="content"]`,tabContainerSelector:`.tabs[role="tablist"], [class*="tabs"]`,tocSelector:`.table-of-contents, [class*="toc"]`,feedbackSelector:`[class*="feedback"], [class*="helpful"]`},nextra:{searchSelector:`.nextra-search input, input[placeholder*="search" i], button[aria-label*="search" i]`,copyButtonSelector:`button[class*="copy"], button[aria-label*="copy" i], button[title*="copy" i]`,codeBlockSelector:`pre, [class*="code"]`,navigationSelector:`nav, [role="navigation"], [class*="nav"], [class*="sidebar"]`,footerSelector:`footer, [role="contentinfo"], [class*="footer"]`,contentSelector:`main, article, [role="main"], [class*="content"]`,tabContainerSelector:`[role="tablist"], [class*="tab"]`,tocSelector:`.nextra-toc, [class*="toc"]`,feedbackSelector:`[class*="feedback"], [class*="helpful"]`},"mkdocs-material":{searchSelector:`.md-search__input`,copyButtonSelector:`.md-clipboard, .md-code__button[title="Copy to clipboard"]`,codeBlockSelector:`pre, code, [class*="code"]`,navigationSelector:`nav, [role="navigation"], .md-nav, .md-sidebar`,footerSelector:`footer, [role="contentinfo"], .md-footer`,contentSelector:`main, article, [role="main"], .md-content`,tabContainerSelector:`.tabbed-labels, .md-typeset .tabbed-set`,tocSelector:`.md-sidebar--secondary .md-nav, [class*="toc"]`,feedbackSelector:`[class*="feedback"], [class*="helpful"]`},vitepress:{searchSelector:`.VPNavBarSearch button, .VPNavBarSearchButton, #local-search`,copyButtonSelector:`button.copy, .vp-code-copy, button.copy[title*="Copy"]`,codeBlockSelector:`div[class*="language-"], pre, [class*="code"]`,navigationSelector:`nav, [role="navigation"], .VPNav, .VPSidebar, [class*="nav"], [class*="sidebar"]`,footerSelector:`footer, [role="contentinfo"], .VPFooter, [class*="footer"]`,contentSelector:`main, article, [role="main"], .VPContent, [class*="content"]`,tabContainerSelector:`.vp-code-group .tabs, [role="tablist"]`,tocSelector:`.VPDocAsideOutline, .VPLocalNavOutlineDropdown, a.outline-link`,feedbackSelector:`[class*="feedback"], [class*="helpful"]`},starlight:{searchSelector:`site-search button[data-open-modal], sl-doc-search .DocSearch-Button, button[aria-label*="search" i]`,copyButtonSelector:`.expressive-code .copy button, .copy button[data-code]`,codeBlockSelector:`.expressive-code pre, pre`,navigationSelector:`nav, [role="navigation"], [class*="sidebar"]`,footerSelector:`footer, [role="contentinfo"], [class*="footer"]`,contentSelector:`main, .sl-markdown-content, [role="main"]`,tabContainerSelector:`starlight-tabs [role="tablist"], [role="tablist"]`,tocSelector:`.right-sidebar-panel, starlight-toc, mobile-starlight-toc`,feedbackSelector:`[class*="feedback"], [class*="helpful"]`},docsy:{searchSelector:`.td-search input, .td-search__input, #docsearch-0, #docsearch-1`,copyButtonSelector:`button[aria-label*="copy" i], button[title*="copy" i], .td-click-to-copy`,codeBlockSelector:`.highlight, pre.chroma, pre`,navigationSelector:`nav, [role="navigation"], .td-sidebar, .td-navbar, [class*="sidebar"]`,footerSelector:`footer, [role="contentinfo"], .td-footer, [class*="footer"]`,contentSelector:`main, article, [role="main"], .td-content, [class*="content"]`,tabContainerSelector:`.nav-tabs[role="tablist"], [role="tablist"], .tab-content`,tocSelector:`.td-toc, nav[id="TableOfContents"], [class*="toc"]`,feedbackSelector:`.feedback--answer, [class*="feedback"], [class*="helpful"]`}};function ee(e){let t=m[e.framework];t?f.forEach(n=>{e[n]||(e[n]=t[n])}):e.framework!==`custom`&&e.debug&&console.warn(`[Do11y] Unknown framework "${e.framework}". Falling back to generic selectors. Supported: `+Object.keys(m).join(`, `)+`, custom`);let n=m.mintlify;n&&f.forEach(t=>{e[t]||(e[t]=n[t])})}function h(e){if(!e||typeof e!=`string`)return null;try{return document.querySelector(e),e}catch{return null}}function te(e){if(e.respectDNT&&(navigator.doNotTrack===`1`||navigator.doNotTrack===`yes`||window.doNotTrack===`1`))return e.debug&&console.log(`[Do11y] Disabled: Do Not Track is enabled`),!0;if(e.allowedDomains&&e.allowedDomains.length>0){let t=window.location.hostname;if(!e.allowedDomains.some(e=>t===e||t.endsWith(`.`+e)))return e.debug&&console.log(`[Do11y] Disabled: Domain not allowed:`,t),!0}return!1}function g(e){if(typeof e.className==`string`)return e.className;let t=e.className;return t&&typeof t.baseVal==`string`?t.baseVal:``}function _(e){let t=e.match(/(?:^|\s)language-([\w-]+)(?:\s|$)/);return t?t[1]:null}function ne(e){if(!e)return`unknown`;let t=e;for(let e=0;t&&e<12;e++,t=t.parentElement){for(let e of[`language`,`data-language`,`data-lang`,`data-code-lang`]){let n=t.getAttribute(e);if(n)return n}let e=_(g(t));if(e)return e;let n=t.querySelector(`:scope > span.lang`)?.textContent?.trim();if(n)return n;let r=t.querySelector(`[data-language], [data-lang], [data-code-lang], [class*="language-"], [language]`);if(r){let e=r.getAttribute(`language`)??r.getAttribute(`data-language`)??r.getAttribute(`data-lang`)??r.getAttribute(`data-code-lang`)??_(g(r));if(e)return e}}return`unknown`}function re(e){if(e.startsWith(`#`))return e;let t=e.indexOf(`#`);if(t===-1)return null;let n=e.slice(0,t);return!n||n===window.location.pathname||n===`${window.location.pathname}${window.location.search}`?e.slice(t):null}function ie(e,t){let n=h(t.tocSelector);if(n){let t=e.closest(n);if(t&&t!==e&&t.tagName!==`A`)return t}for(let t of[`.VPDocAsideOutline`,`.VPLocalNavOutlineDropdown`,`.table-of-contents`,`.right-sidebar-panel`,`starlight-toc`,`[class*="TableOfContents"]`,`[class*="page-outline"]`,`[class*="toc"]`,`nav[id="TableOfContents"]`]){let n=e.closest(t);if(n&&n!==e&&n.tagName!==`A`)return n}return e.parentElement&&e.parentElement!==document.body?e.parentElement:null}function v(e){let t=e;for(;t&&t!==document.body;){let e=t.previousElementSibling;for(;e;){if(/^H[1-6]$/.test(e.tagName))return e.textContent?.trim().substring(0,100)??null;let t=e.querySelectorAll(`h1, h2, h3, h4, h5, h6`);if(t.length>0)return t[t.length-1].textContent?.trim().substring(0,100)??null;e=e.previousElementSibling}t=t.parentElement}return null}function y(e,t){if(!e||typeof e!=`string`)return null;let n=t??100,r=e;return r=r.replace(/[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}/g,`[email]`),r=r.replace(/\b\d{3}[-.]?\d{3}[-.]?\d{4}\b/g,`[phone]`),r=r.replace(/\b\d{3}-\d{2}-\d{4}\b/g,`[redacted]`),r=r.replace(/\b(?:\d[ -]?){13,19}\b/g,`[card]`),r=r.replace(/eyJ[A-Za-z0-9_-]+\.eyJ[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+/g,`[token]`),r=r.replace(/\bxa[a-z]{2}-[A-Za-z0-9_-]{20,}/g,`[token]`),r=r.replace(/\b[0-9a-fA-F]{32,}\b/g,`[redacted]`),r.trim().substring(0,n)}function ae(){let e=window.innerWidth;return e<640?`mobile`:e<1024?`tablet`:e<1440?`desktop`:`large-desktop`}function oe(){let e=navigator.userAgent;return e.includes(`Firefox`)?`Firefox`:e.includes(`Edg`)?`Edge`:e.includes(`Chrome`)?`Chrome`:e.includes(`Safari`)?`Safari`:`Other`}function se(){let e=navigator.userAgent;return/Mobile|Android|iPhone|iPad/.test(e)?/iPad|Tablet/.test(e)?`tablet`:`mobile`:`desktop`}function ce(){return{"browser.do11y.viewport_category":ae(),"browser.family":oe(),"device.type":se(),"browser.language":(navigator.language||``).split(`-`)[0]||`unknown`,"browser.do11y.timezone_offset":new Date().getTimezoneOffset()/60}}let le=[{match:`chatgpt`,platform:`ChatGPT`},{match:`chat.com`,platform:`ChatGPT`},{match:`openai`,platform:`ChatGPT`},{match:`perplexity`,platform:`Perplexity`},{match:`claude.ai`,platform:`Claude`},{match:`anthropic`,platform:`Claude`},{match:`gemini`,platform:`Gemini`},{match:`copilot`,platform:`Copilot`},{match:`deepseek`,platform:`DeepSeek`},{match:`meta.ai`,platform:`Meta AI`},{match:`grok`,platform:`Grok`},{match:`x.ai`,platform:`Grok`},{match:`mistral`,platform:`Mistral`},{match:`you.com`,platform:`You.com`},{match:`phind`,platform:`Phind`}];function ue(e){if(!e||e===`direct`)return{referrerCategory:`direct`,aiPlatform:null};if(e===`internal`)return{referrerCategory:`internal`,aiPlatform:null};if(e===`unknown`)return{referrerCategory:`unknown`,aiPlatform:null};let t=e.toLowerCase();for(let e of le)if(t.indexOf(e.match)!==-1)return{referrerCategory:`ai`,aiPlatform:e.platform};return/google\.|bing\.|baidu\.|yandex\.|duckduckgo\.|yahoo\./.test(t)?{referrerCategory:`search-engine`,aiPlatform:null}:/github\.|gitlab\.|bitbucket\./.test(t)?{referrerCategory:`code-host`,aiPlatform:null}:/stackoverflow\.|stackexchange\.|reddit\.|news\.ycombinator\./.test(t)?{referrerCategory:`community`,aiPlatform:null}:/twitter\.|x\.com|linkedin\.|facebook\.|threads\.net/.test(t)?{referrerCategory:`social`,aiPlatform:null}:{referrerCategory:`other`,aiPlatform:null}}function de(){try{if(!document.referrer)return`direct`;let e=new URL(document.referrer);return e.hostname===window.location.hostname?`internal`:e.hostname}catch{return`unknown`}}function fe(){return{"url.path":window.location.pathname,"url.fragment":window.location.hash||null,"browser.do11y.url.has_params":window.location.search?`has_params`:null,"browser.do11y.page_title":y(document.title,150)}}function pe(){if(window.crypto&&typeof window.crypto.randomUUID==`function`)return window.crypto.randomUUID();if(window.crypto&&typeof window.crypto.getRandomValues==`function`){let e=new Uint8Array(16);window.crypto.getRandomValues(e),e[6]=e[6]&15|64,e[8]=e[8]&63|128;let t=Array.from(e,e=>e.toString(16).padStart(2,`0`)).join(``);return t.slice(0,8)+`-`+t.slice(8,12)+`-`+t.slice(12,16)+`-`+t.slice(16,20)+`-`+t.slice(20)}return`no-crypto-00-0000-0000-000000000000`}function me(e){if(!e||typeof e!=`object`)return!1;let t=e;return typeof t.id==`string`&&t.id.length>0&&typeof t.startTime==`string`&&Array.isArray(t.pageSequence)&&typeof t.pageCount==`number`}function b(){let e=null;try{let t=sessionStorage.getItem(`do11y_session`);if(t){let n=JSON.parse(t);me(n)&&(e=n)}}catch{}return e||(e={id:pe(),startTime:new Date().toISOString(),pageSequence:[],pageCount:0,referrerCategory:null,aiPlatform:null},x(e)),e}function x(e){try{sessionStorage.setItem(`do11y_session`,JSON.stringify(e))}catch{}}function he(e){let t=b();return t.pageCount++,t.pageSequence.push({path:e,timestamp:new Date().toISOString(),index:t.pageCount}),t.pageSequence.length>50&&(t.pageSequence=t.pageSequence.slice(-50)),x(t),t}let S=new Set,C=null;function ge(e){let t=e;for(;t&&t!==document.body&&t!==document.documentElement;){let e=window.getComputedStyle(t).overflowY;if((e===`auto`||e===`scroll`)&&t.scrollHeight>t.clientHeight)return t;t=t.parentElement}return null}function w(e,t){let n,r,o;C&&C.scrollHeight>C.clientHeight?(n=C.scrollTop,r=C.scrollHeight,o=C.clientHeight):(n=window.scrollY||document.documentElement.scrollTop,r=document.documentElement.scrollHeight,o=window.innerHeight);let s=r-o;if(s<=0){e.scrollThresholds.forEach(e=>{S.has(e)||(S.add(e),t(l,{[i]:e,[a]:100}))});return}let c=Math.round(n/s*100);e.scrollThresholds.forEach(e=>{c>=e&&!S.has(e)&&(S.add(e),t(l,{[i]:e,[a]:c}))})}function _e(e,t){if(!e.trackScrollDepth)return;if(e.contentSelector){let t=document.querySelector(e.contentSelector);t&&(C=ge(t))}let n=!1;function r(){n||=(window.requestAnimationFrame(()=>{w(e,t),n=!1}),!0)}if(window.addEventListener(`scroll`,r),C&&(C.addEventListener(`scroll`,r),e.debug)){let e=C;console.log(`[do11y] Using container-based scroll tracking:`,e.className||e.tagName)}w(e,t)}function ve(){S=new Set}function ye(){return S}function T(e,t,n){e(`browser.do11y.section_visible`,{"browser.do11y.section.heading":y(t.textContent?.trim()??``,100),"browser.do11y.section.heading_level":parseInt(t.tagName.charAt(1),10),"browser.do11y.section.visible_seconds":Math.round(n/1e3)})}let E=null,D={};function be(e,t){if(!e.trackSectionVisibility||typeof IntersectionObserver>`u`)return;let n=e.sectionVisibleThreshold*1e3;E=new IntersectionObserver(e=>{e.forEach(e=>{let r=e.target.getAttribute(`data-do11y-section-id`);if(r)if(e.isIntersecting){if(!D[r]){let i={start:Date.now(),reported:!1,timeoutId:null};i.timeoutId=setTimeout(()=>{D[r]&&!D[r].reported&&(T(t,e.target,n),D[r].reported=!0)},n),D[r]=i}}else{if(D[r]&&(D[r].timeoutId&&clearTimeout(D[r].timeoutId),!D[r].reported)){let i=Date.now()-D[r].start;i>=n&&(T(t,e.target,i),D[r].reported=!0)}delete D[r]}})},{threshold:.5}),O()}function O(){E&&document.querySelectorAll(`h2, h3`).forEach((e,t)=>{e.setAttribute(`data-do11y-section-id`,`section-`+t),E.observe(e)})}function xe(e,t){if(!E)return;let n=Date.now(),r=e.sectionVisibleThreshold*1e3;Object.keys(D).forEach(e=>{let i=D[e];if(i&&!i.reported){i.timeoutId&&clearTimeout(i.timeoutId);let a=n-i.start;if(a>=r){let n=typeof CSS<`u`&&typeof CSS.escape==`function`?CSS.escape(e):e.replace(/[!"#$%&'()*+,./:;<=>?@[\\\]^`{|}~ ]/g,`\\$&`),r=document.querySelector(`[data-do11y-section-id="`+n+`"]`);r&&T(t,r,a)}}}),D={}}function Se(){E&&=(D&&Object.keys(D).length>0&&(Object.keys(D).forEach(e=>{let t=D[e];t&&!t.reported&&t.timeoutId&&clearTimeout(t.timeoutId)}),D={}),E.disconnect(),null)}let k=Date.now(),A=Date.now(),j=0,M=!0,N=!1;function P(e,t,i){if(N)return;N=!0,M&&(j+=Date.now()-A);let a=Date.now()-k,o=a>0?j/a:0,s=0;ye().forEach(e=>{e>s&&(s=e)}),xe(e,t);let c=b();t(`browser.do11y.page_exit`,{"browser.do11y.page_exit.total_time_seconds":Math.round(a/1e3),"browser.do11y.page_exit.active_time_seconds":Math.round(j/1e3),"browser.do11y.page_exit.engagement_ratio":Math.round(o*100)/100,"browser.do11y.page_exit.max_scroll_depth":s,[n]:c.referrerCategory,[r]:c.aiPlatform}),i?.()}function Ce(e,t){document.addEventListener(`visibilitychange`,()=>{document.hidden?M&&=(j+=Date.now()-A,!1):(A=Date.now(),M=!0)}),window.addEventListener(`beforeunload`,()=>{P(e,t)})}function we(){k=Date.now(),A=Date.now(),j=0,M=!0,N=!1}function Te(){N=!1}function F(e,t){Te();let i=he(window.location.pathname),a=de(),o=ue(a);i.pageCount===1&&(i.referrerCategory=o.referrerCategory,i.aiPlatform=o.aiPlatform,x(i)),t(`browser.do11y.page_view`,{"browser.do11y.referrer_domain":a,[n]:o.referrerCategory,[r]:o.aiPlatform,"browser.do11y.is_first_page":i.pageCount===1,"browser.do11y.previous_path":i.pageSequence.length>1?i.pageSequence[i.pageSequence.length-2].path:null})}function Ee(e,t){return e.closest(t.navigationSelector)?`navigation`:e.closest(t.footerSelector)?`footer`:e.closest(t.contentSelector)?`content`:`other`}function De(){try{let e=new Map;document.querySelectorAll(`a[href]`).forEach(t=>{let n=t.getAttribute(`href`)??``,r=e.get(n)??[];r.push(t),e.set(n,r)}),e.forEach(e=>{e.forEach((e,t)=>{e.setAttribute(`data-do11y-link-idx`,String(t+1))})})}catch{}}function Oe(e,t){De(),document.addEventListener(`click`,n=>{let r=n.target.closest(`a`);if(!r)return;let i=r.getAttribute(`href`);if(!i)return;let a=`other`,o=null;try{if(i.startsWith(`#`))a=`anchor`;else if(i.startsWith(`/`)||i.startsWith(`./`)||i.startsWith(`../`))a=`internal`;else if(i.startsWith(`http`)){let e=new URL(i);e.hostname===window.location.hostname?a=`internal`:(a=`external`,o=e.hostname)}else i.startsWith(`mailto:`)&&(a=`email`)}catch{}if(a===`internal`&&!e.trackInternalLinks||a===`external`&&!e.trackOutboundLinks)return;let s=parseInt(r.getAttribute(`data-do11y-link-idx`)??`1`,10);t(`browser.do11y.link_click`,{"browser.do11y.link.type":a,"browser.do11y.link.target_url":i,"browser.do11y.link.target_domain":o,"browser.do11y.link.text":y(r.textContent,100),"browser.do11y.link.context":Ee(r,e),"browser.do11y.link.section":y(v(r),100),"browser.do11y.link.index":s})},!0)}function ke(e,t){e.trackSearch&&(document.addEventListener(`click`,n=>{n.target.closest(e.searchSelector)&&t(u,{})},!0),document.addEventListener(`keydown`,n=>{if((n.metaKey||n.ctrlKey)&&n.key===`k`){if(!document.querySelector(e.searchSelector))return;t(u,{"browser.do11y.search.trigger":`keyboard`})}}))}function Ae(e){try{document.querySelectorAll(e.codeBlockSelector).forEach((e,t)=>{e.setAttribute(`data-do11y-code-idx`,String(t+1))})}catch{}}function je(e,t){e.trackCopy&&(Ae(e),document.addEventListener(`click`,n=>{let r=n.target.closest(e.copyButtonSelector);if(r){let n=r.closest(`[class*="language-"], [language]`)??r.closest(e.codeBlockSelector)??r.closest(`.expressive-code`)?.querySelector(`pre`)??r.closest(`div, section`)?.querySelector(`pre`)??r.parentElement?.querySelector(`pre`)??null,i=ne((n?n.tagName===`PRE`?n.querySelector(`code`):n.querySelector(`code[class*="language-"], code[language]`)??n.querySelector(`code`):null)??n??r),a=parseInt(n?.getAttribute(`data-do11y-code-idx`)??`1`,10);t(`browser.do11y.code_copied`,{"browser.do11y.code.language":i,"browser.do11y.code.section":y(v(n??r),100),"browser.do11y.code.index":a})}},!0))}function Me(e,t){e.trackTabSwitches&&document.addEventListener(`click`,n=>{let r=`[role="tab"], .tabs button, .tabs a, .tabbed-labels label`,i=h(e.tabContainerSelector);i&&(r+=`, `+i+` button, `+i+` a, `+i+` label`);let a=n.target.closest(r);if(!a||a.getAttribute(`aria-selected`)===`true`||a.classList.contains(`active`)||a.classList.contains(`is-active`))return;let o=y(a.textContent,50);if(!o)return;let s=y(v(a),100);t(`browser.do11y.tab_switch`,{"browser.do11y.tab.label":o,"browser.do11y.tab.group":s,"browser.do11y.tab.is_default":!1})})}function Ne(e,t){e.trackTocClicks&&document.addEventListener(`click`,n=>{let r=n.target.closest(`a`);if(!r)return;let i=ie(r,e);if(!i)return;let a=r.getAttribute(`href`),o=a?re(a):null;if(!o)return;let s=y(r.textContent,100),c=null;try{let e=o.slice(1),t=document.getElementById(e);t&&/^H[1-6]$/.test(t.tagName)&&(c=parseInt(t.tagName.charAt(1),10))}catch{}let l=i.querySelectorAll(`a[href*="#"]`),u=1;for(let e=0;e<l.length;e++)if(l[e]===r){u=e+1;break}t(`browser.do11y.toc_click`,{"browser.do11y.toc.heading":s,"browser.do11y.toc.heading_level":c,"browser.do11y.toc.position":u})},!0)}function Pe(e,t){e.trackFeedback&&document.addEventListener(`click`,n=>{let r=n.target.closest(`button, [role="button"], a`);if(!r||!r.closest(h(e.feedbackSelector)??`[class*="feedback"], [class*="helpful"], [class*="rating"], [class*="was-this"], [data-feedback]`))return;let i=(r.textContent??``).trim().toLowerCase(),a=(r.getAttribute(`aria-label`)??``).toLowerCase(),o=(r.getAttribute(`title`)??``).toLowerCase(),s=r.getAttribute(`data-value`)??r.getAttribute(`data-md-value`)??r.getAttribute(`data-feedback`),c=s&&/^[\w\s.,!?-]{1,50}$/.test(s)?s:null,l=null;c?l=c:/\byes\b|👍|thumbs.?up|helpful/i.test(i+` `+a+` `+o)?l=`yes`:/\bno\b|👎|thumbs.?down|not.?helpful/i.test(i+` `+a+` `+o)&&(l=`no`),l&&t(`browser.do11y.feedback`,{"browser.do11y.feedback.rating":l})})}function Fe(e,t){e.trackExpandCollapse&&(document.addEventListener(`toggle`,e=>{let n=e.target;if(n.tagName!==`DETAILS`)return;let r=n.querySelector(`summary`),i=y(r?r.textContent:``,100);t(d,{[o]:i,[s]:n.open?`expand`:`collapse`,[c]:y(v(n),100)})},!0),document.addEventListener(`click`,e=>{let n=e.target.closest(`[aria-expanded], [class*="accordion"] button, [class*="collapsible"] button`);if(!n||n.closest(`details`)||n.closest(`nav, [role="navigation"], header`))return;let r=n.getAttribute(`aria-expanded`)===`true`;t(d,{[o]:y(n.textContent,100),[s]:r?`collapse`:`expand`,[c]:y(v(n),100)})}))}let I=[],L=null,Ie=p(),R=!1,z=null,B=[],V=null,H=!1;function U(e){R=e}function W(){return R}function Le(){return I.length}function Re(e,n,r){if(R||!Ie.allow(n,r,e.rateLimitMs,e.debug))return;let i=b(),a=new Date,o={_time:a.toISOString(),eventName:n,"browser.do11y.version":t,"session.id":i.id,"browser.do11y.session_page_count":i.pageCount,...fe(),...ce(),...r};if(e.debug&&console.log(`[Do11y] Event queued:`,n,o),e.destination===`otlp`){if(z){q(n,o,a);return}if(H){e.debug&&console.warn(`[Do11y] OTel SDK unavailable; dropping event:`,n);return}B.push(o),B.length>500&&(B=B.slice(-500),console.warn(`[Do11y] OTLP pending buffer capped at 500 events — oldest events dropped`)),Ue(e);return}I.push(o),I.length>500&&(I=I.slice(-500),console.warn(`[Do11y] Event queue capped at 500 events — oldest events dropped`)),I.length>=e.maxBatchSize?Y(e):ze(e)}function ze(e){L||=setTimeout(()=>Y(e),e.flushInterval)}function Be(e){try{let t=new URL(e);return!(t.protocol!==`https:`||!t.hostname.endsWith(`.supabase.co`))}catch{return!1}}function Ve(e,t=!1){try{let n=new URL(e),r=n.hostname,i=r===`localhost`||r===`127.0.0.1`||r===`::1`||/^(10\.|172\.(1[6-9]|2\d|3[01])\.|192\.168\.)/.test(r);return t&&i&&n.protocol===`http:`?!0:!(n.protocol!==`https:`||i)}catch{return!1}}function G(e){return e.destination===`supabase`?e.supabaseUrl?Be(e.supabaseUrl)?!e.supabaseKey||typeof e.supabaseKey!=`string`||e.supabaseKey.length<10?(e.debug&&console.warn(`[Do11y] Invalid or missing Supabase publishable key`),!1):/^[a-zA-Z0-9_-]+$/.test(e.supabaseTable)?!0:(e.debug&&console.warn(`[Do11y] Invalid table name`),!1):(e.debug&&console.warn(`[Do11y] Invalid Supabase URL. Must be https://<project>.supabase.co`),!1):(e.debug&&console.warn(`[Do11y] No Supabase URL configured`),!1):e.destination===`http`?e.endpoint?Ve(e.endpoint,e.debug)?!0:(e.debug&&console.warn(`[Do11y] Invalid HTTP endpoint. Must be HTTPS and not a private address.`),!1):(e.debug&&console.warn(`[Do11y] No HTTP endpoint configured`),!1):e.destination===`otlp`?e.otelSdkEndpoint?!0:(e.debug&&console.warn(`[Do11y] No OTLP endpoint configured`),!1):(e.debug&&console.warn(`[Do11y] Unknown destination:`,e.destination),!1)}let K=`0.221.0`;function q(e,t,n){if(!z)return;let r={...t};delete r._time,delete r.eventName,z.emit({eventName:e,severityNumber:9,timestamp:n.getTime(),attributes:r,body:``})}function He(){if(!z||B.length===0)return;let e=B;B=[];for(let t of e)q(t.eventName,t,new Date(t._time))}function Ue(e){z||V||H||(V=We(e).catch(e=>{H=!0,B=[],console.warn(`[Do11y] OTel SDK initialization failed; buffered events dropped:`,e)}).finally(()=>{V=null}))}async function We(e){if(z)return;let n=`https://esm.sh/`,r=async e=>import(e),i=await r(`${n}@opentelemetry/api-logs@${K}`),a=await r(`${n}@opentelemetry/sdk-logs@${K}`),o=await r(`${n}@opentelemetry/exporter-logs-otlp-http@${K}`),s={"service.name":e.otelSdkServiceName||`do11y`,"service.version":t,"telemetry.sdk.name":`do11y`,"telemetry.sdk.language":`webjs`,"telemetry.sdk.version":t,...e.otelSdkResourceAttributes},c=new a.LoggerProvider({resource:{attributes:s},processors:[new a.BatchLogRecordProcessor({exporter:new o.OTLPLogExporter({url:e.otelSdkEndpoint.replace(/\/$/,``)+`/v1/logs`,headers:e.otelSdkHeaders})})]});i.logs.setGlobalLoggerProvider(c),z=c.getLogger(`do11y`),He(),e.debug&&console.log(`[Do11y] OTel SDK initialized with endpoint:`,e.otelSdkEndpoint)}function J(e,t){if(t.destination===`supabase`){let n=t.supabaseUrl.replace(/\/$/,``)+`/rest/v1/`+t.supabaseTable,r=t.bodyTransform??(e=>e.map(e=>({payload:e})));return{url:n,headers:{apikey:t.supabaseKey,Authorization:`Bearer `+t.supabaseKey,"Content-Type":`application/json`,Prefer:`return=minimal`},body:JSON.stringify(r(e))}}let n=t.bodyTransform??(e=>e);return{url:t.endpoint,headers:{"Content-Type":`application/json`,...t.headers},body:JSON.stringify(n(e))}}function Ge(e){try{return new URL(e).origin!==window.location.origin}catch{return!1}}function Ke(e,t,n,r){let i=Ge(e.url);r.debug&&i&&console.log(`[Do11y] Cross-origin request to`,new URL(e.url).origin,`- requires CORS headers on the server`),fetch(e.url,{method:`POST`,headers:e.headers,body:e.body,keepalive:!0,mode:i?`cors`:`same-origin`}).then(e=>{if(e.ok){r.debug&&console.log(`[Do11y] Flushed`,t.length,`events`);return}if(n>0&&(e.status>=500||e.status===429)){r.debug&&console.log(`[Do11y] Retrying after error:`,e.status),I=t.concat(I),setTimeout(()=>Y(r,n-1),r.retryDelay*(r.maxRetries-n+1));return}r.debug&&e.text().then(t=>{let n=`[Do11y] Ingest failed: ${e.status}`;e.status===0&&e.type===`opaque`?console.error(n,`- CORS error: server did not return Access-Control-Allow-Origin`):console.error(n,t)}).catch(()=>{})}).catch(e=>{if(n>0){if(r.debug){let t=i?` (this may be a CORS issue — try using an OTel Collector proxy)`:``;console.log(`[Do11y] Network error, retrying:`,e.message+t)}I=t.concat(I),setTimeout(()=>Y(r,n-1),r.retryDelay*(r.maxRetries-n+1))}else r.debug&&console.error(`[Do11y] Failed to send events:`,e.message)})}function Y(e,t){if(L&&=(clearTimeout(L),null),e.destination===`otlp`){I.length>0&&(e.debug&&console.warn(`[Do11y] Dropping `+I.length+` queued events (OTLP mode has no HTTP transport)`),I=[]);return}if(I.length===0||!G(e))return;let n=typeof t==`number`?t:e.maxRetries,r=I.slice();I=[],Ke(J(r,e),r,n,e)}function qe(e){if(e.destination===`otlp`||I.length===0||!G(e))return;let t=I;I=[];let n=J(t,e);try{fetch(n.url,{method:`POST`,headers:n.headers,body:n.body,keepalive:!0})}catch{}e.debug&&console.log(`[Do11y] Sync flushed`,t.length,`events`)}function Je(){L&&=(clearTimeout(L),null)}let X={destination:`supabase`,supabaseUrl:``,supabaseKey:``,supabaseTable:`do11y_events`,endpoint:``,headers:{},bodyTransform:void 0,otelSdkEndpoint:``,otelSdkHeaders:{},otelSdkServiceName:`do11y`,otelSdkResourceAttributes:{},debug:!1,flushInterval:5e3,maxBatchSize:10,trackOutboundLinks:!0,trackInternalLinks:!0,trackScrollDepth:!0,scrollThresholds:[25,50,75,90],allowedDomains:null,respectDNT:!0,maxRetries:2,retryDelay:1e3,rateLimitMs:100,framework:`mintlify`,trackSectionVisibility:!0,sectionVisibleThreshold:3,trackSearch:!0,trackCopy:!0,trackTabSwitches:!0,trackTocClicks:!0,trackExpandCollapse:!0,trackFeedback:!0,tabContainerSelector:null,tocSelector:null,feedbackSelector:null,searchSelector:null,copyButtonSelector:null,codeBlockSelector:null,navigationSelector:null,footerSelector:null,contentSelector:null,trackSpaPathChanges:!1,sessionAttributes:!0},Ye=!!window.__do11yInitialized;window.__do11yInitialized=!0;let Xe=window.self!==window.top;Xe&&!Ye&&(window.__do11yInitialized=!1);let Z=null,Q=null;function Ze(){let e=X,t=window.Do11yConfig;if(t&&typeof t==`object`){for(let n in X)if(Object.prototype.hasOwnProperty.call(t,n)){let r=t[n];r!==void 0&&(e[n]=r)}}let n=document.querySelector(`meta[name="do11y-destination"]`);if(n){let e=n.getAttribute(`content`);(e===`supabase`||e===`http`||e===`otlp`)&&(X.destination=e)}let r=document.querySelector(`meta[name="do11y-url"]`);r&&(X.supabaseUrl=r.getAttribute(`content`)??X.supabaseUrl);let i=document.querySelector(`meta[name="do11y-key"]`);i&&(X.supabaseKey=i.getAttribute(`content`)??X.supabaseKey);let a=document.querySelector(`meta[name="do11y-table"]`);a&&(X.supabaseTable=a.getAttribute(`content`)??X.supabaseTable);let o=document.querySelector(`meta[name="do11y-endpoint"]`);o&&(X.endpoint=o.getAttribute(`content`)??X.endpoint);let s=document.querySelector(`meta[name="do11y-otlp-endpoint"]`);s&&(X.otelSdkEndpoint=s.getAttribute(`content`)??X.otelSdkEndpoint);let c=document.querySelector(`meta[name="do11y-otlp-headers"]`);if(c)try{let e=JSON.parse(c.getAttribute(`content`)??`{}`);typeof e==`object`&&e&&(X.otelSdkHeaders=e)}catch{}let l=document.querySelector(`meta[name="do11y-debug"]`);l&&l.getAttribute(`content`)===`true`&&(X.debug=!0);let u=document.querySelector(`meta[name="do11y-domains"]`);if(u){let e=u.getAttribute(`content`);e&&(X.allowedDomains=e.split(`,`).map(e=>e.trim()))}let d=document.querySelector(`meta[name="do11y-framework"]`);if(d){let e=d.getAttribute(`content`);e&&[`mintlify`,`docusaurus`,`nextra`,`mkdocs-material`,`vitepress`,`starlight`,`docsy`,`custom`].includes(e)?X.framework=e:e&&X.debug&&console.warn(`[Do11y] Unknown framework in meta tag: "`+e+`". Using default: `+X.framework)}if(ee(X),X.debug&&console.log(`[Do11y] Initializing with config:`,{destination:X.destination,framework:X.framework,allowedDomains:X.allowedDomains,respectDNT:X.respectDNT}),te(X)){U(!0),X.debug&&console.log(`[Do11y] Tracking disabled`);return}(X.destination===`supabase`?X.supabaseKey:X.destination===`otlp`?X.otelSdkEndpoint:X.endpoint)||(console.warn(`[Do11y] No destination configured. Events will not be sent.`),X.destination===`supabase`?console.warn(`[Do11y] Add <meta name="do11y-url"> and <meta name="do11y-key"> to enable.`):X.destination===`otlp`?console.warn(`[Do11y] Add <meta name="do11y-otlp-endpoint"> to enable.`):console.warn(`[Do11y] Add <meta name="do11y-endpoint"> to enable.`));let f=(e,t)=>{Re(X,e,t)};F(X,f),Oe(X,f),_e(X,f),Ce(X,f),ke(X,f),je(X,f),be(X,f),Me(X,f),Ne(X,f),Pe(X,f),Fe(X,f);let p=window.location.pathname,m=()=>{window.location.pathname!==p&&(p=window.location.pathname,P(X,f,()=>Y(X)),ve(),we(),F(X,f),O(),w(X,f))};Z=new MutationObserver(m),Z.observe(document.body,{childList:!0,subtree:!0}),window.addEventListener(`popstate`,m),Q=window.setInterval(m,200),Object.freeze(X),window.addEventListener(`beforeunload`,()=>{Q!==null&&(clearInterval(Q),Q=null),qe(X),Je()}),document.addEventListener(`visibilitychange`,()=>{document.hidden&&Q!==null?(clearInterval(Q),Q=null):!document.hidden&&Q===null&&X.trackSpaPathChanges&&(Q=window.setInterval(m,200))}),X.debug&&console.log(`[Do11y] Initialized successfully`)}function $(){Z&&=(Z.disconnect(),null),Q!==null&&(clearInterval(Q),Q=null),Se(),qe(X),Je(),U(!0),window.__do11yInitialized=!1}return!Ye&&!Xe&&(document.readyState===`loading`?document.addEventListener(`DOMContentLoaded`,Ze):Ze()),window.Do11y=window.Do11y??{getConfig:()=>({destination:X.destination,hasCredentials:X.destination===`supabase`?!!X.supabaseKey:X.destination===`otlp`?!!X.otelSdkEndpoint:!!X.endpoint,isDisabled:W(),allowedDomains:X.allowedDomains,respectDNT:X.respectDNT}),flush:()=>Y(X),isEnabled:()=>W()?!1:X.destination===`supabase`?!!X.supabaseKey:X.destination===`otlp`?!!X.otelSdkEndpoint:!!X.endpoint,getQueueSize:()=>Le(),version:`0.2.0`,destroy:()=>$()},e.destroy=$,e})({});
|
|
1
|
+
var Do11yBundle=(function(e){Object.defineProperty(e,Symbol.toStringTag,{value:`Module`});let t=`0.2.2`,n=`browser.do11y.referrer_category`,r=`browser.do11y.ai_platform`,i=`browser.do11y.scroll.threshold`,a=`browser.do11y.scroll.percent`,o=`browser.do11y.expand.summary`,s=`browser.do11y.expand.action`,c=`browser.do11y.expand.section`,l=`browser.do11y.scroll_depth`,u=`browser.do11y.search_opened`,d=`browser.do11y.expand_collapse`,f=[`searchSelector`,`copyButtonSelector`,`codeBlockSelector`,`navigationSelector`,`footerSelector`,`contentSelector`,`tabContainerSelector`,`tocSelector`,`feedbackSelector`];function p(){let e={};return{allow(t,n,r,a){let o=Date.now(),s=n[`browser.do11y.scroll.threshold`]!==null&&n[`browser.do11y.scroll.threshold`]!==void 0?`${t}:${String(n[i])}`:t;return r>0&&e[s]&&o-e[s]<r?(a&&console.log(`[Do11y] Rate limited:`,t),!1):(e[s]=o,!0)},reset(){for(let t of Object.keys(e))delete e[t]}}}let m={mintlify:{searchSelector:`#search-bar-entry, #search-bar-entry-mobile, [class*="search"]`,copyButtonSelector:`button[class*="copy"], button[aria-label*="copy" i]`,codeBlockSelector:`pre, [class*="code"]`,navigationSelector:`nav, [role="navigation"], #navbar, #sidebar, [class*="nav"], [class*="sidebar"]`,footerSelector:`footer, [role="contentinfo"], [class*="footer"]`,contentSelector:`main, article, [role="main"], [class*="content"]`,tabContainerSelector:`tabs, [role="tablist"], [class*="tab"]`,tocSelector:`#table-of-contents, [data-testid="table-of-contents"], [class*="table-of-contents"], [class*="toc"]`,feedbackSelector:`feedback-toolbar, #feedback-thumbs-up, #feedback-thumbs-down, [class*="feedback"], [class*="helpful"]`},docusaurus:{searchSelector:`.DocSearch, .DocSearch-Button`,copyButtonSelector:`button.clean-btn[aria-label*="copy" i], button[class*="copyButton"]`,codeBlockSelector:`pre, [class*="code"]`,navigationSelector:`nav, [role="navigation"], .navbar, .sidebar, [class*="nav"], [class*="sidebar"]`,footerSelector:`footer, [role="contentinfo"], [class*="footer"]`,contentSelector:`main, article, [role="main"], [class*="content"]`,tabContainerSelector:`.tabs[role="tablist"], [class*="tabs"]`,tocSelector:`.table-of-contents, [class*="toc"]`,feedbackSelector:`[class*="feedback"], [class*="helpful"]`},nextra:{searchSelector:`.nextra-search input, input[placeholder*="search" i], button[aria-label*="search" i]`,copyButtonSelector:`button[class*="copy"], button[aria-label*="copy" i], button[title*="copy" i]`,codeBlockSelector:`pre, [class*="code"]`,navigationSelector:`nav, [role="navigation"], [class*="nav"], [class*="sidebar"]`,footerSelector:`footer, [role="contentinfo"], [class*="footer"]`,contentSelector:`main, article, [role="main"], [class*="content"]`,tabContainerSelector:`[role="tablist"], [class*="tab"]`,tocSelector:`.nextra-toc, [class*="toc"]`,feedbackSelector:`[class*="feedback"], [class*="helpful"]`},"mkdocs-material":{searchSelector:`.md-search__input`,copyButtonSelector:`.md-clipboard, .md-code__button[title="Copy to clipboard"]`,codeBlockSelector:`pre, code, [class*="code"]`,navigationSelector:`nav, [role="navigation"], .md-nav, .md-sidebar`,footerSelector:`footer, [role="contentinfo"], .md-footer`,contentSelector:`main, article, [role="main"], .md-content`,tabContainerSelector:`.tabbed-labels, .md-typeset .tabbed-set`,tocSelector:`.md-sidebar--secondary .md-nav, [class*="toc"]`,feedbackSelector:`[class*="feedback"], [class*="helpful"]`},vitepress:{searchSelector:`.VPNavBarSearch button, .VPNavBarSearchButton, #local-search`,copyButtonSelector:`button.copy, .vp-code-copy, button.copy[title*="Copy"]`,codeBlockSelector:`div[class*="language-"], pre, [class*="code"]`,navigationSelector:`nav, [role="navigation"], .VPNav, .VPSidebar, [class*="nav"], [class*="sidebar"]`,footerSelector:`footer, [role="contentinfo"], .VPFooter, [class*="footer"]`,contentSelector:`main, article, [role="main"], .VPContent, [class*="content"]`,tabContainerSelector:`.vp-code-group .tabs, [role="tablist"]`,tocSelector:`.VPDocAsideOutline, .VPLocalNavOutlineDropdown, a.outline-link`,feedbackSelector:`[class*="feedback"], [class*="helpful"]`},starlight:{searchSelector:`site-search button[data-open-modal], sl-doc-search .DocSearch-Button, button[aria-label*="search" i]`,copyButtonSelector:`.expressive-code .copy button, .copy button[data-code]`,codeBlockSelector:`.expressive-code pre, pre`,navigationSelector:`nav, [role="navigation"], [class*="sidebar"]`,footerSelector:`footer, [role="contentinfo"], [class*="footer"]`,contentSelector:`main, .sl-markdown-content, [role="main"]`,tabContainerSelector:`starlight-tabs [role="tablist"], [role="tablist"]`,tocSelector:`.right-sidebar-panel, starlight-toc, mobile-starlight-toc`,feedbackSelector:`[class*="feedback"], [class*="helpful"]`},docsy:{searchSelector:`.td-search input, .td-search__input, #docsearch-0, #docsearch-1`,copyButtonSelector:`button[aria-label*="copy" i], button[title*="copy" i], .td-click-to-copy`,codeBlockSelector:`.highlight, pre.chroma, pre`,navigationSelector:`nav, [role="navigation"], .td-sidebar, .td-navbar, [class*="sidebar"]`,footerSelector:`footer, [role="contentinfo"], .td-footer, [class*="footer"]`,contentSelector:`main, article, [role="main"], .td-content, [class*="content"]`,tabContainerSelector:`.nav-tabs[role="tablist"], [role="tablist"], .tab-content`,tocSelector:`.td-toc, nav[id="TableOfContents"], [class*="toc"]`,feedbackSelector:`.feedback--answer, [class*="feedback"], [class*="helpful"]`}};function ee(e){let t=m[e.framework];t?f.forEach(n=>{e[n]||(e[n]=t[n])}):e.framework!==`custom`&&e.debug&&console.warn(`[Do11y] Unknown framework "${e.framework}". Falling back to generic selectors. Supported: `+Object.keys(m).join(`, `)+`, custom`);let n=m.mintlify;n&&f.forEach(t=>{e[t]||(e[t]=n[t])})}function h(e){if(!e||typeof e!=`string`)return null;try{return document.querySelector(e),e}catch{return null}}function te(e){if(e.respectDNT&&(navigator.doNotTrack===`1`||navigator.doNotTrack===`yes`||window.doNotTrack===`1`))return e.debug&&console.log(`[Do11y] Disabled: Do Not Track is enabled`),!0;if(e.allowedDomains&&e.allowedDomains.length>0){let t=window.location.hostname;if(!e.allowedDomains.some(e=>t===e||t.endsWith(`.`+e)))return e.debug&&console.log(`[Do11y] Disabled: Domain not allowed:`,t),!0}return!1}function g(e){if(typeof e.className==`string`)return e.className;let t=e.className;return t&&typeof t.baseVal==`string`?t.baseVal:``}function ne(e){let t=e.match(/(?:^|\s)language-([\w-]+)(?:\s|$)/);return t?t[1]:null}function re(e){if(!e)return`unknown`;let t=e;for(let e=0;t&&e<12;e++,t=t.parentElement){for(let e of[`language`,`data-language`,`data-lang`,`data-code-lang`]){let n=t.getAttribute(e);if(n)return n}let e=ne(g(t));if(e)return e;let n=t.querySelector(`:scope > span.lang`)?.textContent?.trim();if(n)return n;let r=t.querySelector(`[data-language], [data-lang], [data-code-lang], [class*="language-"], [language]`);if(r){let e=r.getAttribute(`language`)??r.getAttribute(`data-language`)??r.getAttribute(`data-lang`)??r.getAttribute(`data-code-lang`)??ne(g(r));if(e)return e}}return`unknown`}function ie(e){if(e.startsWith(`#`))return e;let t=e.indexOf(`#`);if(t===-1)return null;let n=e.slice(0,t);return!n||n===window.location.pathname||n===`${window.location.pathname}${window.location.search}`?e.slice(t):null}function ae(e,t){let n=h(t.tocSelector);if(n){let t=e.closest(n);if(t&&t!==e&&t.tagName!==`A`)return t}for(let t of[`.VPDocAsideOutline`,`.VPLocalNavOutlineDropdown`,`.table-of-contents`,`.right-sidebar-panel`,`starlight-toc`,`[class*="TableOfContents"]`,`[class*="page-outline"]`,`[class*="toc"]`,`nav[id="TableOfContents"]`]){let n=e.closest(t);if(n&&n!==e&&n.tagName!==`A`)return n}return e.parentElement&&e.parentElement!==document.body?e.parentElement:null}function _(e){let t=e;for(;t&&t!==document.body;){let e=t.previousElementSibling;for(;e;){if(/^H[1-6]$/.test(e.tagName))return e.textContent?.trim().substring(0,100)??null;let t=e.querySelectorAll(`h1, h2, h3, h4, h5, h6`);if(t.length>0)return t[t.length-1].textContent?.trim().substring(0,100)??null;e=e.previousElementSibling}t=t.parentElement}return null}function v(e,t){if(!e||typeof e!=`string`)return null;let n=t??100,r=e;return r=r.replace(/[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}/g,`[email]`),r=r.replace(/\b\d{3}[-.]?\d{3}[-.]?\d{4}\b/g,`[phone]`),r=r.replace(/\b\d{3}-\d{2}-\d{4}\b/g,`[redacted]`),r=r.replace(/\b(?:\d[ -]?){13,19}\b/g,`[card]`),r=r.replace(/eyJ[A-Za-z0-9_-]+\.eyJ[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+/g,`[token]`),r=r.replace(/\bxa[a-z]{2}-[A-Za-z0-9_-]{20,}/g,`[token]`),r=r.replace(/\b[0-9a-fA-F]{32,}\b/g,`[redacted]`),r.trim().substring(0,n)}function oe(){let e=window.innerWidth;return e<640?`mobile`:e<1024?`tablet`:e<1440?`desktop`:`large-desktop`}function se(){let e=navigator.userAgent;return e.includes(`Firefox`)?`Firefox`:e.includes(`Edg`)?`Edge`:e.includes(`Chrome`)?`Chrome`:e.includes(`Safari`)?`Safari`:`Other`}function ce(){let e=navigator.userAgent;return/Mobile|Android|iPhone|iPad/.test(e)?/iPad|Tablet/.test(e)?`tablet`:`mobile`:`desktop`}function le(){return{"browser.do11y.viewport_category":oe(),"browser.family":se(),"device.type":ce(),"browser.language":(navigator.language||``).split(`-`)[0]||`unknown`,"browser.do11y.timezone_offset":new Date().getTimezoneOffset()/60}}let ue=[{match:`chatgpt`,platform:`ChatGPT`},{match:`chat.com`,platform:`ChatGPT`},{match:`openai`,platform:`ChatGPT`},{match:`perplexity`,platform:`Perplexity`},{match:`claude.ai`,platform:`Claude`},{match:`anthropic`,platform:`Claude`},{match:`gemini`,platform:`Gemini`},{match:`copilot`,platform:`Copilot`},{match:`deepseek`,platform:`DeepSeek`},{match:`meta.ai`,platform:`Meta AI`},{match:`grok`,platform:`Grok`},{match:`x.ai`,platform:`Grok`},{match:`mistral`,platform:`Mistral`},{match:`you.com`,platform:`You.com`},{match:`phind`,platform:`Phind`}];function de(e){if(!e||e===`direct`)return{referrerCategory:`direct`,aiPlatform:null};if(e===`internal`)return{referrerCategory:`internal`,aiPlatform:null};if(e===`unknown`)return{referrerCategory:`unknown`,aiPlatform:null};let t=e.toLowerCase();for(let e of ue)if(t.indexOf(e.match)!==-1)return{referrerCategory:`ai`,aiPlatform:e.platform};return/google\.|bing\.|baidu\.|yandex\.|duckduckgo\.|yahoo\./.test(t)?{referrerCategory:`search-engine`,aiPlatform:null}:/github\.|gitlab\.|bitbucket\./.test(t)?{referrerCategory:`code-host`,aiPlatform:null}:/stackoverflow\.|stackexchange\.|reddit\.|news\.ycombinator\./.test(t)?{referrerCategory:`community`,aiPlatform:null}:/twitter\.|x\.com|linkedin\.|facebook\.|threads\.net/.test(t)?{referrerCategory:`social`,aiPlatform:null}:{referrerCategory:`other`,aiPlatform:null}}function fe(){try{if(!document.referrer)return`direct`;let e=new URL(document.referrer);return e.hostname===window.location.hostname?`internal`:e.hostname}catch{return`unknown`}}function pe(){return{"url.path":window.location.pathname,"url.fragment":window.location.hash||null,"browser.do11y.url.has_params":window.location.search?`has_params`:null,"browser.do11y.page_title":v(document.title,150)}}function me(){if(window.crypto&&typeof window.crypto.randomUUID==`function`)return window.crypto.randomUUID();if(window.crypto&&typeof window.crypto.getRandomValues==`function`){let e=new Uint8Array(16);window.crypto.getRandomValues(e),e[6]=e[6]&15|64,e[8]=e[8]&63|128;let t=Array.from(e,e=>e.toString(16).padStart(2,`0`)).join(``);return t.slice(0,8)+`-`+t.slice(8,12)+`-`+t.slice(12,16)+`-`+t.slice(16,20)+`-`+t.slice(20)}return`no-crypto-00-0000-0000-000000000000`}function he(e){if(!e||typeof e!=`object`)return!1;let t=e;return typeof t.id==`string`&&t.id.length>0&&typeof t.startTime==`string`&&Array.isArray(t.pageSequence)&&typeof t.pageCount==`number`}function y(){let e=null;try{let t=sessionStorage.getItem(`do11y_session`);if(t){let n=JSON.parse(t);he(n)&&(e=n)}}catch{}return e||(e={id:me(),startTime:new Date().toISOString(),pageSequence:[],pageCount:0,referrerCategory:null,aiPlatform:null},b(e)),e}function b(e){try{sessionStorage.setItem(`do11y_session`,JSON.stringify(e))}catch{}}function ge(e){let t=y();return t.pageCount++,t.pageSequence.push({path:e,timestamp:new Date().toISOString(),index:t.pageCount}),t.pageSequence.length>50&&(t.pageSequence=t.pageSequence.slice(-50)),b(t),t}let x=new Set,S=null;function _e(e){let t=e;for(;t&&t!==document.body&&t!==document.documentElement;){let e=window.getComputedStyle(t).overflowY;if((e===`auto`||e===`scroll`)&&t.scrollHeight>t.clientHeight)return t;t=t.parentElement}return null}function C(e,t){let n,r,o;S&&S.scrollHeight>S.clientHeight?(n=S.scrollTop,r=S.scrollHeight,o=S.clientHeight):(n=window.scrollY||document.documentElement.scrollTop,r=document.documentElement.scrollHeight,o=window.innerHeight);let s=r-o;if(s<=0){e.scrollThresholds.forEach(e=>{x.has(e)||(x.add(e),t(l,{[i]:e,[a]:100}))});return}let c=Math.round(n/s*100);e.scrollThresholds.forEach(e=>{c>=e&&!x.has(e)&&(x.add(e),t(l,{[i]:e,[a]:c}))})}function ve(e,t){if(!e.trackScrollDepth)return;if(e.contentSelector){let t=document.querySelector(e.contentSelector);t&&(S=_e(t))}let n=!1;function r(){n||=(window.requestAnimationFrame(()=>{C(e,t),n=!1}),!0)}if(window.addEventListener(`scroll`,r),S&&(S.addEventListener(`scroll`,r),e.debug)){let e=S;console.log(`[do11y] Using container-based scroll tracking:`,e.className||e.tagName)}C(e,t)}function ye(){x=new Set}function be(){return x}function w(e,t,n){e(`browser.do11y.section_visible`,{"browser.do11y.section.heading":v(t.textContent?.trim()??``,100),"browser.do11y.section.heading_level":parseInt(t.tagName.charAt(1),10),"browser.do11y.section.visible_seconds":Math.round(n/1e3)})}let T=null,E={};function xe(e,t){if(!e.trackSectionVisibility||typeof IntersectionObserver>`u`)return;let n=e.sectionVisibleThreshold*1e3;T=new IntersectionObserver(e=>{e.forEach(e=>{let r=e.target.getAttribute(`data-do11y-section-id`);if(r)if(e.isIntersecting){if(!E[r]){let i={start:Date.now(),reported:!1,timeoutId:null};i.timeoutId=setTimeout(()=>{E[r]&&!E[r].reported&&(w(t,e.target,n),E[r].reported=!0)},n),E[r]=i}}else{if(E[r]&&(E[r].timeoutId&&clearTimeout(E[r].timeoutId),!E[r].reported)){let i=Date.now()-E[r].start;i>=n&&(w(t,e.target,i),E[r].reported=!0)}delete E[r]}})},{threshold:.5}),D()}function D(){T&&document.querySelectorAll(`h2, h3`).forEach((e,t)=>{e.setAttribute(`data-do11y-section-id`,`section-`+t),T.observe(e)})}function Se(e,t){if(!T)return;let n=Date.now(),r=e.sectionVisibleThreshold*1e3;Object.keys(E).forEach(e=>{let i=E[e];if(i&&!i.reported){i.timeoutId&&clearTimeout(i.timeoutId);let a=n-i.start;if(a>=r){let n=typeof CSS<`u`&&typeof CSS.escape==`function`?CSS.escape(e):e.replace(/[!"#$%&'()*+,./:;<=>?@[\\\]^`{|}~ ]/g,`\\$&`),r=document.querySelector(`[data-do11y-section-id="`+n+`"]`);r&&w(t,r,a)}}}),E={}}function Ce(){T&&=(E&&Object.keys(E).length>0&&(Object.keys(E).forEach(e=>{let t=E[e];t&&!t.reported&&t.timeoutId&&clearTimeout(t.timeoutId)}),E={}),T.disconnect(),null)}let O=Date.now(),k=Date.now(),A=0,j=!0,M=!1;function N(e,t,i){if(M)return;M=!0,j&&(A+=Date.now()-k);let a=Date.now()-O,o=a>0?A/a:0,s=0;be().forEach(e=>{e>s&&(s=e)}),Se(e,t);let c=y();t(`browser.do11y.page_exit`,{"browser.do11y.page_exit.total_time_seconds":Math.round(a/1e3),"browser.do11y.page_exit.active_time_seconds":Math.round(A/1e3),"browser.do11y.page_exit.engagement_ratio":Math.round(o*100)/100,"browser.do11y.page_exit.max_scroll_depth":s,[n]:c.referrerCategory,[r]:c.aiPlatform}),i?.()}function we(e,t){document.addEventListener(`visibilitychange`,()=>{document.hidden?j&&=(A+=Date.now()-k,!1):(k=Date.now(),j=!0)}),window.addEventListener(`beforeunload`,()=>{N(e,t)})}function Te(){O=Date.now(),k=Date.now(),A=0,j=!0,M=!1}function Ee(){M=!1}function P(e,t){Ee();let i=ge(window.location.pathname),a=fe(),o=de(a);i.pageCount===1&&(i.referrerCategory=o.referrerCategory,i.aiPlatform=o.aiPlatform,b(i)),t(`browser.do11y.page_view`,{"browser.do11y.referrer_domain":a,[n]:o.referrerCategory,[r]:o.aiPlatform,"browser.do11y.is_first_page":i.pageCount===1,"browser.do11y.previous_path":i.pageSequence.length>1?i.pageSequence[i.pageSequence.length-2].path:null})}function De(e,t){return e.closest(t.navigationSelector)?`navigation`:e.closest(t.footerSelector)?`footer`:e.closest(t.contentSelector)?`content`:`other`}function Oe(){try{let e=new Map;document.querySelectorAll(`a[href]`).forEach(t=>{let n=t.getAttribute(`href`)??``,r=e.get(n)??[];r.push(t),e.set(n,r)}),e.forEach(e=>{e.forEach((e,t)=>{e.setAttribute(`data-do11y-link-idx`,String(t+1))})})}catch{}}function ke(e,t){Oe(),document.addEventListener(`click`,n=>{let r=n.target.closest(`a`);if(!r)return;let i=r.getAttribute(`href`);if(!i)return;let a=`other`,o=null;try{if(i.startsWith(`#`))a=`anchor`;else if(i.startsWith(`/`)||i.startsWith(`./`)||i.startsWith(`../`))a=`internal`;else if(i.startsWith(`http`)){let e=new URL(i);e.hostname===window.location.hostname?a=`internal`:(a=`external`,o=e.hostname)}else i.startsWith(`mailto:`)&&(a=`email`)}catch{}if(a===`internal`&&!e.trackInternalLinks||a===`external`&&!e.trackOutboundLinks)return;let s=parseInt(r.getAttribute(`data-do11y-link-idx`)??`1`,10);t(`browser.do11y.link_click`,{"browser.do11y.link.type":a,"browser.do11y.link.target_url":i,"browser.do11y.link.target_domain":o,"browser.do11y.link.text":v(r.textContent,100),"browser.do11y.link.context":De(r,e),"browser.do11y.link.section":v(_(r),100),"browser.do11y.link.index":s})},!0)}function Ae(e,t){e.trackSearch&&(document.addEventListener(`click`,n=>{n.target.closest(e.searchSelector)&&t(u,{})},!0),document.addEventListener(`keydown`,n=>{if((n.metaKey||n.ctrlKey)&&n.key===`k`){if(!document.querySelector(e.searchSelector))return;t(u,{"browser.do11y.search.trigger":`keyboard`})}}))}function je(e){try{document.querySelectorAll(e.codeBlockSelector).forEach((e,t)=>{e.setAttribute(`data-do11y-code-idx`,String(t+1))})}catch{}}function Me(e,t){e.trackCopy&&(je(e),document.addEventListener(`click`,n=>{let r=n.target.closest(e.copyButtonSelector);if(r){let n=r.closest(`[class*="language-"], [language]`)??r.closest(e.codeBlockSelector)??r.closest(`.expressive-code`)?.querySelector(`pre`)??r.closest(`div, section`)?.querySelector(`pre`)??r.parentElement?.querySelector(`pre`)??null,i=re((n?n.tagName===`PRE`?n.querySelector(`code`):n.querySelector(`code[class*="language-"], code[language]`)??n.querySelector(`code`):null)??n??r),a=parseInt(n?.getAttribute(`data-do11y-code-idx`)??`1`,10);t(`browser.do11y.code_copied`,{"browser.do11y.code.language":i,"browser.do11y.code.section":v(_(n??r),100),"browser.do11y.code.index":a})}},!0))}function Ne(e,t){e.trackTabSwitches&&document.addEventListener(`click`,n=>{let r=`[role="tab"], .tabs button, .tabs a, .tabbed-labels label`,i=h(e.tabContainerSelector);i&&(r+=`, `+i+` button, `+i+` a, `+i+` label`);let a=n.target.closest(r);if(!a||a.getAttribute(`aria-selected`)===`true`||a.classList.contains(`active`)||a.classList.contains(`is-active`))return;let o=v(a.textContent,50);if(!o)return;let s=v(_(a),100);t(`browser.do11y.tab_switch`,{"browser.do11y.tab.label":o,"browser.do11y.tab.group":s,"browser.do11y.tab.is_default":!1})})}function Pe(e,t){e.trackTocClicks&&document.addEventListener(`click`,n=>{let r=n.target.closest(`a`);if(!r)return;let i=ae(r,e);if(!i)return;let a=r.getAttribute(`href`),o=a?ie(a):null;if(!o)return;let s=v(r.textContent,100),c=null;try{let e=o.slice(1),t=document.getElementById(e);t&&/^H[1-6]$/.test(t.tagName)&&(c=parseInt(t.tagName.charAt(1),10))}catch{}let l=i.querySelectorAll(`a[href*="#"]`),u=1;for(let e=0;e<l.length;e++)if(l[e]===r){u=e+1;break}t(`browser.do11y.toc_click`,{"browser.do11y.toc.heading":s,"browser.do11y.toc.heading_level":c,"browser.do11y.toc.position":u})},!0)}function Fe(e,t){e.trackFeedback&&document.addEventListener(`click`,n=>{let r=n.target.closest(`button, [role="button"], a`);if(!r||!r.closest(h(e.feedbackSelector)??`[class*="feedback"], [class*="helpful"], [class*="rating"], [class*="was-this"], [data-feedback]`))return;let i=(r.textContent??``).trim().toLowerCase(),a=(r.getAttribute(`aria-label`)??``).toLowerCase(),o=(r.getAttribute(`title`)??``).toLowerCase(),s=r.getAttribute(`data-value`)??r.getAttribute(`data-md-value`)??r.getAttribute(`data-feedback`),c=s&&/^[\w\s.,!?-]{1,50}$/.test(s)?s:null,l=null;c?l=c:/\byes\b|👍|thumbs.?up|helpful/i.test(i+` `+a+` `+o)?l=`yes`:/\bno\b|👎|thumbs.?down|not.?helpful/i.test(i+` `+a+` `+o)&&(l=`no`),l&&t(`browser.do11y.feedback`,{"browser.do11y.feedback.rating":l})})}function Ie(e,t){e.trackExpandCollapse&&(document.addEventListener(`toggle`,e=>{let n=e.target;if(n.tagName!==`DETAILS`)return;let r=n.querySelector(`summary`),i=v(r?r.textContent:``,100);t(d,{[o]:i,[s]:n.open?`expand`:`collapse`,[c]:v(_(n),100)})},!0),document.addEventListener(`click`,e=>{let n=e.target.closest(`[aria-expanded], [class*="accordion"] button, [class*="collapsible"] button`);if(!n||n.closest(`details`)||n.closest(`nav, [role="navigation"], header`))return;let r=n.getAttribute(`aria-expanded`)===`true`;t(d,{[o]:v(n.textContent,100),[s]:r?`collapse`:`expand`,[c]:v(_(n),100)})}))}let F=[],I=null,Le=p(),L=!1,R=null,z=[],B=null,V=!1,H=!1;function U(e){L=e}function W(){return L}function Re(){return F.length}function ze(e,n,r){if(L||!Le.allow(n,r,e.rateLimitMs,e.debug))return;let i=y(),a=new Date,o={_time:a.toISOString(),eventName:n,"browser.do11y.version":t,"session.id":i.id,"browser.do11y.session_page_count":i.pageCount,...pe(),...le(),...r};if(e.debug&&console.log(`[Do11y] Event queued:`,n,o),e.destination===`otlp`){if(R){Ue(n,o,a);return}if(V){e.debug&&console.warn(`[Do11y] OTel SDK unavailable; dropping event:`,n);return}z.push(o),z.length>500&&(z=z.slice(-500),console.warn(`[Do11y] OTLP pending buffer capped at 500 events — oldest events dropped`)),Ge(e);return}F.push(o),F.length>500&&(F=F.slice(-500),console.warn(`[Do11y] Event queue capped at 500 events — oldest events dropped`)),F.length>=e.maxBatchSize?Y(e):Be(e)}function Be(e){I||=setTimeout(()=>Y(e),e.flushInterval)}function Ve(e,t=!1){return G(e,t)}function He(e){try{return new URL(e).hostname.endsWith(`.supabase.co`)}catch{return!1}}function G(e,t=!1){try{let n=new URL(e),r=n.hostname,i=r===`localhost`||r===`127.0.0.1`||r===`::1`||/^(10\.|172\.(1[6-9]|2\d|3[01])\.|192\.168\.)/.test(r);return t&&i&&n.protocol===`http:`?!0:!(n.protocol!==`https:`||i)}catch{return!1}}function K(e){return e.destination===`supabase`?e.supabaseUrl?Ve(e.supabaseUrl,e.debug)?(e.debug&&!H&&!He(e.supabaseUrl)&&(H=!0,console.warn(`[Do11y] Non-hosted Supabase URL. Ensure you configure your instance's REST endpoint and CORS settings.`)),!e.supabaseKey||typeof e.supabaseKey!=`string`||e.supabaseKey.length<10?(e.debug&&console.warn(`[Do11y] Invalid or missing Supabase publishable key`),!1):/^[a-zA-Z0-9_-]+$/.test(e.supabaseTable)?!0:(e.debug&&console.warn(`[Do11y] Invalid table name`),!1)):(e.debug&&console.warn(`[Do11y] Invalid Supabase URL. Must be a valid HTTPS URL (HTTP is allowed for localhost/private addresses when debug is enabled).`),!1):(e.debug&&console.warn(`[Do11y] No Supabase URL configured`),!1):e.destination===`http`?e.endpoint?G(e.endpoint,e.debug)?!0:(e.debug&&console.warn(`[Do11y] Invalid HTTP endpoint. Must be HTTPS and not a private address.`),!1):(e.debug&&console.warn(`[Do11y] No HTTP endpoint configured`),!1):e.destination===`otlp`?e.otelSdkEndpoint?!0:(e.debug&&console.warn(`[Do11y] No OTLP endpoint configured`),!1):(e.debug&&console.warn(`[Do11y] Unknown destination:`,e.destination),!1)}let q=`0.222.0`;function Ue(e,t,n){if(!R)return;let r={...t};delete r._time,delete r.eventName,R.emit({eventName:e,severityNumber:9,timestamp:n.getTime(),attributes:r,body:``})}function We(){if(!R||z.length===0)return;let e=z;z=[];for(let t of e)Ue(t.eventName,t,new Date(t._time))}function Ge(e){R||B||V||(B=Ke(e).catch(e=>{V=!0,z=[],console.warn(`[Do11y] OTel SDK initialization failed; buffered events dropped:`,e)}).finally(()=>{B=null}))}async function Ke(e){if(R)return;let n=`https://esm.sh/`,r=async e=>import(e),i=await r(`${n}@opentelemetry/api-logs@${q}`),a=await r(`${n}@opentelemetry/sdk-logs@${q}`),o=await r(`${n}@opentelemetry/exporter-logs-otlp-http@${q}`),s={"service.name":e.otelSdkServiceName||`do11y`,"service.version":t,"telemetry.sdk.name":`do11y`,"telemetry.sdk.language":`webjs`,"telemetry.sdk.version":t,...e.otelSdkResourceAttributes},c=new a.LoggerProvider({resource:{attributes:s},processors:[new a.BatchLogRecordProcessor({exporter:new o.OTLPLogExporter({url:e.otelSdkEndpoint.replace(/\/$/,``)+`/v1/logs`,headers:e.otelSdkHeaders})})]});i.logs.setGlobalLoggerProvider(c),R=c.getLogger(`do11y`),We(),e.debug&&console.log(`[Do11y] OTel SDK initialized with endpoint:`,e.otelSdkEndpoint)}function J(e,t){if(t.destination===`supabase`){let n=t.supabaseUrl.replace(/\/$/,``)+`/rest/v1/`+t.supabaseTable,r=t.bodyTransform??(e=>e.map(e=>({payload:e})));return{url:n,headers:{apikey:t.supabaseKey,Authorization:`Bearer `+t.supabaseKey,"Content-Type":`application/json`,Prefer:`return=minimal`},body:JSON.stringify(r(e))}}let n=t.bodyTransform??(e=>e);return{url:t.endpoint,headers:{"Content-Type":`application/json`,...t.headers},body:JSON.stringify(n(e))}}function qe(e){try{return new URL(e).origin!==window.location.origin}catch{return!1}}function Je(e,t,n,r){let i=qe(e.url);r.debug&&i&&console.log(`[Do11y] Cross-origin request to`,new URL(e.url).origin,`- requires CORS headers on the server`),fetch(e.url,{method:`POST`,headers:e.headers,body:e.body,keepalive:!0,mode:i?`cors`:`same-origin`}).then(e=>{if(e.ok){r.debug&&console.log(`[Do11y] Flushed`,t.length,`events`);return}if(n>0&&(e.status>=500||e.status===429)){r.debug&&console.log(`[Do11y] Retrying after error:`,e.status),F=t.concat(F),setTimeout(()=>Y(r,n-1),r.retryDelay*(r.maxRetries-n+1));return}r.debug&&e.text().then(t=>{let n=`[Do11y] Ingest failed: ${e.status}`;e.status===0&&e.type===`opaque`?console.error(n,`- CORS error: server did not return Access-Control-Allow-Origin`):console.error(n,t)}).catch(()=>{})}).catch(e=>{if(n>0){if(r.debug){let t=i?` (this may be a CORS issue — try using an OTel Collector proxy)`:``;console.log(`[Do11y] Network error, retrying:`,e.message+t)}F=t.concat(F),setTimeout(()=>Y(r,n-1),r.retryDelay*(r.maxRetries-n+1))}else r.debug&&console.error(`[Do11y] Failed to send events:`,e.message)})}function Y(e,t){if(I&&=(clearTimeout(I),null),e.destination===`otlp`){F.length>0&&(e.debug&&console.warn(`[Do11y] Dropping `+F.length+` queued events (OTLP mode has no HTTP transport)`),F=[]);return}if(F.length===0||!K(e))return;let n=typeof t==`number`?t:e.maxRetries,r=F.slice();F=[],Je(J(r,e),r,n,e)}function Ye(e){if(e.destination===`otlp`||F.length===0||!K(e))return;let t=F;F=[];let n=J(t,e);try{fetch(n.url,{method:`POST`,headers:n.headers,body:n.body,keepalive:!0})}catch{}e.debug&&console.log(`[Do11y] Sync flushed`,t.length,`events`)}function Xe(){I&&=(clearTimeout(I),null)}let X={destination:`supabase`,supabaseUrl:``,supabaseKey:``,supabaseTable:`do11y_events`,endpoint:``,headers:{},bodyTransform:void 0,otelSdkEndpoint:``,otelSdkHeaders:{},otelSdkServiceName:`do11y`,otelSdkResourceAttributes:{},debug:!1,flushInterval:5e3,maxBatchSize:10,trackOutboundLinks:!0,trackInternalLinks:!0,trackScrollDepth:!0,scrollThresholds:[25,50,75,90],allowedDomains:null,respectDNT:!0,maxRetries:2,retryDelay:1e3,rateLimitMs:100,framework:`mintlify`,trackSectionVisibility:!0,sectionVisibleThreshold:3,trackSearch:!0,trackCopy:!0,trackTabSwitches:!0,trackTocClicks:!0,trackExpandCollapse:!0,trackFeedback:!0,tabContainerSelector:null,tocSelector:null,feedbackSelector:null,searchSelector:null,copyButtonSelector:null,codeBlockSelector:null,navigationSelector:null,footerSelector:null,contentSelector:null,trackSpaPathChanges:!1,sessionAttributes:!0},Ze=!!window.__do11yInitialized;window.__do11yInitialized=!0;let Qe=window.self!==window.top;Qe&&!Ze&&(window.__do11yInitialized=!1);let Z=null,Q=null;function $e(){let e=X,t=window.Do11yConfig;if(t&&typeof t==`object`){for(let n in X)if(Object.prototype.hasOwnProperty.call(t,n)){let r=t[n];r!==void 0&&(e[n]=r)}}let n=document.querySelector(`meta[name="do11y-destination"]`);if(n){let e=n.getAttribute(`content`);(e===`supabase`||e===`http`||e===`otlp`)&&(X.destination=e)}let r=document.querySelector(`meta[name="do11y-url"]`);r&&(X.supabaseUrl=r.getAttribute(`content`)??X.supabaseUrl);let i=document.querySelector(`meta[name="do11y-key"]`);i&&(X.supabaseKey=i.getAttribute(`content`)??X.supabaseKey);let a=document.querySelector(`meta[name="do11y-table"]`);a&&(X.supabaseTable=a.getAttribute(`content`)??X.supabaseTable);let o=document.querySelector(`meta[name="do11y-endpoint"]`);o&&(X.endpoint=o.getAttribute(`content`)??X.endpoint);let s=document.querySelector(`meta[name="do11y-otlp-endpoint"]`);s&&(X.otelSdkEndpoint=s.getAttribute(`content`)??X.otelSdkEndpoint);let c=document.querySelector(`meta[name="do11y-otlp-headers"]`);if(c)try{let e=JSON.parse(c.getAttribute(`content`)??`{}`);typeof e==`object`&&e&&(X.otelSdkHeaders=e)}catch{}let l=document.querySelector(`meta[name="do11y-debug"]`);l&&l.getAttribute(`content`)===`true`&&(X.debug=!0);let u=document.querySelector(`meta[name="do11y-domains"]`);if(u){let e=u.getAttribute(`content`);e&&(X.allowedDomains=e.split(`,`).map(e=>e.trim()))}let d=document.querySelector(`meta[name="do11y-framework"]`);if(d){let e=d.getAttribute(`content`);e&&[`mintlify`,`docusaurus`,`nextra`,`mkdocs-material`,`vitepress`,`starlight`,`docsy`,`custom`].includes(e)?X.framework=e:e&&X.debug&&console.warn(`[Do11y] Unknown framework in meta tag: "`+e+`". Using default: `+X.framework)}if(ee(X),X.debug&&console.log(`[Do11y] Initializing with config:`,{destination:X.destination,framework:X.framework,allowedDomains:X.allowedDomains,respectDNT:X.respectDNT}),te(X)){U(!0),X.debug&&console.log(`[Do11y] Tracking disabled`);return}(X.destination===`supabase`?X.supabaseKey:X.destination===`otlp`?X.otelSdkEndpoint:X.endpoint)||(console.warn(`[Do11y] No destination configured. Events will not be sent.`),X.destination===`supabase`?console.warn(`[Do11y] Add <meta name="do11y-url"> and <meta name="do11y-key"> to enable.`):X.destination===`otlp`?console.warn(`[Do11y] Add <meta name="do11y-otlp-endpoint"> to enable.`):console.warn(`[Do11y] Add <meta name="do11y-endpoint"> to enable.`));let f=(e,t)=>{ze(X,e,t)};P(X,f),ke(X,f),ve(X,f),we(X,f),Ae(X,f),Me(X,f),xe(X,f),Ne(X,f),Pe(X,f),Fe(X,f),Ie(X,f);let p=window.location.pathname,m=()=>{window.location.pathname!==p&&(p=window.location.pathname,N(X,f,()=>Y(X)),ye(),Te(),P(X,f),D(),C(X,f))};Z=new MutationObserver(m),Z.observe(document.body,{childList:!0,subtree:!0}),window.addEventListener(`popstate`,m),Q=window.setInterval(m,200),Object.freeze(X),window.addEventListener(`beforeunload`,()=>{Q!==null&&(clearInterval(Q),Q=null),Ye(X),Xe()}),document.addEventListener(`visibilitychange`,()=>{document.hidden&&Q!==null?(clearInterval(Q),Q=null):!document.hidden&&Q===null&&X.trackSpaPathChanges&&(Q=window.setInterval(m,200))}),X.debug&&console.log(`[Do11y] Initialized successfully`)}function $(){Z&&=(Z.disconnect(),null),Q!==null&&(clearInterval(Q),Q=null),Ce(),Ye(X),Xe(),U(!0),window.__do11yInitialized=!1}return!Ze&&!Qe&&(document.readyState===`loading`?document.addEventListener(`DOMContentLoaded`,$e):$e()),window.Do11y=window.Do11y??{getConfig:()=>({destination:X.destination,hasCredentials:X.destination===`supabase`?!!X.supabaseKey:X.destination===`otlp`?!!X.otelSdkEndpoint:!!X.endpoint,isDisabled:W(),allowedDomains:X.allowedDomains,respectDNT:X.respectDNT}),flush:()=>Y(X),isEnabled:()=>W()?!1:X.destination===`supabase`?!!X.supabaseKey:X.destination===`otlp`?!!X.otelSdkEndpoint:!!X.endpoint,getQueueSize:()=>Re(),version:`0.2.2`,destroy:()=>$()},e.destroy=$,e})({});
|
|
@@ -9,7 +9,7 @@ import { logs } from "@opentelemetry/api-logs";
|
|
|
9
9
|
* Standard attrs from https://opentelemetry.io/docs/specs/semconv/.
|
|
10
10
|
* Custom do11y attrs use the `browser.do11y.*` namespace.
|
|
11
11
|
*/
|
|
12
|
-
const VERSION = "0.2.
|
|
12
|
+
const VERSION = "0.2.2";
|
|
13
13
|
const ATTR_SESSION_ID = "session.id";
|
|
14
14
|
const ATTR_URL_PATH = "url.path";
|
|
15
15
|
const ATTR_URL_FRAGMENT = "url.fragment";
|
|
@@ -47,7 +47,7 @@ window.Do11yConfig = {
|
|
|
47
47
|
|
|
48
48
|
// Documentation framework. Supported values:
|
|
49
49
|
// 'mintlify', 'docusaurus', 'nextra', 'starlight', 'mkdocs-material',
|
|
50
|
-
// 'vitepress', 'custom'
|
|
50
|
+
// 'vitepress', 'docsy', 'custom'
|
|
51
51
|
framework: 'mintlify',
|
|
52
52
|
|
|
53
53
|
// Optional: restrict which domains may send data.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@manototh/do11y",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.2",
|
|
4
4
|
"description": "Documentation observability",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/do11y.min.js",
|
|
@@ -35,8 +35,8 @@
|
|
|
35
35
|
],
|
|
36
36
|
"license": "MIT",
|
|
37
37
|
"peerDependencies": {
|
|
38
|
-
"@opentelemetry/api-logs": "^0.
|
|
39
|
-
"@opentelemetry/instrumentation": "^0.
|
|
38
|
+
"@opentelemetry/api-logs": "^0.222.0",
|
|
39
|
+
"@opentelemetry/instrumentation": "^0.222.0"
|
|
40
40
|
},
|
|
41
41
|
"peerDependenciesMeta": {
|
|
42
42
|
"@opentelemetry/api-logs": {
|
|
@@ -47,8 +47,8 @@
|
|
|
47
47
|
}
|
|
48
48
|
},
|
|
49
49
|
"devDependencies": {
|
|
50
|
-
"@opentelemetry/api-logs": "^0.
|
|
51
|
-
"@opentelemetry/instrumentation": "^0.
|
|
50
|
+
"@opentelemetry/api-logs": "^0.222.0",
|
|
51
|
+
"@opentelemetry/instrumentation": "^0.222.0",
|
|
52
52
|
"oxfmt": "latest",
|
|
53
53
|
"oxlint": "latest",
|
|
54
54
|
"rolldown": "latest",
|