From fcc58515360d29194f651ab0b6d543be1f563441 Mon Sep 17 00:00:00 2001 From: zairro Date: Fri, 8 Aug 2025 21:56:11 -0700 Subject: [PATCH 1/6] Contribute a new integration: Matomo --- integrations/matomo/CHANGELOG.md | 9 +++ integrations/matomo/assets/icon.png | Bin 0 -> 10752 bytes integrations/matomo/gitbook-manifest.yaml | 49 +++++++++++++ integrations/matomo/global.d.ts | 6 ++ integrations/matomo/package.json | 21 ++++++ integrations/matomo/src/index.ts | 47 +++++++++++++ integrations/matomo/src/matomoScript.raw.js | 72 ++++++++++++++++++++ integrations/matomo/tsconfig.json | 14 ++++ 8 files changed, 218 insertions(+) create mode 100644 integrations/matomo/CHANGELOG.md create mode 100644 integrations/matomo/assets/icon.png create mode 100644 integrations/matomo/gitbook-manifest.yaml create mode 100644 integrations/matomo/global.d.ts create mode 100644 integrations/matomo/package.json create mode 100644 integrations/matomo/src/index.ts create mode 100644 integrations/matomo/src/matomoScript.raw.js create mode 100644 integrations/matomo/tsconfig.json diff --git a/integrations/matomo/CHANGELOG.md b/integrations/matomo/CHANGELOG.md new file mode 100644 index 000000000..9dd35573b --- /dev/null +++ b/integrations/matomo/CHANGELOG.md @@ -0,0 +1,9 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +## 0.1.0 + +- Initial release of the Matomo integration for GitBook. Injects a lightweight tracker using the Matomo Tracking API with SPA navigation support and cookie consent awareness. + + diff --git a/integrations/matomo/assets/icon.png b/integrations/matomo/assets/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..7aae07d6a0d1e1a570f7eeb16ffe9ac2134ff0d7 GIT binary patch literal 10752 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�<#{2drUVe4bWMG;&SDnRGJy!V9TGw?e+{~+3hYP!KcC+*y_!-EuqpYsej z!tsM>)}f2I0~^{>ra~6#FLnG6B-N|y>62v)S0Hf*j)WhF~;!6?Km#G`1Xmjy= zQ7dR9sZ~^$VWIK;vuRb~Cg3SsXy=g`pQqcu1`b zN%6Tya$6^CSkT)XSv^J5uw;z)NYr||#TfPwpW+xF=F5f0HNTi`u(HiDa(H1c%*hj? z%$!Z9ldBEe0-^Dtq*k$y(pW)e^C{5VBS&^`kl^e6I%}W+7*41AP8j*SIf!PqBJ`K} zAno@>RFXae!@H`Qb=@C?>IC>jmXTnc*qUVAje-@XUw}FUzB=LJwjMd@uXPeEACnD~ zca1G<=D+uFbTZm(A%)4@N0@CNsh2qksWe+bXtP3#Hh8AE&PU^J(&k=hZ-@x|$#gQg z-?qKbrb7h8e)zkG-xg2M=Ra9IVHT`{d*E){ zN0n@Vhvw(*xA5>tkrTybiC!D_1M;k?8Y%X2$L>7oNIdD0b+^;T6CV#P>*fKm2p+a= z4F3~ND@9HZ&90YYs=`dr8ph^q3qrnVq)iG)5z9}u}Qu*pMay|(Z-LUeS=)oh)^8?{V2V=^6gTP{0kx+uhtQ!3PGqIdpL37;e(wgzR>BV98IVDq{=!Up1J=s;wHGbtE#PhFX0KRN1?xu&s?ew z?#t(VrZ2(8Z9Q~hY#!dZj%&gu@h1!5jP~z>2VsxB$GITOWCOuF}v4 z$E|}q9~{oW>}~_CbQOeP)ev!LkC5Y?9*I0^UyslEOV@>q+Zrd%{tBo)>^luW$Z@@? zhr3OKPjB!BZ}685D+Q{B;dB}+iU#nvRrO7T&2W4L`B{0tiD|znT;A5sr&Fo`v*XcE y7le3&H+X|Lc!M{1gEx4CH+X|Lc!M{19r*vq&DD#6LO81c0000 +>; + +export const handleFetchEvent: FetchPublishScriptEventCallback = async ( + event, + { environment }: MatomoRuntimeContext, +) => { + const serverUrl = environment.siteInstallation?.configuration?.server_url; + const siteId = environment.siteInstallation?.configuration?.site_id; + + if (!serverUrl || !siteId) { + return; + } + + const js = (matomoScript as string) + .replace('', serverUrl.replace(/\/$/, '')) + .replace('', String(siteId)); + + return new Response(js, { + headers: { + 'Content-Type': 'application/javascript', + 'Cache-Control': 'max-age=604800', + }, + }); +}; + +export default createIntegration({ + fetch_published_script: handleFetchEvent, +}); + + diff --git a/integrations/matomo/src/matomoScript.raw.js b/integrations/matomo/src/matomoScript.raw.js new file mode 100644 index 000000000..08f9fbbdb --- /dev/null +++ b/integrations/matomo/src/matomoScript.raw.js @@ -0,0 +1,72 @@ +(function () { + var MATOMO_URL = ''; + var SITE_ID = ''; + var GRANTED_COOKIE = '__gitbook_cookie_granted'; + + function getCookie(name) { + var nameEQ = name + '='; + var ca = document.cookie.split(';'); + for (var i = 0; i < ca.length; i++) { + var c = ca[i]; + while (c.charAt(0) === ' ') c = c.substring(1, c.length); + if (c.indexOf(nameEQ) === 0) return c.substring(nameEQ.length, c.length); + } + return ''; + } + + function sendPageview() { + // Respect cookie consent + if (getCookie(GRANTED_COOKIE) !== 'yes') { + return; + } + + try { + var url = MATOMO_URL + '/matomo.php'; + var params = { + idsite: SITE_ID, + rec: 1, + url: window.location.href, + action_name: document.title, + rand: String(Math.random()).slice(2), + }; + + var query = Object.keys(params) + .map(function (k) { + return encodeURIComponent(k) + '=' + encodeURIComponent(params[k]); + }) + .join('&'); + + var beacon = new Image(); + beacon.src = url + '?' + query; + } catch (e) { + // ignore errors + } + } + + // Track initial view and SPA navigations + var lastPathname; + function trackIfPathChanged() { + if (lastPathname !== window.location.pathname) { + lastPathname = window.location.pathname; + sendPageview(); + } + } + + // Initial + trackIfPathChanged(); + + // Listen to SPA navigation via pushState and popstate + var originalPushState = window.history.pushState; + if (originalPushState) { + window.history.pushState = new Proxy(originalPushState, { + apply: function (target, thisArg, args) { + var result = target.apply(thisArg, args); + trackIfPathChanged(); + return result; + }, + }); + } + window.addEventListener('popstate', trackIfPathChanged); +})(); + + diff --git a/integrations/matomo/tsconfig.json b/integrations/matomo/tsconfig.json new file mode 100644 index 000000000..46c3bd23a --- /dev/null +++ b/integrations/matomo/tsconfig.json @@ -0,0 +1,14 @@ +{ + "compilerOptions": { + "target": "ES2020", + "module": "ESNext", + "moduleResolution": "Bundler", + "jsx": "react-jsx", + "jsxImportSource": "@gitbook/runtime", + "strict": true, + "skipLibCheck": true, + "types": [] + } +} + + From f3105a684241a0ed7f86ab8ee7a0ca8ff6c153e2 Mon Sep 17 00:00:00 2001 From: zairro Date: Fri, 8 Aug 2025 22:15:19 -0700 Subject: [PATCH 2/6] Improve Matomo tracking logic --- integrations/matomo/gitbook-manifest.yaml | 37 +++- integrations/matomo/global.d.ts | 8 + integrations/matomo/src/index.ts | 21 ++- integrations/matomo/src/matomoScript.raw.js | 196 +++++++++++++++++--- 4 files changed, 233 insertions(+), 29 deletions(-) diff --git a/integrations/matomo/gitbook-manifest.yaml b/integrations/matomo/gitbook-manifest.yaml index ca3f0aa9e..a34018bc7 100644 --- a/integrations/matomo/gitbook-manifest.yaml +++ b/integrations/matomo/gitbook-manifest.yaml @@ -9,12 +9,17 @@ script: ./src/index.ts # See https://developer.gitbook.com/integrations/configurations#scopes scopes: - site:script:inject + - site:script:cookies categories: - analytics contentSecurityPolicy: - # We send pageview beacons via an Image to the user-provided Matomo server URL + # Allow loading Matomo JS tracker and sending beacons to user-provided hosts + script-src: | + *; img-src: | *; + connect-src: | + *; summary: | # Overview @@ -41,6 +46,36 @@ configurations: type: string title: Site ID description: The numeric site ID configured in your Matomo instance + load_js_tracker: + type: boolean + title: Load Matomo JS tracker + description: When enabled, loads matomo.js for first‑party cookies, richer tracking and automatic link tracking. When disabled, falls back to lightweight beacons. + default: true + track_referrer: + type: boolean + title: Track Referrer + description: Include document.referrer for pageviews/events (recommended) + default: true + track_outbound_clicks: + type: boolean + title: Track outbound link clicks + description: Record clicks on links pointing to external domains + default: true + click_selectors: + type: string + title: CSS selectors to track as events + description: Comma‑separated CSS selectors to track clicks as events. Example: a[href*="try"],button.book-demo + default: '' + goal_mappings_json: + type: string + title: Goal mappings (JSON) + description: Optional JSON object mapping CSS selectors to Matomo Goal IDs. Example: {"a.try-it": 1, "a.book-demo": 2} + default: '' + user_id_cookie: + type: string + title: User ID cookie name + description: Optional cookie name to read and set as Matomo user ID (for retention/cohort analysis) + default: '' required: - server_url - site_id diff --git a/integrations/matomo/global.d.ts b/integrations/matomo/global.d.ts index 1470502ab..de14eb7aa 100644 --- a/integrations/matomo/global.d.ts +++ b/integrations/matomo/global.d.ts @@ -3,4 +3,12 @@ declare module '*.raw.js' { export default content; } +// Allow local typechecking without installed workspace deps +declare module '@gitbook/runtime' { + export type FetchPublishScriptEventCallback = any; + export type RuntimeContext = any; + export type RuntimeEnvironment = any; + export function createIntegration(...args: any[]): any; +} + diff --git a/integrations/matomo/src/index.ts b/integrations/matomo/src/index.ts index f26a27276..5c37eb8d8 100644 --- a/integrations/matomo/src/index.ts +++ b/integrations/matomo/src/index.ts @@ -13,16 +13,23 @@ type MatomoRuntimeContext = RuntimeContext< { server_url?: string; site_id?: string; + load_js_tracker?: boolean; + track_referrer?: boolean; + track_outbound_clicks?: boolean; + click_selectors?: string; + goal_mappings_json?: string; + user_id_cookie?: string; } > >; export const handleFetchEvent: FetchPublishScriptEventCallback = async ( - event, + event: any, { environment }: MatomoRuntimeContext, ) => { - const serverUrl = environment.siteInstallation?.configuration?.server_url; - const siteId = environment.siteInstallation?.configuration?.site_id; + const cfg = environment.siteInstallation?.configuration || {}; + const serverUrl = cfg.server_url; + const siteId = cfg.site_id; if (!serverUrl || !siteId) { return; @@ -30,7 +37,13 @@ export const handleFetchEvent: FetchPublishScriptEventCallback = async ( const js = (matomoScript as string) .replace('', serverUrl.replace(/\/$/, '')) - .replace('', String(siteId)); + .replace('', String(siteId)) + .replace('', String(cfg.load_js_tracker ?? true)) + .replace('', String(cfg.track_referrer ?? true)) + .replace('', String(cfg.track_outbound_clicks ?? true)) + .replace('', String(cfg.click_selectors ?? '')) + .replace('', String(cfg.goal_mappings_json ?? '')) + .replace('', String(cfg.user_id_cookie ?? '')); return new Response(js, { headers: { diff --git a/integrations/matomo/src/matomoScript.raw.js b/integrations/matomo/src/matomoScript.raw.js index 08f9fbbdb..d35642964 100644 --- a/integrations/matomo/src/matomoScript.raw.js +++ b/integrations/matomo/src/matomoScript.raw.js @@ -1,6 +1,12 @@ (function () { var MATOMO_URL = ''; var SITE_ID = ''; + var LOAD_JS_TRACKER = '' === 'true'; + var TRACK_REFERRER = '' === 'true'; + var TRACK_OUTBOUND = '' === 'true'; + var CLICK_SELECTORS = ''; + var GOAL_MAPPINGS_JSON = ''; + var USER_ID_COOKIE = ''; var GRANTED_COOKIE = '__gitbook_cookie_granted'; function getCookie(name) { @@ -14,48 +20,190 @@ return ''; } - function sendPageview() { - // Respect cookie consent - if (getCookie(GRANTED_COOKIE) !== 'yes') { - return; - } + function hasConsent() { + return getCookie(GRANTED_COOKIE) === 'yes'; + } - try { - var url = MATOMO_URL + '/matomo.php'; - var params = { - idsite: SITE_ID, - rec: 1, - url: window.location.href, - action_name: document.title, - rand: String(Math.random()).slice(2), - }; - - var query = Object.keys(params) + function urlParams(baseUrl, params) { + return ( + baseUrl + + '?' + + Object.keys(params) + .filter(function (k) { + return params[k] !== undefined && params[k] !== '' && params[k] !== null; + }) .map(function (k) { return encodeURIComponent(k) + '=' + encodeURIComponent(params[k]); }) - .join('&'); + .join('&') + ); + } + function sendBeacon(params) { + if (!hasConsent()) return; + try { + var url = MATOMO_URL + '/matomo.php'; var beacon = new Image(); - beacon.src = url + '?' + query; + beacon.src = urlParams(url, params); + } catch (e) {} + } + + function getReferrer() { + return TRACK_REFERRER ? document.referrer || '' : ''; + } + + function getUserId() { + if (!USER_ID_COOKIE) return ''; + return getCookie(USER_ID_COOKIE) || ''; + } + + function trackPageview() { + if (LOAD_JS_TRACKER && window._paq) { + window._paq.push(['setReferrerUrl', getReferrer()]); + var uid = getUserId(); + if (uid) window._paq.push(['setUserId', uid]); + window._paq.push(['setDocumentTitle', document.title]); + window._paq.push(['setCustomUrl', window.location.href]); + window._paq.push(['trackPageView']); + return; + } + // Beacon fallback + sendBeacon({ + idsite: SITE_ID, + rec: 1, + url: window.location.href, + action_name: document.title, + urlref: getReferrer(), + uid: getUserId(), + rand: String(Math.random()).slice(2), + }); + } + + function trackEvent(category, action, name, value) { + if (LOAD_JS_TRACKER && window._paq) { + var uid = getUserId(); + if (uid) window._paq.push(['setUserId', uid]); + if (TRACK_REFERRER) window._paq.push(['setReferrerUrl', getReferrer()]); + window._paq.push(['trackEvent', category, action, name, value]); + return; + } + sendBeacon({ + idsite: SITE_ID, + rec: 1, + e_c: category, + e_a: action, + e_n: name, + e_v: value, + url: window.location.href, + urlref: getReferrer(), + uid: getUserId(), + rand: String(Math.random()).slice(2), + }); + } + + function bindClicks() { + // Track configured selectors + if (CLICK_SELECTORS && CLICK_SELECTORS.trim()) { + try { + var selectors = CLICK_SELECTORS.split(','); + selectors.forEach(function (sel) { + sel = sel.trim(); + if (!sel) return; + document.addEventListener('click', function (e) { + var target = e.target; + if (!(target instanceof Element)) return; + var el = target.closest(sel); + if (!el) return; + var label = (el.textContent || el.getAttribute('aria-label') || '').trim(); + var href = el.getAttribute && el.getAttribute('href'); + trackEvent('Click', 'click', label || href || sel); + }); + }); + } catch (e) {} + } + + // Track outbound links if enabled + if (TRACK_OUTBOUND) { + document.addEventListener('click', function (e) { + var target = e.target; + if (!(target instanceof Element)) return; + var link = target.closest('a[href]'); + if (!link) return; + try { + var url = new URL(link.href, window.location.href); + if (url.host && url.host !== window.location.host) { + trackEvent('Outbound', 'click', url.href); + } + } catch (err) {} + }); + } + } + + function applyGoals() { + if (!GOAL_MAPPINGS_JSON) return; + var mappings; + try { + mappings = JSON.parse(GOAL_MAPPINGS_JSON); } catch (e) { - // ignore errors + return; } + if (!mappings || typeof mappings !== 'object') return; + document.addEventListener('click', function (e) { + var target = e.target; + if (!(target instanceof Element)) return; + for (var sel in mappings) { + var goalId = mappings[sel]; + if (!goalId) continue; + var el = target.closest(sel); + if (el) { + if (LOAD_JS_TRACKER && window._paq) { + window._paq.push(['trackGoal', Number(goalId)]); + } else { + sendBeacon({ idsite: SITE_ID, rec: 1, idgoal: Number(goalId), rand: String(Math.random()).slice(2) }); + } + break; + } + } + }); + } + + function loadJS() { + if (!LOAD_JS_TRACKER) return; + if (!hasConsent()) return; + var _paq = (window._paq = window._paq || []); + var uid = getUserId(); + if (uid) _paq.push(['setUserId', uid]); + if (TRACK_REFERRER) _paq.push(['setReferrerUrl', getReferrer()]); + _paq.push(['enableLinkTracking']); + _paq.push(['setTrackerUrl', MATOMO_URL + '/matomo.php']); + _paq.push(['setSiteId', SITE_ID]); + + var g = document.createElement('script'); + g.async = true; + g.src = MATOMO_URL + '/matomo.js'; + g.onload = function () { + // Track initial after JS ready + trackPageview(); + }; + var s = document.getElementsByTagName('script')[0]; + s.parentNode.insertBefore(g, s); } - // Track initial view and SPA navigations + // Detect SPA navigation and track var lastPathname; function trackIfPathChanged() { if (lastPathname !== window.location.pathname) { lastPathname = window.location.pathname; - sendPageview(); + trackPageview(); } } - // Initial - trackIfPathChanged(); + // Init + bindClicks(); + applyGoals(); + loadJS(); + trackPageview(); - // Listen to SPA navigation via pushState and popstate var originalPushState = window.history.pushState; if (originalPushState) { window.history.pushState = new Proxy(originalPushState, { From a2ca143ae99413331c15072ef5411c4462d87d72 Mon Sep 17 00:00:00 2001 From: zairro Date: Tue, 19 Aug 2025 10:53:29 -0700 Subject: [PATCH 3/6] Applied reviewer feedback for Matomo integration --- bun.lock | 20 ++++++++++++--- integrations/matomo/assets/icon.png | Bin 10752 -> 11841 bytes integrations/matomo/assets/preview.png | Bin 0 -> 39806 bytes integrations/matomo/gitbook-manifest.yaml | 29 ++++++++++++++-------- 4 files changed, 36 insertions(+), 13 deletions(-) create mode 100644 integrations/matomo/assets/preview.png diff --git a/bun.lock b/bun.lock index 33d9ee855..45f43f711 100644 --- a/bun.lock +++ b/bun.lock @@ -90,7 +90,7 @@ }, "integrations/figma": { "name": "@gitbook/integration-figma", - "version": "0.2.3", + "version": "0.3.0", "dependencies": { "@gitbook/runtime": "*", }, @@ -355,6 +355,18 @@ "esbuild": "^0.15.7", }, }, + "integrations/matomo": { + "name": "@gitbook/integration-matomo", + "version": "0.1.0", + "dependencies": { + "@gitbook/api": "*", + "@gitbook/runtime": "*", + }, + "devDependencies": { + "@gitbook/cli": "workspace:*", + "@gitbook/tsconfig": "workspace:*", + }, + }, "integrations/mermaid": { "name": "@gitbook/integration-mermaid", "version": "0.4.0", @@ -493,7 +505,7 @@ }, "integrations/slack": { "name": "@gitbook/integration-slack", - "version": "2.1.0", + "version": "2.2.0", "dependencies": { "@gitbook/api": "*", "@gitbook/runtime": "*", @@ -614,7 +626,7 @@ }, "packages/api": { "name": "@gitbook/api", - "version": "0.131.0", + "version": "0.133.0", "dependencies": { "event-iterator": "^2.0.0", "eventsource-parser": "^3.0.0", @@ -993,6 +1005,8 @@ "@gitbook/integration-marketo": ["@gitbook/integration-marketo@workspace:integrations/marketo"], + "@gitbook/integration-matomo": ["@gitbook/integration-matomo@workspace:integrations/matomo"], + "@gitbook/integration-mermaid": ["@gitbook/integration-mermaid@workspace:integrations/mermaid"], "@gitbook/integration-mixpanel": ["@gitbook/integration-mixpanel@workspace:integrations/mixpanel"], diff --git a/integrations/matomo/assets/icon.png b/integrations/matomo/assets/icon.png index 7aae07d6a0d1e1a570f7eeb16ffe9ac2134ff0d7..6c22d37094e6d4e5d3737366aa3afd80f9b12355 100644 GIT binary patch literal 11841 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�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 literal 0 HcmV?d00001 diff --git a/integrations/matomo/gitbook-manifest.yaml b/integrations/matomo/gitbook-manifest.yaml index a34018bc7..f160137c2 100644 --- a/integrations/matomo/gitbook-manifest.yaml +++ b/integrations/matomo/gitbook-manifest.yaml @@ -1,9 +1,11 @@ name: matomo title: Matomo icon: ./assets/icon.png -organization: gitbook +previewImages: + - ./assets/preview.png +organization: 2zoWGxtV7bjhbwBdjGPS description: Receive GitBook traffic insights directly in your Matomo dashboard. -visibility: public +visibility: private script: ./src/index.ts # The following scope(s) are available only to GitBook Staff # See https://developer.gitbook.com/integrations/configurations#scopes @@ -41,7 +43,8 @@ configurations: server_url: type: string title: Matomo Server URL - description: Your Matomo server base URL. Examples: https://your-site.matomo.cloud or https://matomo.example.com + description: | + Your Matomo server base URL. Examples: https://your-site.matomo.cloud or https://matomo.example.com site_id: type: string title: Site ID @@ -49,32 +52,38 @@ configurations: load_js_tracker: type: boolean title: Load Matomo JS tracker - description: When enabled, loads matomo.js for first‑party cookies, richer tracking and automatic link tracking. When disabled, falls back to lightweight beacons. + description: | + When enabled, loads matomo.js for first‑party cookies and richer tracking. default: true track_referrer: type: boolean title: Track Referrer - description: Include document.referrer for pageviews/events (recommended) + description: | + Include document.referrer for pageviews/events (recommended) default: true track_outbound_clicks: type: boolean title: Track outbound link clicks - description: Record clicks on links pointing to external domains + description: | + Record clicks on links pointing to external domains default: true click_selectors: type: string - title: CSS selectors to track as events - description: Comma‑separated CSS selectors to track clicks as events. Example: a[href*="try"],button.book-demo + title: CSS selectors to track + description: | + Comma‑separated CSS selectors to track clicks as events. Example: a[href*="try"],button.book-demo default: '' goal_mappings_json: type: string title: Goal mappings (JSON) - description: Optional JSON object mapping CSS selectors to Matomo Goal IDs. Example: {"a.try-it": 1, "a.book-demo": 2} + description: | + Optional JSON object mapping CSS selectors to Matomo Goal IDs. default: '' user_id_cookie: type: string title: User ID cookie name - description: Optional cookie name to read and set as Matomo user ID (for retention/cohort analysis) + description: | + Optional cookie name to read and set as Matomo user ID (for retention/cohort analysis) default: '' required: - server_url From c1a360d63011f4cddbd10ed42b083b3b0b305f3a Mon Sep 17 00:00:00 2001 From: zairro Date: Tue, 26 Aug 2025 12:08:17 -0700 Subject: [PATCH 4/6] matomo: crop to icon-only square and set visibility public; publish-ready --- integrations/matomo/assets/icon.png | Bin 11841 -> 3955 bytes integrations/matomo/gitbook-manifest.yaml | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/matomo/assets/icon.png b/integrations/matomo/assets/icon.png index 6c22d37094e6d4e5d3737366aa3afd80f9b12355..114d33800dfbfcfdbb1537c50c96f6c07714c076 100644 GIT binary patch literal 3955 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 N002ovPDHLkV1ktCf;RvF literal 11841 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 Date: Tue, 26 Aug 2025 12:09:52 -0700 Subject: [PATCH 5/6] matomo: update CHANGELOG for 0.1.1 (icon-only square, preview, public) --- integrations/matomo/CHANGELOG.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/integrations/matomo/CHANGELOG.md b/integrations/matomo/CHANGELOG.md index 9dd35573b..22c317f74 100644 --- a/integrations/matomo/CHANGELOG.md +++ b/integrations/matomo/CHANGELOG.md @@ -7,3 +7,11 @@ All notable changes to this project will be documented in this file. - Initial release of the Matomo integration for GitBook. Injects a lightweight tracker using the Matomo Tracking API with SPA navigation support and cookie consent awareness. +## 0.1.1 + +- Update icon to square, icon-only mark for better marketplace display +- Add preview image +- Switch visibility to `public` for marketplace readiness +- Improve manifest descriptions and validation to meet CLI limits + + From f5ae7a87b6ff56e785bb8418d63701dc361811d3 Mon Sep 17 00:00:00 2001 From: Addison Date: Wed, 27 Aug 2025 18:20:22 +0800 Subject: [PATCH 6/6] Fix formatting --- bun.lock | 10 +++++----- integrations/matomo/CHANGELOG.md | 3 --- integrations/matomo/gitbook-manifest.yaml | 2 -- integrations/matomo/global.d.ts | 2 -- integrations/matomo/package.json | 2 -- integrations/matomo/src/index.ts | 2 -- integrations/matomo/src/matomoScript.raw.js | 9 ++++++--- integrations/matomo/tsconfig.json | 2 -- 8 files changed, 11 insertions(+), 21 deletions(-) diff --git a/bun.lock b/bun.lock index c0700c41c..fdc19baf2 100644 --- a/bun.lock +++ b/bun.lock @@ -16,7 +16,7 @@ }, "integrations/ahrefs": { "name": "@gitbook/integration-ahrefs", - "version": "0.1.0", + "version": "0.1.1", "dependencies": { "@gitbook/api": "*", "@gitbook/runtime": "*", @@ -395,7 +395,7 @@ }, "integrations/mermaid": { "name": "@gitbook/integration-mermaid", - "version": "0.4.0", + "version": "0.4.2", "dependencies": { "@gitbook/api": "*", "@gitbook/runtime": "*", @@ -445,7 +445,7 @@ }, "integrations/plausible": { "name": "@gitbook/integration-plausible", - "version": "0.7.0", + "version": "0.8.0", "dependencies": { "@gitbook/api": "*", "@gitbook/runtime": "*", @@ -519,7 +519,7 @@ }, "integrations/segment": { "name": "@gitbook/integration-segment", - "version": "2.1.3", + "version": "2.3.0", "dependencies": { "@gitbook/api": "*", "@gitbook/runtime": "*", @@ -664,7 +664,7 @@ }, "packages/api": { "name": "@gitbook/api", - "version": "0.135.0", + "version": "0.136.0", "dependencies": { "event-iterator": "^2.0.0", "eventsource-parser": "^3.0.0", diff --git a/integrations/matomo/CHANGELOG.md b/integrations/matomo/CHANGELOG.md index 22c317f74..fdda3b53c 100644 --- a/integrations/matomo/CHANGELOG.md +++ b/integrations/matomo/CHANGELOG.md @@ -6,12 +6,9 @@ All notable changes to this project will be documented in this file. - Initial release of the Matomo integration for GitBook. Injects a lightweight tracker using the Matomo Tracking API with SPA navigation support and cookie consent awareness. - ## 0.1.1 - Update icon to square, icon-only mark for better marketplace display - Add preview image - Switch visibility to `public` for marketplace readiness - Improve manifest descriptions and validation to meet CLI limits - - diff --git a/integrations/matomo/gitbook-manifest.yaml b/integrations/matomo/gitbook-manifest.yaml index 7c6493558..6e0646693 100644 --- a/integrations/matomo/gitbook-manifest.yaml +++ b/integrations/matomo/gitbook-manifest.yaml @@ -89,5 +89,3 @@ configurations: - server_url - site_id target: site - - diff --git a/integrations/matomo/global.d.ts b/integrations/matomo/global.d.ts index de14eb7aa..07471766a 100644 --- a/integrations/matomo/global.d.ts +++ b/integrations/matomo/global.d.ts @@ -10,5 +10,3 @@ declare module '@gitbook/runtime' { export type RuntimeEnvironment = any; export function createIntegration(...args: any[]): any; } - - diff --git a/integrations/matomo/package.json b/integrations/matomo/package.json index d2f9cd473..f39f284a0 100644 --- a/integrations/matomo/package.json +++ b/integrations/matomo/package.json @@ -17,5 +17,3 @@ "publish-integrations": "gitbook publish ." } } - - diff --git a/integrations/matomo/src/index.ts b/integrations/matomo/src/index.ts index 5c37eb8d8..eee4382ac 100644 --- a/integrations/matomo/src/index.ts +++ b/integrations/matomo/src/index.ts @@ -56,5 +56,3 @@ export const handleFetchEvent: FetchPublishScriptEventCallback = async ( export default createIntegration({ fetch_published_script: handleFetchEvent, }); - - diff --git a/integrations/matomo/src/matomoScript.raw.js b/integrations/matomo/src/matomoScript.raw.js index d35642964..3990c5d9d 100644 --- a/integrations/matomo/src/matomoScript.raw.js +++ b/integrations/matomo/src/matomoScript.raw.js @@ -159,7 +159,12 @@ if (LOAD_JS_TRACKER && window._paq) { window._paq.push(['trackGoal', Number(goalId)]); } else { - sendBeacon({ idsite: SITE_ID, rec: 1, idgoal: Number(goalId), rand: String(Math.random()).slice(2) }); + sendBeacon({ + idsite: SITE_ID, + rec: 1, + idgoal: Number(goalId), + rand: String(Math.random()).slice(2), + }); } break; } @@ -216,5 +221,3 @@ } window.addEventListener('popstate', trackIfPathChanged); })(); - - diff --git a/integrations/matomo/tsconfig.json b/integrations/matomo/tsconfig.json index 46c3bd23a..483a24a75 100644 --- a/integrations/matomo/tsconfig.json +++ b/integrations/matomo/tsconfig.json @@ -10,5 +10,3 @@ "types": [] } } - -