@power-seo/tracking 1.0.0

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/dist/index.cjs ADDED
@@ -0,0 +1,379 @@
1
+ 'use strict';
2
+
3
+ // src/consent.ts
4
+ var DEFAULT_STATE = {
5
+ necessary: true,
6
+ analytics: false,
7
+ marketing: false,
8
+ preferences: false
9
+ };
10
+ function createConsentManager(initial) {
11
+ const state = {
12
+ ...DEFAULT_STATE,
13
+ ...initial,
14
+ necessary: true
15
+ // necessary cannot be overridden
16
+ };
17
+ const listeners = /* @__PURE__ */ new Set();
18
+ function notify() {
19
+ for (const cb of listeners) {
20
+ cb({ ...state });
21
+ }
22
+ }
23
+ return {
24
+ getState() {
25
+ return { ...state };
26
+ },
27
+ grant(category) {
28
+ if (state[category]) return;
29
+ state[category] = true;
30
+ notify();
31
+ },
32
+ revoke(category) {
33
+ if (category === "necessary") return;
34
+ if (!state[category]) return;
35
+ state[category] = false;
36
+ notify();
37
+ },
38
+ grantAll() {
39
+ state.analytics = true;
40
+ state.marketing = true;
41
+ state.preferences = true;
42
+ notify();
43
+ },
44
+ revokeAll() {
45
+ state.analytics = false;
46
+ state.marketing = false;
47
+ state.preferences = false;
48
+ notify();
49
+ },
50
+ isGranted(category) {
51
+ return state[category];
52
+ },
53
+ onChange(callback) {
54
+ listeners.add(callback);
55
+ return () => {
56
+ listeners.delete(callback);
57
+ };
58
+ }
59
+ };
60
+ }
61
+
62
+ // src/scripts/ga4.ts
63
+ function buildGA4Script(config) {
64
+ const { measurementId, consentModeV2 = true, anonymizeIp = true, sendPageView = true } = config;
65
+ const scripts = [];
66
+ if (consentModeV2) {
67
+ scripts.push({
68
+ id: `ga4-consent-${measurementId}`,
69
+ innerHTML: `window.dataLayer=window.dataLayer||[];function gtag(){dataLayer.push(arguments);}gtag('consent','default',{'analytics_storage':'denied','ad_storage':'denied','ad_user_data':'denied','ad_personalization':'denied'});`,
70
+ consentCategory: "necessary",
71
+ shouldLoad: () => true
72
+ });
73
+ }
74
+ scripts.push({
75
+ id: `ga4-gtag-${measurementId}`,
76
+ src: `https://www.googletagmanager.com/gtag/js?id=${measurementId}`,
77
+ async: true,
78
+ consentCategory: "analytics",
79
+ shouldLoad: (consent) => consent.analytics
80
+ });
81
+ const configParts = [
82
+ `window.dataLayer=window.dataLayer||[];function gtag(){dataLayer.push(arguments);}gtag('js',new Date());`,
83
+ `gtag('config','${measurementId}',{${anonymizeIp ? "'anonymize_ip':true," : ""}${!sendPageView ? "'send_page_view':false" : ""}});`
84
+ ];
85
+ if (consentModeV2) {
86
+ configParts.push(
87
+ `gtag('consent','update',{'analytics_storage':'granted'});`
88
+ );
89
+ }
90
+ scripts.push({
91
+ id: `ga4-config-${measurementId}`,
92
+ innerHTML: configParts.join(""),
93
+ consentCategory: "analytics",
94
+ shouldLoad: (consent) => consent.analytics
95
+ });
96
+ return scripts;
97
+ }
98
+
99
+ // src/scripts/clarity.ts
100
+ function buildClarityScript(config) {
101
+ const { projectId } = config;
102
+ return {
103
+ id: `clarity-${projectId}`,
104
+ innerHTML: `(function(c,l,a,r,i,t,y){c[a]=c[a]||function(){(c[a].q=c[a].q||[]).push(arguments)};t=l.createElement(r);t.async=1;t.src="https://www.clarity.ms/tag/"+i;y=l.getElementsByTagName(r)[0];y.parentNode.insertBefore(t,y);})(window,document,"clarity","script","${projectId}");`,
105
+ consentCategory: "analytics",
106
+ shouldLoad: (consent) => consent.analytics
107
+ };
108
+ }
109
+
110
+ // src/scripts/posthog.ts
111
+ function buildPostHogScript(config) {
112
+ const { apiKey, host = "https://us.i.posthog.com" } = config;
113
+ return {
114
+ id: `posthog-${apiKey}`,
115
+ innerHTML: `!function(t,e){var o,n,p,r;e.__SV||(window.posthog=e,e._i=[],e.init=function(i,s,a){function g(t,e){var o=e.split(".");2==o.length&&(t=t[o[0]],e=o[1]),t[e]=function(){t.push([e].concat(Array.prototype.slice.call(arguments,0)))}}(p=t.createElement("script")).type="text/javascript",p.async=!0,p.src=s.api_host+"/static/array.js",(r=t.getElementsByTagName("script")[0]).parentNode.insertBefore(p,r);var u=e;for(void 0!==a?u=e[a]=[]:a="posthog",u.people=u.people||[],u.toString=function(t){var e="posthog";return"posthog"!==a&&(e+="."+a),t||(e+=" (stub)"),e},u.people.toString=function(){return u.toString(1)+".people (stub)"},o="init capture register register_once register_for_session unregister opt_out_capturing has_opted_out_capturing opt_in_capturing reset isFeatureEnabled getFeatureFlag getFeatureFlagPayload reloadFeatureFlags group updateEarlyAccessFeatureEnrollment getEarlyAccessFeatures getActiveMatchingSurveys getSurveys onFeatureFlags".split(" "),n=0;n<o.length;n++)g(u,o[n]);e._i.push([i,s,a])},e.__SV=1)}(document,window.posthog||[]);posthog.init('${apiKey}',{api_host:'${host}',person_profiles:'identified_only'});`,
116
+ consentCategory: "analytics",
117
+ shouldLoad: (consent) => consent.analytics
118
+ };
119
+ }
120
+
121
+ // src/scripts/plausible.ts
122
+ function buildPlausibleScript(config) {
123
+ const { domain, selfHostedUrl } = config;
124
+ const scriptSrc = selfHostedUrl ? `${selfHostedUrl.replace(/\/$/, "")}/js/script.js` : "https://plausible.io/js/script.js";
125
+ return {
126
+ id: `plausible-${domain}`,
127
+ src: scriptSrc,
128
+ defer: true,
129
+ consentCategory: "analytics",
130
+ attributes: {
131
+ "data-domain": domain
132
+ },
133
+ shouldLoad: (consent) => consent.analytics
134
+ };
135
+ }
136
+
137
+ // src/scripts/fathom.ts
138
+ function buildFathomScript(config) {
139
+ const { siteId } = config;
140
+ return {
141
+ id: `fathom-${siteId}`,
142
+ src: "https://cdn.usefathom.com/script.js",
143
+ defer: true,
144
+ consentCategory: "analytics",
145
+ attributes: {
146
+ "data-site": siteId
147
+ },
148
+ shouldLoad: (consent) => consent.analytics
149
+ };
150
+ }
151
+
152
+ // src/api/ga4.ts
153
+ var GA4_BASE = "https://analyticsdata.googleapis.com/v1beta";
154
+ function createGA4Client(accessToken) {
155
+ async function request(url, body) {
156
+ const response = await globalThis.fetch(url, {
157
+ method: body ? "POST" : "GET",
158
+ headers: {
159
+ Authorization: `Bearer ${accessToken}`,
160
+ "Content-Type": "application/json"
161
+ },
162
+ body: body ? JSON.stringify(body) : void 0
163
+ });
164
+ if (!response.ok) {
165
+ const text = await response.text();
166
+ throw new Error(`GA4 API error: ${response.status} ${text}`);
167
+ }
168
+ return await response.json();
169
+ }
170
+ return {
171
+ async queryReport(propertyId, req) {
172
+ const body = {
173
+ dateRanges: [{ startDate: req.startDate, endDate: req.endDate }],
174
+ metrics: req.metrics.map((m) => ({ name: m })),
175
+ dimensions: (req.dimensions ?? []).map((d) => ({ name: d })),
176
+ limit: req.limit ?? 1e3
177
+ };
178
+ const raw = await request(`${GA4_BASE}/properties/${propertyId}:runReport`, body);
179
+ const rows = (raw.rows ?? []).map((r) => ({
180
+ dimensions: (r.dimensionValues ?? []).map((d) => d.value),
181
+ metrics: (r.metricValues ?? []).map((m) => Number(m.value))
182
+ }));
183
+ return {
184
+ rows,
185
+ rowCount: raw.rowCount ?? rows.length,
186
+ metadata: raw.metricHeaders ? { metricHeaders: raw.metricHeaders } : void 0
187
+ };
188
+ },
189
+ async getRealtimeReport(propertyId, metrics) {
190
+ const body = {
191
+ metrics: metrics.map((m) => ({ name: m }))
192
+ };
193
+ const raw = await request(`${GA4_BASE}/properties/${propertyId}:runRealtimeReport`, body);
194
+ const rows = (raw.rows ?? []).map((r) => ({
195
+ dimensions: (r.dimensionValues ?? []).map((d) => d.value),
196
+ metrics: (r.metricValues ?? []).map((m) => Number(m.value))
197
+ }));
198
+ return { rows, rowCount: raw.rowCount ?? rows.length };
199
+ },
200
+ async getMetadata(propertyId) {
201
+ const raw = await request(`${GA4_BASE}/properties/${propertyId}/metadata`);
202
+ return {
203
+ dimensions: raw.dimensions ?? [],
204
+ metrics: raw.metrics ?? []
205
+ };
206
+ }
207
+ };
208
+ }
209
+
210
+ // src/api/clarity.ts
211
+ var CLARITY_BASE = "https://www.clarity.ms/api/v1";
212
+ function createClarityClient(apiKey) {
213
+ async function request(path) {
214
+ const response = await globalThis.fetch(`${CLARITY_BASE}${path}`, {
215
+ headers: {
216
+ Authorization: `Bearer ${apiKey}`,
217
+ "Content-Type": "application/json"
218
+ }
219
+ });
220
+ if (!response.ok) {
221
+ const text = await response.text();
222
+ throw new Error(`Clarity API error: ${response.status} ${text}`);
223
+ }
224
+ return await response.json();
225
+ }
226
+ return {
227
+ async getProjects() {
228
+ return request("/projects");
229
+ },
230
+ async getInsights(projectId) {
231
+ return request(`/projects/${projectId}/insights`);
232
+ },
233
+ async getHeatmapData(projectId, url) {
234
+ const encodedUrl = encodeURIComponent(url);
235
+ return request(
236
+ `/projects/${projectId}/heatmaps?url=${encodedUrl}`
237
+ );
238
+ }
239
+ };
240
+ }
241
+
242
+ // src/api/posthog.ts
243
+ var POSTHOG_BASE = "https://us.posthog.com/api";
244
+ function createPostHogClient(apiKey, host) {
245
+ const baseUrl = host ? `${host.replace(/\/$/, "")}/api` : POSTHOG_BASE;
246
+ async function request(path, body) {
247
+ const response = await globalThis.fetch(`${baseUrl}${path}`, {
248
+ method: body ? "POST" : "GET",
249
+ headers: {
250
+ Authorization: `Bearer ${apiKey}`,
251
+ "Content-Type": "application/json"
252
+ },
253
+ body: body ? JSON.stringify(body) : void 0
254
+ });
255
+ if (!response.ok) {
256
+ const text = await response.text();
257
+ throw new Error(`PostHog API error: ${response.status} ${text}`);
258
+ }
259
+ return await response.json();
260
+ }
261
+ return {
262
+ async queryEvents(projectId, event, limit = 100) {
263
+ const raw = await request(
264
+ `/projects/${projectId}/events?event=${encodeURIComponent(event)}&limit=${limit}`
265
+ );
266
+ return raw.results ?? [];
267
+ },
268
+ async getTrends(projectId, events, days = 7) {
269
+ const body = {
270
+ events: events.map((e) => ({ id: e, type: "events" })),
271
+ date_from: `-${days}d`
272
+ };
273
+ const raw = await request(
274
+ `/projects/${projectId}/insights/trend`,
275
+ body
276
+ );
277
+ return raw.result ?? [];
278
+ },
279
+ async getFunnels(projectId, steps) {
280
+ const body = {
281
+ events: steps.map((s) => ({ id: s, type: "events" }))
282
+ };
283
+ const raw = await request(
284
+ `/projects/${projectId}/insights/funnel`,
285
+ body
286
+ );
287
+ return raw.result ?? [];
288
+ }
289
+ };
290
+ }
291
+
292
+ // src/api/plausible.ts
293
+ var PLAUSIBLE_BASE = "https://plausible.io/api/v1";
294
+ function createPlausibleClient(apiKey, selfHostedUrl) {
295
+ const baseUrl = selfHostedUrl ? `${selfHostedUrl.replace(/\/$/, "")}/api/v1` : PLAUSIBLE_BASE;
296
+ async function request(path) {
297
+ const response = await globalThis.fetch(`${baseUrl}${path}`, {
298
+ headers: {
299
+ Authorization: `Bearer ${apiKey}`,
300
+ "Content-Type": "application/json"
301
+ }
302
+ });
303
+ if (!response.ok) {
304
+ const text = await response.text();
305
+ throw new Error(`Plausible API error: ${response.status} ${text}`);
306
+ }
307
+ return await response.json();
308
+ }
309
+ return {
310
+ async getTimeseries(siteId, period = "30d") {
311
+ const raw = await request(
312
+ `/stats/timeseries?site_id=${encodeURIComponent(siteId)}&period=${period}`
313
+ );
314
+ return raw.results ?? [];
315
+ },
316
+ async getBreakdown(siteId, property, period = "30d") {
317
+ const raw = await request(
318
+ `/stats/breakdown?site_id=${encodeURIComponent(siteId)}&property=${encodeURIComponent(property)}&period=${period}`
319
+ );
320
+ return raw.results ?? [];
321
+ },
322
+ async getAggregate(siteId, period = "30d") {
323
+ const raw = await request(
324
+ `/stats/aggregate?site_id=${encodeURIComponent(siteId)}&period=${period}&metrics=visitors,pageviews,bounce_rate,visit_duration,events`
325
+ );
326
+ return raw.results;
327
+ }
328
+ };
329
+ }
330
+
331
+ // src/api/fathom.ts
332
+ var FATHOM_BASE = "https://api.usefathom.com/v1";
333
+ function createFathomClient(apiKey) {
334
+ async function request(path) {
335
+ const response = await globalThis.fetch(`${FATHOM_BASE}${path}`, {
336
+ headers: {
337
+ Authorization: `Bearer ${apiKey}`,
338
+ "Content-Type": "application/json"
339
+ }
340
+ });
341
+ if (!response.ok) {
342
+ const text = await response.text();
343
+ throw new Error(`Fathom API error: ${response.status} ${text}`);
344
+ }
345
+ return await response.json();
346
+ }
347
+ return {
348
+ async getSites() {
349
+ const raw = await request("/sites");
350
+ return raw.data ?? [];
351
+ },
352
+ async getPageviews(siteId, period = "30d") {
353
+ const raw = await request(
354
+ `/sites/${siteId}/pages?period=${period}`
355
+ );
356
+ return raw.data ?? [];
357
+ },
358
+ async getReferrers(siteId, period = "30d") {
359
+ const raw = await request(
360
+ `/sites/${siteId}/referrers?period=${period}`
361
+ );
362
+ return raw.data ?? [];
363
+ }
364
+ };
365
+ }
366
+
367
+ exports.buildClarityScript = buildClarityScript;
368
+ exports.buildFathomScript = buildFathomScript;
369
+ exports.buildGA4Script = buildGA4Script;
370
+ exports.buildPlausibleScript = buildPlausibleScript;
371
+ exports.buildPostHogScript = buildPostHogScript;
372
+ exports.createClarityClient = createClarityClient;
373
+ exports.createConsentManager = createConsentManager;
374
+ exports.createFathomClient = createFathomClient;
375
+ exports.createGA4Client = createGA4Client;
376
+ exports.createPlausibleClient = createPlausibleClient;
377
+ exports.createPostHogClient = createPostHogClient;
378
+ //# sourceMappingURL=index.cjs.map
379
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/consent.ts","../src/scripts/ga4.ts","../src/scripts/clarity.ts","../src/scripts/posthog.ts","../src/scripts/plausible.ts","../src/scripts/fathom.ts","../src/api/ga4.ts","../src/api/clarity.ts","../src/api/posthog.ts","../src/api/plausible.ts","../src/api/fathom.ts"],"names":[],"mappings":"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","file":"index.cjs","sourcesContent":["// ============================================================================\r\n// @power-seo/tracking — Consent Manager\r\n// ============================================================================\r\n\r\nimport type { ConsentState, ConsentCategory, ConsentManager, ConsentChangeCallback } from './types.js';\r\n\r\nconst DEFAULT_STATE: ConsentState = {\r\n necessary: true,\r\n analytics: false,\r\n marketing: false,\r\n preferences: false,\r\n};\r\n\r\nexport function createConsentManager(\r\n initial?: Partial<ConsentState>,\r\n): ConsentManager {\r\n const state: ConsentState = {\r\n ...DEFAULT_STATE,\r\n ...initial,\r\n necessary: true, // necessary cannot be overridden\r\n };\r\n\r\n const listeners = new Set<ConsentChangeCallback>();\r\n\r\n function notify(): void {\r\n for (const cb of listeners) {\r\n cb({ ...state });\r\n }\r\n }\r\n\r\n return {\r\n getState() {\r\n return { ...state };\r\n },\r\n\r\n grant(category: ConsentCategory) {\r\n if (state[category]) return; // already granted\r\n state[category] = true;\r\n notify();\r\n },\r\n\r\n revoke(category: ConsentCategory) {\r\n if (category === 'necessary') return; // cannot revoke necessary\r\n if (!state[category]) return; // already revoked\r\n state[category] = false;\r\n notify();\r\n },\r\n\r\n grantAll() {\r\n state.analytics = true;\r\n state.marketing = true;\r\n state.preferences = true;\r\n notify();\r\n },\r\n\r\n revokeAll() {\r\n state.analytics = false;\r\n state.marketing = false;\r\n state.preferences = false;\r\n notify();\r\n },\r\n\r\n isGranted(category: ConsentCategory) {\r\n return state[category];\r\n },\r\n\r\n onChange(callback: ConsentChangeCallback) {\r\n listeners.add(callback);\r\n return () => {\r\n listeners.delete(callback);\r\n };\r\n },\r\n };\r\n}\r\n","// ============================================================================\r\n// @power-seo/tracking — GA4 Script Builder\r\n// ============================================================================\r\n\r\nimport type { ScriptConfig, GA4Config, ConsentState } from '../types.js';\r\n\r\nexport function buildGA4Script(config: GA4Config): ScriptConfig[] {\r\n const { measurementId, consentModeV2 = true, anonymizeIp = true, sendPageView = true } = config;\r\n\r\n const scripts: ScriptConfig[] = [];\r\n\r\n if (consentModeV2) {\r\n scripts.push({\r\n id: `ga4-consent-${measurementId}`,\r\n innerHTML: `window.dataLayer=window.dataLayer||[];function gtag(){dataLayer.push(arguments);}gtag('consent','default',{'analytics_storage':'denied','ad_storage':'denied','ad_user_data':'denied','ad_personalization':'denied'});`,\r\n consentCategory: 'necessary',\r\n shouldLoad: () => true,\r\n });\r\n }\r\n\r\n scripts.push({\r\n id: `ga4-gtag-${measurementId}`,\r\n src: `https://www.googletagmanager.com/gtag/js?id=${measurementId}`,\r\n async: true,\r\n consentCategory: 'analytics',\r\n shouldLoad: (consent: ConsentState) => consent.analytics,\r\n });\r\n\r\n const configParts = [\r\n `window.dataLayer=window.dataLayer||[];function gtag(){dataLayer.push(arguments);}gtag('js',new Date());`,\r\n `gtag('config','${measurementId}',{${anonymizeIp ? \"'anonymize_ip':true,\" : ''}${!sendPageView ? \"'send_page_view':false\" : ''}});`,\r\n ];\r\n\r\n if (consentModeV2) {\r\n configParts.push(\r\n `gtag('consent','update',{'analytics_storage':'granted'});`,\r\n );\r\n }\r\n\r\n scripts.push({\r\n id: `ga4-config-${measurementId}`,\r\n innerHTML: configParts.join(''),\r\n consentCategory: 'analytics',\r\n shouldLoad: (consent: ConsentState) => consent.analytics,\r\n });\r\n\r\n return scripts;\r\n}\r\n","// ============================================================================\r\n// @power-seo/tracking — Clarity Script Builder\r\n// ============================================================================\r\n\r\nimport type { ScriptConfig, ClarityConfig, ConsentState } from '../types.js';\r\n\r\nexport function buildClarityScript(config: ClarityConfig): ScriptConfig {\r\n const { projectId } = config;\r\n\r\n return {\r\n id: `clarity-${projectId}`,\r\n innerHTML: `(function(c,l,a,r,i,t,y){c[a]=c[a]||function(){(c[a].q=c[a].q||[]).push(arguments)};t=l.createElement(r);t.async=1;t.src=\"https://www.clarity.ms/tag/\"+i;y=l.getElementsByTagName(r)[0];y.parentNode.insertBefore(t,y);})(window,document,\"clarity\",\"script\",\"${projectId}\");`,\r\n consentCategory: 'analytics',\r\n shouldLoad: (consent: ConsentState) => consent.analytics,\r\n };\r\n}\r\n","// ============================================================================\r\n// @power-seo/tracking — PostHog Script Builder\r\n// ============================================================================\r\n\r\nimport type { ScriptConfig, PostHogConfig, ConsentState } from '../types.js';\r\n\r\nexport function buildPostHogScript(config: PostHogConfig): ScriptConfig {\r\n const { apiKey, host = 'https://us.i.posthog.com' } = config;\r\n\r\n return {\r\n id: `posthog-${apiKey}`,\r\n innerHTML: `!function(t,e){var o,n,p,r;e.__SV||(window.posthog=e,e._i=[],e.init=function(i,s,a){function g(t,e){var o=e.split(\".\");2==o.length&&(t=t[o[0]],e=o[1]),t[e]=function(){t.push([e].concat(Array.prototype.slice.call(arguments,0)))}}(p=t.createElement(\"script\")).type=\"text/javascript\",p.async=!0,p.src=s.api_host+\"/static/array.js\",(r=t.getElementsByTagName(\"script\")[0]).parentNode.insertBefore(p,r);var u=e;for(void 0!==a?u=e[a]=[]:a=\"posthog\",u.people=u.people||[],u.toString=function(t){var e=\"posthog\";return\"posthog\"!==a&&(e+=\".\"+a),t||(e+=\" (stub)\"),e},u.people.toString=function(){return u.toString(1)+\".people (stub)\"},o=\"init capture register register_once register_for_session unregister opt_out_capturing has_opted_out_capturing opt_in_capturing reset isFeatureEnabled getFeatureFlag getFeatureFlagPayload reloadFeatureFlags group updateEarlyAccessFeatureEnrollment getEarlyAccessFeatures getActiveMatchingSurveys getSurveys onFeatureFlags\".split(\" \"),n=0;n<o.length;n++)g(u,o[n]);e._i.push([i,s,a])},e.__SV=1)}(document,window.posthog||[]);posthog.init('${apiKey}',{api_host:'${host}',person_profiles:'identified_only'});`,\r\n consentCategory: 'analytics',\r\n shouldLoad: (consent: ConsentState) => consent.analytics,\r\n };\r\n}\r\n","// ============================================================================\r\n// @power-seo/tracking — Plausible Script Builder\r\n// ============================================================================\r\n\r\nimport type { ScriptConfig, PlausibleConfig, ConsentState } from '../types.js';\r\n\r\nexport function buildPlausibleScript(config: PlausibleConfig): ScriptConfig {\r\n const { domain, selfHostedUrl } = config;\r\n const scriptSrc = selfHostedUrl\r\n ? `${selfHostedUrl.replace(/\\/$/, '')}/js/script.js`\r\n : 'https://plausible.io/js/script.js';\r\n\r\n return {\r\n id: `plausible-${domain}`,\r\n src: scriptSrc,\r\n defer: true,\r\n consentCategory: 'analytics',\r\n attributes: {\r\n 'data-domain': domain,\r\n },\r\n shouldLoad: (consent: ConsentState) => consent.analytics,\r\n };\r\n}\r\n","// ============================================================================\r\n// @power-seo/tracking — Fathom Script Builder\r\n// ============================================================================\r\n\r\nimport type { ScriptConfig, FathomConfig, ConsentState } from '../types.js';\r\n\r\nexport function buildFathomScript(config: FathomConfig): ScriptConfig {\r\n const { siteId } = config;\r\n\r\n return {\r\n id: `fathom-${siteId}`,\r\n src: 'https://cdn.usefathom.com/script.js',\r\n defer: true,\r\n consentCategory: 'analytics',\r\n attributes: {\r\n 'data-site': siteId,\r\n },\r\n shouldLoad: (consent: ConsentState) => consent.analytics,\r\n };\r\n}\r\n","// ============================================================================\r\n// @power-seo/tracking — GA4 API Client\r\n// ============================================================================\r\n\r\nimport type {\r\n GA4Client,\r\n GA4ReportResponse,\r\n GA4ReportRow,\r\n GA4Metadata,\r\n} from '../types.js';\r\n\r\nconst GA4_BASE = 'https://analyticsdata.googleapis.com/v1beta';\r\n\r\nexport function createGA4Client(accessToken: string): GA4Client {\r\n async function request<T>(url: string, body?: unknown): Promise<T> {\r\n const response = await globalThis.fetch(url, {\r\n method: body ? 'POST' : 'GET',\r\n headers: {\r\n Authorization: `Bearer ${accessToken}`,\r\n 'Content-Type': 'application/json',\r\n },\r\n body: body ? JSON.stringify(body) : undefined,\r\n });\r\n\r\n if (!response.ok) {\r\n const text = await response.text();\r\n throw new Error(`GA4 API error: ${response.status} ${text}`);\r\n }\r\n\r\n return (await response.json()) as T;\r\n }\r\n\r\n return {\r\n async queryReport(propertyId, req) {\r\n const body = {\r\n dateRanges: [{ startDate: req.startDate, endDate: req.endDate }],\r\n metrics: req.metrics.map((m) => ({ name: m })),\r\n dimensions: (req.dimensions ?? []).map((d) => ({ name: d })),\r\n limit: req.limit ?? 1000,\r\n };\r\n\r\n const raw = await request<{\r\n rows?: Array<{\r\n dimensionValues?: Array<{ value: string }>;\r\n metricValues?: Array<{ value: string }>;\r\n }>;\r\n rowCount?: number;\r\n metricHeaders?: Array<{ name: string; type: string }>;\r\n }>(`${GA4_BASE}/properties/${propertyId}:runReport`, body);\r\n\r\n const rows: GA4ReportRow[] = (raw.rows ?? []).map((r) => ({\r\n dimensions: (r.dimensionValues ?? []).map((d) => d.value),\r\n metrics: (r.metricValues ?? []).map((m) => Number(m.value)),\r\n }));\r\n\r\n return {\r\n rows,\r\n rowCount: raw.rowCount ?? rows.length,\r\n metadata: raw.metricHeaders ? { metricHeaders: raw.metricHeaders } : undefined,\r\n } satisfies GA4ReportResponse;\r\n },\r\n\r\n async getRealtimeReport(propertyId, metrics) {\r\n const body = {\r\n metrics: metrics.map((m) => ({ name: m })),\r\n };\r\n\r\n const raw = await request<{\r\n rows?: Array<{\r\n dimensionValues?: Array<{ value: string }>;\r\n metricValues?: Array<{ value: string }>;\r\n }>;\r\n rowCount?: number;\r\n }>(`${GA4_BASE}/properties/${propertyId}:runRealtimeReport`, body);\r\n\r\n const rows: GA4ReportRow[] = (raw.rows ?? []).map((r) => ({\r\n dimensions: (r.dimensionValues ?? []).map((d) => d.value),\r\n metrics: (r.metricValues ?? []).map((m) => Number(m.value)),\r\n }));\r\n\r\n return { rows, rowCount: raw.rowCount ?? rows.length } satisfies GA4ReportResponse;\r\n },\r\n\r\n async getMetadata(propertyId) {\r\n const raw = await request<{\r\n dimensions?: Array<{ apiName: string; uiName: string; description: string }>;\r\n metrics?: Array<{ apiName: string; uiName: string; description: string; type: string }>;\r\n }>(`${GA4_BASE}/properties/${propertyId}/metadata`);\r\n\r\n return {\r\n dimensions: raw.dimensions ?? [],\r\n metrics: raw.metrics ?? [],\r\n } satisfies GA4Metadata;\r\n },\r\n };\r\n}\r\n","// ============================================================================\r\n// @power-seo/tracking — Clarity API Client\r\n// ============================================================================\r\n\r\nimport type {\r\n ClarityClient,\r\n ClarityProject,\r\n ClarityInsight,\r\n ClarityHeatmapData,\r\n} from '../types.js';\r\n\r\nconst CLARITY_BASE = 'https://www.clarity.ms/api/v1';\r\n\r\nexport function createClarityClient(apiKey: string): ClarityClient {\r\n async function request<T>(path: string): Promise<T> {\r\n const response = await globalThis.fetch(`${CLARITY_BASE}${path}`, {\r\n headers: {\r\n Authorization: `Bearer ${apiKey}`,\r\n 'Content-Type': 'application/json',\r\n },\r\n });\r\n\r\n if (!response.ok) {\r\n const text = await response.text();\r\n throw new Error(`Clarity API error: ${response.status} ${text}`);\r\n }\r\n\r\n return (await response.json()) as T;\r\n }\r\n\r\n return {\r\n async getProjects() {\r\n return request<ClarityProject[]>('/projects');\r\n },\r\n\r\n async getInsights(projectId) {\r\n return request<ClarityInsight[]>(`/projects/${projectId}/insights`);\r\n },\r\n\r\n async getHeatmapData(projectId, url) {\r\n const encodedUrl = encodeURIComponent(url);\r\n return request<ClarityHeatmapData>(\r\n `/projects/${projectId}/heatmaps?url=${encodedUrl}`,\r\n );\r\n },\r\n };\r\n}\r\n","// ============================================================================\r\n// @power-seo/tracking — PostHog API Client\r\n// ============================================================================\r\n\r\nimport type {\r\n PostHogClient,\r\n PostHogEvent,\r\n PostHogTrendResult,\r\n PostHogFunnelStep,\r\n} from '../types.js';\r\n\r\nconst POSTHOG_BASE = 'https://us.posthog.com/api';\r\n\r\nexport function createPostHogClient(apiKey: string, host?: string): PostHogClient {\r\n const baseUrl = host ? `${host.replace(/\\/$/, '')}/api` : POSTHOG_BASE;\r\n\r\n async function request<T>(path: string, body?: unknown): Promise<T> {\r\n const response = await globalThis.fetch(`${baseUrl}${path}`, {\r\n method: body ? 'POST' : 'GET',\r\n headers: {\r\n Authorization: `Bearer ${apiKey}`,\r\n 'Content-Type': 'application/json',\r\n },\r\n body: body ? JSON.stringify(body) : undefined,\r\n });\r\n\r\n if (!response.ok) {\r\n const text = await response.text();\r\n throw new Error(`PostHog API error: ${response.status} ${text}`);\r\n }\r\n\r\n return (await response.json()) as T;\r\n }\r\n\r\n return {\r\n async queryEvents(projectId, event, limit = 100) {\r\n const raw = await request<{ results: PostHogEvent[] }>(\r\n `/projects/${projectId}/events?event=${encodeURIComponent(event)}&limit=${limit}`,\r\n );\r\n return raw.results ?? [];\r\n },\r\n\r\n async getTrends(projectId, events, days = 7) {\r\n const body = {\r\n events: events.map((e) => ({ id: e, type: 'events' })),\r\n date_from: `-${days}d`,\r\n };\r\n const raw = await request<{ result: PostHogTrendResult[] }>(\r\n `/projects/${projectId}/insights/trend`,\r\n body,\r\n );\r\n return raw.result ?? [];\r\n },\r\n\r\n async getFunnels(projectId, steps) {\r\n const body = {\r\n events: steps.map((s) => ({ id: s, type: 'events' })),\r\n };\r\n const raw = await request<{ result: PostHogFunnelStep[] }>(\r\n `/projects/${projectId}/insights/funnel`,\r\n body,\r\n );\r\n return raw.result ?? [];\r\n },\r\n };\r\n}\r\n","// ============================================================================\r\n// @power-seo/tracking — Plausible API Client\r\n// ============================================================================\r\n\r\nimport type {\r\n PlausibleClient,\r\n PlausibleTimeseriesPoint,\r\n PlausibleBreakdownEntry,\r\n PlausibleAggregateResult,\r\n} from '../types.js';\r\n\r\nconst PLAUSIBLE_BASE = 'https://plausible.io/api/v1';\r\n\r\nexport function createPlausibleClient(apiKey: string, selfHostedUrl?: string): PlausibleClient {\r\n const baseUrl = selfHostedUrl\r\n ? `${selfHostedUrl.replace(/\\/$/, '')}/api/v1`\r\n : PLAUSIBLE_BASE;\r\n\r\n async function request<T>(path: string): Promise<T> {\r\n const response = await globalThis.fetch(`${baseUrl}${path}`, {\r\n headers: {\r\n Authorization: `Bearer ${apiKey}`,\r\n 'Content-Type': 'application/json',\r\n },\r\n });\r\n\r\n if (!response.ok) {\r\n const text = await response.text();\r\n throw new Error(`Plausible API error: ${response.status} ${text}`);\r\n }\r\n\r\n return (await response.json()) as T;\r\n }\r\n\r\n return {\r\n async getTimeseries(siteId, period = '30d') {\r\n const raw = await request<{ results: PlausibleTimeseriesPoint[] }>(\r\n `/stats/timeseries?site_id=${encodeURIComponent(siteId)}&period=${period}`,\r\n );\r\n return raw.results ?? [];\r\n },\r\n\r\n async getBreakdown(siteId, property, period = '30d') {\r\n const raw = await request<{ results: PlausibleBreakdownEntry[] }>(\r\n `/stats/breakdown?site_id=${encodeURIComponent(siteId)}&property=${encodeURIComponent(property)}&period=${period}`,\r\n );\r\n return raw.results ?? [];\r\n },\r\n\r\n async getAggregate(siteId, period = '30d') {\r\n const raw = await request<{ results: PlausibleAggregateResult }>(\r\n `/stats/aggregate?site_id=${encodeURIComponent(siteId)}&period=${period}&metrics=visitors,pageviews,bounce_rate,visit_duration,events`,\r\n );\r\n return raw.results;\r\n },\r\n };\r\n}\r\n","// ============================================================================\r\n// @power-seo/tracking — Fathom API Client\r\n// ============================================================================\r\n\r\nimport type {\r\n FathomClient,\r\n FathomSite,\r\n FathomPageview,\r\n FathomReferrer,\r\n} from '../types.js';\r\n\r\nconst FATHOM_BASE = 'https://api.usefathom.com/v1';\r\n\r\nexport function createFathomClient(apiKey: string): FathomClient {\r\n async function request<T>(path: string): Promise<T> {\r\n const response = await globalThis.fetch(`${FATHOM_BASE}${path}`, {\r\n headers: {\r\n Authorization: `Bearer ${apiKey}`,\r\n 'Content-Type': 'application/json',\r\n },\r\n });\r\n\r\n if (!response.ok) {\r\n const text = await response.text();\r\n throw new Error(`Fathom API error: ${response.status} ${text}`);\r\n }\r\n\r\n return (await response.json()) as T;\r\n }\r\n\r\n return {\r\n async getSites() {\r\n const raw = await request<{ data: FathomSite[] }>('/sites');\r\n return raw.data ?? [];\r\n },\r\n\r\n async getPageviews(siteId, period = '30d') {\r\n const raw = await request<{ data: FathomPageview[] }>(\r\n `/sites/${siteId}/pages?period=${period}`,\r\n );\r\n return raw.data ?? [];\r\n },\r\n\r\n async getReferrers(siteId, period = '30d') {\r\n const raw = await request<{ data: FathomReferrer[] }>(\r\n `/sites/${siteId}/referrers?period=${period}`,\r\n );\r\n return raw.data ?? [];\r\n },\r\n };\r\n}\r\n"]}
@@ -0,0 +1,26 @@
1
+ import { C as ConsentState, a as ConsentManager, G as GA4Config, S as ScriptConfig, b as ClarityConfig, P as PostHogConfig, c as PlausibleConfig, F as FathomConfig, d as GA4Client, e as ClarityClient, f as PostHogClient, g as PlausibleClient, h as FathomClient } from './types-DFyKCGgf.cjs';
2
+ export { i as ClarityHeatmapData, j as ClarityInsight, k as ClarityProject, l as ConsentCategory, m as ConsentChangeCallback, n as FathomPageview, o as FathomReferrer, p as FathomSite, q as GA4Metadata, r as GA4ReportRequest, s as GA4ReportResponse, t as GA4ReportRow, u as PlausibleAggregateResult, v as PlausibleBreakdownEntry, w as PlausibleTimeseriesPoint, x as PostHogEvent, y as PostHogFunnelStep, z as PostHogTrendResult } from './types-DFyKCGgf.cjs';
3
+
4
+ declare function createConsentManager(initial?: Partial<ConsentState>): ConsentManager;
5
+
6
+ declare function buildGA4Script(config: GA4Config): ScriptConfig[];
7
+
8
+ declare function buildClarityScript(config: ClarityConfig): ScriptConfig;
9
+
10
+ declare function buildPostHogScript(config: PostHogConfig): ScriptConfig;
11
+
12
+ declare function buildPlausibleScript(config: PlausibleConfig): ScriptConfig;
13
+
14
+ declare function buildFathomScript(config: FathomConfig): ScriptConfig;
15
+
16
+ declare function createGA4Client(accessToken: string): GA4Client;
17
+
18
+ declare function createClarityClient(apiKey: string): ClarityClient;
19
+
20
+ declare function createPostHogClient(apiKey: string, host?: string): PostHogClient;
21
+
22
+ declare function createPlausibleClient(apiKey: string, selfHostedUrl?: string): PlausibleClient;
23
+
24
+ declare function createFathomClient(apiKey: string): FathomClient;
25
+
26
+ export { ClarityClient, ClarityConfig, ConsentManager, ConsentState, FathomClient, FathomConfig, GA4Client, GA4Config, PlausibleClient, PlausibleConfig, PostHogClient, PostHogConfig, ScriptConfig, buildClarityScript, buildFathomScript, buildGA4Script, buildPlausibleScript, buildPostHogScript, createClarityClient, createConsentManager, createFathomClient, createGA4Client, createPlausibleClient, createPostHogClient };
@@ -0,0 +1,26 @@
1
+ import { C as ConsentState, a as ConsentManager, G as GA4Config, S as ScriptConfig, b as ClarityConfig, P as PostHogConfig, c as PlausibleConfig, F as FathomConfig, d as GA4Client, e as ClarityClient, f as PostHogClient, g as PlausibleClient, h as FathomClient } from './types-DFyKCGgf.js';
2
+ export { i as ClarityHeatmapData, j as ClarityInsight, k as ClarityProject, l as ConsentCategory, m as ConsentChangeCallback, n as FathomPageview, o as FathomReferrer, p as FathomSite, q as GA4Metadata, r as GA4ReportRequest, s as GA4ReportResponse, t as GA4ReportRow, u as PlausibleAggregateResult, v as PlausibleBreakdownEntry, w as PlausibleTimeseriesPoint, x as PostHogEvent, y as PostHogFunnelStep, z as PostHogTrendResult } from './types-DFyKCGgf.js';
3
+
4
+ declare function createConsentManager(initial?: Partial<ConsentState>): ConsentManager;
5
+
6
+ declare function buildGA4Script(config: GA4Config): ScriptConfig[];
7
+
8
+ declare function buildClarityScript(config: ClarityConfig): ScriptConfig;
9
+
10
+ declare function buildPostHogScript(config: PostHogConfig): ScriptConfig;
11
+
12
+ declare function buildPlausibleScript(config: PlausibleConfig): ScriptConfig;
13
+
14
+ declare function buildFathomScript(config: FathomConfig): ScriptConfig;
15
+
16
+ declare function createGA4Client(accessToken: string): GA4Client;
17
+
18
+ declare function createClarityClient(apiKey: string): ClarityClient;
19
+
20
+ declare function createPostHogClient(apiKey: string, host?: string): PostHogClient;
21
+
22
+ declare function createPlausibleClient(apiKey: string, selfHostedUrl?: string): PlausibleClient;
23
+
24
+ declare function createFathomClient(apiKey: string): FathomClient;
25
+
26
+ export { ClarityClient, ClarityConfig, ConsentManager, ConsentState, FathomClient, FathomConfig, GA4Client, GA4Config, PlausibleClient, PlausibleConfig, PostHogClient, PostHogConfig, ScriptConfig, buildClarityScript, buildFathomScript, buildGA4Script, buildPlausibleScript, buildPostHogScript, createClarityClient, createConsentManager, createFathomClient, createGA4Client, createPlausibleClient, createPostHogClient };