@power-seo/tracking 1.0.1 → 1.0.4

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 CHANGED
@@ -212,7 +212,7 @@ After (@power-seo/tracking):
212
212
 
213
213
  ---
214
214
 
215
- ## @power-seo Ecosystem
215
+ ## [@power-seo](https://www.npmjs.com/org/power-seo) Ecosystem
216
216
 
217
217
  All 17 packages are independently installable — use only what you need.
218
218
 
@@ -379,9 +379,9 @@ import type {
379
379
 
380
380
  ---
381
381
 
382
- ## About CyberCraft Bangladesh
382
+ ## About [CyberCraft Bangladesh](https://ccbd.dev)
383
383
 
384
- **CyberCraft Bangladesh** is a Bangladesh-based enterprise-grade software engineering company specializing in ERP system development, AI-powered SaaS and business applications, full-stack SEO services, custom website development, and scalable eCommerce platforms. We design and develop intelligent, automation-driven SaaS and enterprise solutions that help startups, SMEs, NGOs, educational institutes, and large organizations streamline operations, enhance digital visibility, and accelerate growth through modern cloud-native technologies.
384
+ **[CyberCraft Bangladesh](https://ccbd.dev)** is a Bangladesh-based enterprise-grade software engineering company specializing in ERP system development, AI-powered SaaS and business applications, full-stack SEO services, custom website development, and scalable eCommerce platforms. We design and develop intelligent, automation-driven SaaS and enterprise solutions that help startups, SMEs, NGOs, educational institutes, and large organizations streamline operations, enhance digital visibility, and accelerate growth through modern cloud-native technologies.
385
385
 
386
386
  | | |
387
387
  | -------------------- | -------------------------------------------------------------- |
package/dist/index.cjs CHANGED
@@ -83,9 +83,7 @@ function buildGA4Script(config) {
83
83
  `gtag('config','${measurementId}',{${anonymizeIp ? "'anonymize_ip':true," : ""}${!sendPageView ? "'send_page_view':false" : ""}});`
84
84
  ];
85
85
  if (consentModeV2) {
86
- configParts.push(
87
- `gtag('consent','update',{'analytics_storage':'granted'});`
88
- );
86
+ configParts.push(`gtag('consent','update',{'analytics_storage':'granted'});`);
89
87
  }
90
88
  scripts.push({
91
89
  id: `ga4-config-${measurementId}`,
@@ -232,9 +230,7 @@ function createClarityClient(apiKey) {
232
230
  },
233
231
  async getHeatmapData(projectId, url) {
234
232
  const encodedUrl = encodeURIComponent(url);
235
- return request(
236
- `/projects/${projectId}/heatmaps?url=${encodedUrl}`
237
- );
233
+ return request(`/projects/${projectId}/heatmaps?url=${encodedUrl}`);
238
234
  }
239
235
  };
240
236
  }
@@ -1 +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":["// ============================================================================\n// @power-seo/tracking — Consent Manager\n// ============================================================================\n\nimport type { ConsentState, ConsentCategory, ConsentManager, ConsentChangeCallback } from './types.js';\n\nconst DEFAULT_STATE: ConsentState = {\n necessary: true,\n analytics: false,\n marketing: false,\n preferences: false,\n};\n\nexport function createConsentManager(\n initial?: Partial<ConsentState>,\n): ConsentManager {\n const state: ConsentState = {\n ...DEFAULT_STATE,\n ...initial,\n necessary: true, // necessary cannot be overridden\n };\n\n const listeners = new Set<ConsentChangeCallback>();\n\n function notify(): void {\n for (const cb of listeners) {\n cb({ ...state });\n }\n }\n\n return {\n getState() {\n return { ...state };\n },\n\n grant(category: ConsentCategory) {\n if (state[category]) return; // already granted\n state[category] = true;\n notify();\n },\n\n revoke(category: ConsentCategory) {\n if (category === 'necessary') return; // cannot revoke necessary\n if (!state[category]) return; // already revoked\n state[category] = false;\n notify();\n },\n\n grantAll() {\n state.analytics = true;\n state.marketing = true;\n state.preferences = true;\n notify();\n },\n\n revokeAll() {\n state.analytics = false;\n state.marketing = false;\n state.preferences = false;\n notify();\n },\n\n isGranted(category: ConsentCategory) {\n return state[category];\n },\n\n onChange(callback: ConsentChangeCallback) {\n listeners.add(callback);\n return () => {\n listeners.delete(callback);\n };\n },\n };\n}\n","// ============================================================================\n// @power-seo/tracking — GA4 Script Builder\n// ============================================================================\n\nimport type { ScriptConfig, GA4Config, ConsentState } from '../types.js';\n\nexport function buildGA4Script(config: GA4Config): ScriptConfig[] {\n const { measurementId, consentModeV2 = true, anonymizeIp = true, sendPageView = true } = config;\n\n const scripts: ScriptConfig[] = [];\n\n if (consentModeV2) {\n scripts.push({\n id: `ga4-consent-${measurementId}`,\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'});`,\n consentCategory: 'necessary',\n shouldLoad: () => true,\n });\n }\n\n scripts.push({\n id: `ga4-gtag-${measurementId}`,\n src: `https://www.googletagmanager.com/gtag/js?id=${measurementId}`,\n async: true,\n consentCategory: 'analytics',\n shouldLoad: (consent: ConsentState) => consent.analytics,\n });\n\n const configParts = [\n `window.dataLayer=window.dataLayer||[];function gtag(){dataLayer.push(arguments);}gtag('js',new Date());`,\n `gtag('config','${measurementId}',{${anonymizeIp ? \"'anonymize_ip':true,\" : ''}${!sendPageView ? \"'send_page_view':false\" : ''}});`,\n ];\n\n if (consentModeV2) {\n configParts.push(\n `gtag('consent','update',{'analytics_storage':'granted'});`,\n );\n }\n\n scripts.push({\n id: `ga4-config-${measurementId}`,\n innerHTML: configParts.join(''),\n consentCategory: 'analytics',\n shouldLoad: (consent: ConsentState) => consent.analytics,\n });\n\n return scripts;\n}\n","// ============================================================================\n// @power-seo/tracking — Clarity Script Builder\n// ============================================================================\n\nimport type { ScriptConfig, ClarityConfig, ConsentState } from '../types.js';\n\nexport function buildClarityScript(config: ClarityConfig): ScriptConfig {\n const { projectId } = config;\n\n return {\n id: `clarity-${projectId}`,\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}\");`,\n consentCategory: 'analytics',\n shouldLoad: (consent: ConsentState) => consent.analytics,\n };\n}\n","// ============================================================================\n// @power-seo/tracking — PostHog Script Builder\n// ============================================================================\n\nimport type { ScriptConfig, PostHogConfig, ConsentState } from '../types.js';\n\nexport function buildPostHogScript(config: PostHogConfig): ScriptConfig {\n const { apiKey, host = 'https://us.i.posthog.com' } = config;\n\n return {\n id: `posthog-${apiKey}`,\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'});`,\n consentCategory: 'analytics',\n shouldLoad: (consent: ConsentState) => consent.analytics,\n };\n}\n","// ============================================================================\n// @power-seo/tracking — Plausible Script Builder\n// ============================================================================\n\nimport type { ScriptConfig, PlausibleConfig, ConsentState } from '../types.js';\n\nexport function buildPlausibleScript(config: PlausibleConfig): ScriptConfig {\n const { domain, selfHostedUrl } = config;\n const scriptSrc = selfHostedUrl\n ? `${selfHostedUrl.replace(/\\/$/, '')}/js/script.js`\n : 'https://plausible.io/js/script.js';\n\n return {\n id: `plausible-${domain}`,\n src: scriptSrc,\n defer: true,\n consentCategory: 'analytics',\n attributes: {\n 'data-domain': domain,\n },\n shouldLoad: (consent: ConsentState) => consent.analytics,\n };\n}\n","// ============================================================================\n// @power-seo/tracking — Fathom Script Builder\n// ============================================================================\n\nimport type { ScriptConfig, FathomConfig, ConsentState } from '../types.js';\n\nexport function buildFathomScript(config: FathomConfig): ScriptConfig {\n const { siteId } = config;\n\n return {\n id: `fathom-${siteId}`,\n src: 'https://cdn.usefathom.com/script.js',\n defer: true,\n consentCategory: 'analytics',\n attributes: {\n 'data-site': siteId,\n },\n shouldLoad: (consent: ConsentState) => consent.analytics,\n };\n}\n","// ============================================================================\n// @power-seo/tracking — GA4 API Client\n// ============================================================================\n\nimport type {\n GA4Client,\n GA4ReportResponse,\n GA4ReportRow,\n GA4Metadata,\n} from '../types.js';\n\nconst GA4_BASE = 'https://analyticsdata.googleapis.com/v1beta';\n\nexport function createGA4Client(accessToken: string): GA4Client {\n async function request<T>(url: string, body?: unknown): Promise<T> {\n const response = await globalThis.fetch(url, {\n method: body ? 'POST' : 'GET',\n headers: {\n Authorization: `Bearer ${accessToken}`,\n 'Content-Type': 'application/json',\n },\n body: body ? JSON.stringify(body) : undefined,\n });\n\n if (!response.ok) {\n const text = await response.text();\n throw new Error(`GA4 API error: ${response.status} ${text}`);\n }\n\n return (await response.json()) as T;\n }\n\n return {\n async queryReport(propertyId, req) {\n const body = {\n dateRanges: [{ startDate: req.startDate, endDate: req.endDate }],\n metrics: req.metrics.map((m) => ({ name: m })),\n dimensions: (req.dimensions ?? []).map((d) => ({ name: d })),\n limit: req.limit ?? 1000,\n };\n\n const raw = await request<{\n rows?: Array<{\n dimensionValues?: Array<{ value: string }>;\n metricValues?: Array<{ value: string }>;\n }>;\n rowCount?: number;\n metricHeaders?: Array<{ name: string; type: string }>;\n }>(`${GA4_BASE}/properties/${propertyId}:runReport`, body);\n\n const rows: GA4ReportRow[] = (raw.rows ?? []).map((r) => ({\n dimensions: (r.dimensionValues ?? []).map((d) => d.value),\n metrics: (r.metricValues ?? []).map((m) => Number(m.value)),\n }));\n\n return {\n rows,\n rowCount: raw.rowCount ?? rows.length,\n metadata: raw.metricHeaders ? { metricHeaders: raw.metricHeaders } : undefined,\n } satisfies GA4ReportResponse;\n },\n\n async getRealtimeReport(propertyId, metrics) {\n const body = {\n metrics: metrics.map((m) => ({ name: m })),\n };\n\n const raw = await request<{\n rows?: Array<{\n dimensionValues?: Array<{ value: string }>;\n metricValues?: Array<{ value: string }>;\n }>;\n rowCount?: number;\n }>(`${GA4_BASE}/properties/${propertyId}:runRealtimeReport`, body);\n\n const rows: GA4ReportRow[] = (raw.rows ?? []).map((r) => ({\n dimensions: (r.dimensionValues ?? []).map((d) => d.value),\n metrics: (r.metricValues ?? []).map((m) => Number(m.value)),\n }));\n\n return { rows, rowCount: raw.rowCount ?? rows.length } satisfies GA4ReportResponse;\n },\n\n async getMetadata(propertyId) {\n const raw = await request<{\n dimensions?: Array<{ apiName: string; uiName: string; description: string }>;\n metrics?: Array<{ apiName: string; uiName: string; description: string; type: string }>;\n }>(`${GA4_BASE}/properties/${propertyId}/metadata`);\n\n return {\n dimensions: raw.dimensions ?? [],\n metrics: raw.metrics ?? [],\n } satisfies GA4Metadata;\n },\n };\n}\n","// ============================================================================\n// @power-seo/tracking — Clarity API Client\n// ============================================================================\n\nimport type {\n ClarityClient,\n ClarityProject,\n ClarityInsight,\n ClarityHeatmapData,\n} from '../types.js';\n\nconst CLARITY_BASE = 'https://www.clarity.ms/api/v1';\n\nexport function createClarityClient(apiKey: string): ClarityClient {\n async function request<T>(path: string): Promise<T> {\n const response = await globalThis.fetch(`${CLARITY_BASE}${path}`, {\n headers: {\n Authorization: `Bearer ${apiKey}`,\n 'Content-Type': 'application/json',\n },\n });\n\n if (!response.ok) {\n const text = await response.text();\n throw new Error(`Clarity API error: ${response.status} ${text}`);\n }\n\n return (await response.json()) as T;\n }\n\n return {\n async getProjects() {\n return request<ClarityProject[]>('/projects');\n },\n\n async getInsights(projectId) {\n return request<ClarityInsight[]>(`/projects/${projectId}/insights`);\n },\n\n async getHeatmapData(projectId, url) {\n const encodedUrl = encodeURIComponent(url);\n return request<ClarityHeatmapData>(\n `/projects/${projectId}/heatmaps?url=${encodedUrl}`,\n );\n },\n };\n}\n","// ============================================================================\n// @power-seo/tracking — PostHog API Client\n// ============================================================================\n\nimport type {\n PostHogClient,\n PostHogEvent,\n PostHogTrendResult,\n PostHogFunnelStep,\n} from '../types.js';\n\nconst POSTHOG_BASE = 'https://us.posthog.com/api';\n\nexport function createPostHogClient(apiKey: string, host?: string): PostHogClient {\n const baseUrl = host ? `${host.replace(/\\/$/, '')}/api` : POSTHOG_BASE;\n\n async function request<T>(path: string, body?: unknown): Promise<T> {\n const response = await globalThis.fetch(`${baseUrl}${path}`, {\n method: body ? 'POST' : 'GET',\n headers: {\n Authorization: `Bearer ${apiKey}`,\n 'Content-Type': 'application/json',\n },\n body: body ? JSON.stringify(body) : undefined,\n });\n\n if (!response.ok) {\n const text = await response.text();\n throw new Error(`PostHog API error: ${response.status} ${text}`);\n }\n\n return (await response.json()) as T;\n }\n\n return {\n async queryEvents(projectId, event, limit = 100) {\n const raw = await request<{ results: PostHogEvent[] }>(\n `/projects/${projectId}/events?event=${encodeURIComponent(event)}&limit=${limit}`,\n );\n return raw.results ?? [];\n },\n\n async getTrends(projectId, events, days = 7) {\n const body = {\n events: events.map((e) => ({ id: e, type: 'events' })),\n date_from: `-${days}d`,\n };\n const raw = await request<{ result: PostHogTrendResult[] }>(\n `/projects/${projectId}/insights/trend`,\n body,\n );\n return raw.result ?? [];\n },\n\n async getFunnels(projectId, steps) {\n const body = {\n events: steps.map((s) => ({ id: s, type: 'events' })),\n };\n const raw = await request<{ result: PostHogFunnelStep[] }>(\n `/projects/${projectId}/insights/funnel`,\n body,\n );\n return raw.result ?? [];\n },\n };\n}\n","// ============================================================================\n// @power-seo/tracking — Plausible API Client\n// ============================================================================\n\nimport type {\n PlausibleClient,\n PlausibleTimeseriesPoint,\n PlausibleBreakdownEntry,\n PlausibleAggregateResult,\n} from '../types.js';\n\nconst PLAUSIBLE_BASE = 'https://plausible.io/api/v1';\n\nexport function createPlausibleClient(apiKey: string, selfHostedUrl?: string): PlausibleClient {\n const baseUrl = selfHostedUrl\n ? `${selfHostedUrl.replace(/\\/$/, '')}/api/v1`\n : PLAUSIBLE_BASE;\n\n async function request<T>(path: string): Promise<T> {\n const response = await globalThis.fetch(`${baseUrl}${path}`, {\n headers: {\n Authorization: `Bearer ${apiKey}`,\n 'Content-Type': 'application/json',\n },\n });\n\n if (!response.ok) {\n const text = await response.text();\n throw new Error(`Plausible API error: ${response.status} ${text}`);\n }\n\n return (await response.json()) as T;\n }\n\n return {\n async getTimeseries(siteId, period = '30d') {\n const raw = await request<{ results: PlausibleTimeseriesPoint[] }>(\n `/stats/timeseries?site_id=${encodeURIComponent(siteId)}&period=${period}`,\n );\n return raw.results ?? [];\n },\n\n async getBreakdown(siteId, property, period = '30d') {\n const raw = await request<{ results: PlausibleBreakdownEntry[] }>(\n `/stats/breakdown?site_id=${encodeURIComponent(siteId)}&property=${encodeURIComponent(property)}&period=${period}`,\n );\n return raw.results ?? [];\n },\n\n async getAggregate(siteId, period = '30d') {\n const raw = await request<{ results: PlausibleAggregateResult }>(\n `/stats/aggregate?site_id=${encodeURIComponent(siteId)}&period=${period}&metrics=visitors,pageviews,bounce_rate,visit_duration,events`,\n );\n return raw.results;\n },\n };\n}\n","// ============================================================================\n// @power-seo/tracking — Fathom API Client\n// ============================================================================\n\nimport type {\n FathomClient,\n FathomSite,\n FathomPageview,\n FathomReferrer,\n} from '../types.js';\n\nconst FATHOM_BASE = 'https://api.usefathom.com/v1';\n\nexport function createFathomClient(apiKey: string): FathomClient {\n async function request<T>(path: string): Promise<T> {\n const response = await globalThis.fetch(`${FATHOM_BASE}${path}`, {\n headers: {\n Authorization: `Bearer ${apiKey}`,\n 'Content-Type': 'application/json',\n },\n });\n\n if (!response.ok) {\n const text = await response.text();\n throw new Error(`Fathom API error: ${response.status} ${text}`);\n }\n\n return (await response.json()) as T;\n }\n\n return {\n async getSites() {\n const raw = await request<{ data: FathomSite[] }>('/sites');\n return raw.data ?? [];\n },\n\n async getPageviews(siteId, period = '30d') {\n const raw = await request<{ data: FathomPageview[] }>(\n `/sites/${siteId}/pages?period=${period}`,\n );\n return raw.data ?? [];\n },\n\n async getReferrers(siteId, period = '30d') {\n const raw = await request<{ data: FathomReferrer[] }>(\n `/sites/${siteId}/referrers?period=${period}`,\n );\n return raw.data ?? [];\n },\n };\n}\n"]}
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":["// ============================================================================\n// @power-seo/tracking — Consent Manager\n// ============================================================================\n\nimport type {\n ConsentState,\n ConsentCategory,\n ConsentManager,\n ConsentChangeCallback,\n} from './types.js';\n\nconst DEFAULT_STATE: ConsentState = {\n necessary: true,\n analytics: false,\n marketing: false,\n preferences: false,\n};\n\nexport function createConsentManager(initial?: Partial<ConsentState>): ConsentManager {\n const state: ConsentState = {\n ...DEFAULT_STATE,\n ...initial,\n necessary: true, // necessary cannot be overridden\n };\n\n const listeners = new Set<ConsentChangeCallback>();\n\n function notify(): void {\n for (const cb of listeners) {\n cb({ ...state });\n }\n }\n\n return {\n getState() {\n return { ...state };\n },\n\n grant(category: ConsentCategory) {\n if (state[category]) return; // already granted\n state[category] = true;\n notify();\n },\n\n revoke(category: ConsentCategory) {\n if (category === 'necessary') return; // cannot revoke necessary\n if (!state[category]) return; // already revoked\n state[category] = false;\n notify();\n },\n\n grantAll() {\n state.analytics = true;\n state.marketing = true;\n state.preferences = true;\n notify();\n },\n\n revokeAll() {\n state.analytics = false;\n state.marketing = false;\n state.preferences = false;\n notify();\n },\n\n isGranted(category: ConsentCategory) {\n return state[category];\n },\n\n onChange(callback: ConsentChangeCallback) {\n listeners.add(callback);\n return () => {\n listeners.delete(callback);\n };\n },\n };\n}\n","// ============================================================================\n// @power-seo/tracking — GA4 Script Builder\n// ============================================================================\n\nimport type { ScriptConfig, GA4Config, ConsentState } from '../types.js';\n\nexport function buildGA4Script(config: GA4Config): ScriptConfig[] {\n const { measurementId, consentModeV2 = true, anonymizeIp = true, sendPageView = true } = config;\n\n const scripts: ScriptConfig[] = [];\n\n if (consentModeV2) {\n scripts.push({\n id: `ga4-consent-${measurementId}`,\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'});`,\n consentCategory: 'necessary',\n shouldLoad: () => true,\n });\n }\n\n scripts.push({\n id: `ga4-gtag-${measurementId}`,\n src: `https://www.googletagmanager.com/gtag/js?id=${measurementId}`,\n async: true,\n consentCategory: 'analytics',\n shouldLoad: (consent: ConsentState) => consent.analytics,\n });\n\n const configParts = [\n `window.dataLayer=window.dataLayer||[];function gtag(){dataLayer.push(arguments);}gtag('js',new Date());`,\n `gtag('config','${measurementId}',{${anonymizeIp ? \"'anonymize_ip':true,\" : ''}${!sendPageView ? \"'send_page_view':false\" : ''}});`,\n ];\n\n if (consentModeV2) {\n configParts.push(`gtag('consent','update',{'analytics_storage':'granted'});`);\n }\n\n scripts.push({\n id: `ga4-config-${measurementId}`,\n innerHTML: configParts.join(''),\n consentCategory: 'analytics',\n shouldLoad: (consent: ConsentState) => consent.analytics,\n });\n\n return scripts;\n}\n","// ============================================================================\n// @power-seo/tracking — Clarity Script Builder\n// ============================================================================\n\nimport type { ScriptConfig, ClarityConfig, ConsentState } from '../types.js';\n\nexport function buildClarityScript(config: ClarityConfig): ScriptConfig {\n const { projectId } = config;\n\n return {\n id: `clarity-${projectId}`,\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}\");`,\n consentCategory: 'analytics',\n shouldLoad: (consent: ConsentState) => consent.analytics,\n };\n}\n","// ============================================================================\n// @power-seo/tracking — PostHog Script Builder\n// ============================================================================\n\nimport type { ScriptConfig, PostHogConfig, ConsentState } from '../types.js';\n\nexport function buildPostHogScript(config: PostHogConfig): ScriptConfig {\n const { apiKey, host = 'https://us.i.posthog.com' } = config;\n\n return {\n id: `posthog-${apiKey}`,\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'});`,\n consentCategory: 'analytics',\n shouldLoad: (consent: ConsentState) => consent.analytics,\n };\n}\n","// ============================================================================\n// @power-seo/tracking — Plausible Script Builder\n// ============================================================================\n\nimport type { ScriptConfig, PlausibleConfig, ConsentState } from '../types.js';\n\nexport function buildPlausibleScript(config: PlausibleConfig): ScriptConfig {\n const { domain, selfHostedUrl } = config;\n const scriptSrc = selfHostedUrl\n ? `${selfHostedUrl.replace(/\\/$/, '')}/js/script.js`\n : 'https://plausible.io/js/script.js';\n\n return {\n id: `plausible-${domain}`,\n src: scriptSrc,\n defer: true,\n consentCategory: 'analytics',\n attributes: {\n 'data-domain': domain,\n },\n shouldLoad: (consent: ConsentState) => consent.analytics,\n };\n}\n","// ============================================================================\n// @power-seo/tracking — Fathom Script Builder\n// ============================================================================\n\nimport type { ScriptConfig, FathomConfig, ConsentState } from '../types.js';\n\nexport function buildFathomScript(config: FathomConfig): ScriptConfig {\n const { siteId } = config;\n\n return {\n id: `fathom-${siteId}`,\n src: 'https://cdn.usefathom.com/script.js',\n defer: true,\n consentCategory: 'analytics',\n attributes: {\n 'data-site': siteId,\n },\n shouldLoad: (consent: ConsentState) => consent.analytics,\n };\n}\n","// ============================================================================\n// @power-seo/tracking — GA4 API Client\n// ============================================================================\n\nimport type { GA4Client, GA4ReportResponse, GA4ReportRow, GA4Metadata } from '../types.js';\n\nconst GA4_BASE = 'https://analyticsdata.googleapis.com/v1beta';\n\nexport function createGA4Client(accessToken: string): GA4Client {\n async function request<T>(url: string, body?: unknown): Promise<T> {\n const response = await globalThis.fetch(url, {\n method: body ? 'POST' : 'GET',\n headers: {\n Authorization: `Bearer ${accessToken}`,\n 'Content-Type': 'application/json',\n },\n body: body ? JSON.stringify(body) : undefined,\n });\n\n if (!response.ok) {\n const text = await response.text();\n throw new Error(`GA4 API error: ${response.status} ${text}`);\n }\n\n return (await response.json()) as T;\n }\n\n return {\n async queryReport(propertyId, req) {\n const body = {\n dateRanges: [{ startDate: req.startDate, endDate: req.endDate }],\n metrics: req.metrics.map((m) => ({ name: m })),\n dimensions: (req.dimensions ?? []).map((d) => ({ name: d })),\n limit: req.limit ?? 1000,\n };\n\n const raw = await request<{\n rows?: Array<{\n dimensionValues?: Array<{ value: string }>;\n metricValues?: Array<{ value: string }>;\n }>;\n rowCount?: number;\n metricHeaders?: Array<{ name: string; type: string }>;\n }>(`${GA4_BASE}/properties/${propertyId}:runReport`, body);\n\n const rows: GA4ReportRow[] = (raw.rows ?? []).map((r) => ({\n dimensions: (r.dimensionValues ?? []).map((d) => d.value),\n metrics: (r.metricValues ?? []).map((m) => Number(m.value)),\n }));\n\n return {\n rows,\n rowCount: raw.rowCount ?? rows.length,\n metadata: raw.metricHeaders ? { metricHeaders: raw.metricHeaders } : undefined,\n } satisfies GA4ReportResponse;\n },\n\n async getRealtimeReport(propertyId, metrics) {\n const body = {\n metrics: metrics.map((m) => ({ name: m })),\n };\n\n const raw = await request<{\n rows?: Array<{\n dimensionValues?: Array<{ value: string }>;\n metricValues?: Array<{ value: string }>;\n }>;\n rowCount?: number;\n }>(`${GA4_BASE}/properties/${propertyId}:runRealtimeReport`, body);\n\n const rows: GA4ReportRow[] = (raw.rows ?? []).map((r) => ({\n dimensions: (r.dimensionValues ?? []).map((d) => d.value),\n metrics: (r.metricValues ?? []).map((m) => Number(m.value)),\n }));\n\n return { rows, rowCount: raw.rowCount ?? rows.length } satisfies GA4ReportResponse;\n },\n\n async getMetadata(propertyId) {\n const raw = await request<{\n dimensions?: Array<{ apiName: string; uiName: string; description: string }>;\n metrics?: Array<{ apiName: string; uiName: string; description: string; type: string }>;\n }>(`${GA4_BASE}/properties/${propertyId}/metadata`);\n\n return {\n dimensions: raw.dimensions ?? [],\n metrics: raw.metrics ?? [],\n } satisfies GA4Metadata;\n },\n };\n}\n","// ============================================================================\n// @power-seo/tracking — Clarity API Client\n// ============================================================================\n\nimport type {\n ClarityClient,\n ClarityProject,\n ClarityInsight,\n ClarityHeatmapData,\n} from '../types.js';\n\nconst CLARITY_BASE = 'https://www.clarity.ms/api/v1';\n\nexport function createClarityClient(apiKey: string): ClarityClient {\n async function request<T>(path: string): Promise<T> {\n const response = await globalThis.fetch(`${CLARITY_BASE}${path}`, {\n headers: {\n Authorization: `Bearer ${apiKey}`,\n 'Content-Type': 'application/json',\n },\n });\n\n if (!response.ok) {\n const text = await response.text();\n throw new Error(`Clarity API error: ${response.status} ${text}`);\n }\n\n return (await response.json()) as T;\n }\n\n return {\n async getProjects() {\n return request<ClarityProject[]>('/projects');\n },\n\n async getInsights(projectId) {\n return request<ClarityInsight[]>(`/projects/${projectId}/insights`);\n },\n\n async getHeatmapData(projectId, url) {\n const encodedUrl = encodeURIComponent(url);\n return request<ClarityHeatmapData>(`/projects/${projectId}/heatmaps?url=${encodedUrl}`);\n },\n };\n}\n","// ============================================================================\n// @power-seo/tracking — PostHog API Client\n// ============================================================================\n\nimport type {\n PostHogClient,\n PostHogEvent,\n PostHogTrendResult,\n PostHogFunnelStep,\n} from '../types.js';\n\nconst POSTHOG_BASE = 'https://us.posthog.com/api';\n\nexport function createPostHogClient(apiKey: string, host?: string): PostHogClient {\n const baseUrl = host ? `${host.replace(/\\/$/, '')}/api` : POSTHOG_BASE;\n\n async function request<T>(path: string, body?: unknown): Promise<T> {\n const response = await globalThis.fetch(`${baseUrl}${path}`, {\n method: body ? 'POST' : 'GET',\n headers: {\n Authorization: `Bearer ${apiKey}`,\n 'Content-Type': 'application/json',\n },\n body: body ? JSON.stringify(body) : undefined,\n });\n\n if (!response.ok) {\n const text = await response.text();\n throw new Error(`PostHog API error: ${response.status} ${text}`);\n }\n\n return (await response.json()) as T;\n }\n\n return {\n async queryEvents(projectId, event, limit = 100) {\n const raw = await request<{ results: PostHogEvent[] }>(\n `/projects/${projectId}/events?event=${encodeURIComponent(event)}&limit=${limit}`,\n );\n return raw.results ?? [];\n },\n\n async getTrends(projectId, events, days = 7) {\n const body = {\n events: events.map((e) => ({ id: e, type: 'events' })),\n date_from: `-${days}d`,\n };\n const raw = await request<{ result: PostHogTrendResult[] }>(\n `/projects/${projectId}/insights/trend`,\n body,\n );\n return raw.result ?? [];\n },\n\n async getFunnels(projectId, steps) {\n const body = {\n events: steps.map((s) => ({ id: s, type: 'events' })),\n };\n const raw = await request<{ result: PostHogFunnelStep[] }>(\n `/projects/${projectId}/insights/funnel`,\n body,\n );\n return raw.result ?? [];\n },\n };\n}\n","// ============================================================================\n// @power-seo/tracking — Plausible API Client\n// ============================================================================\n\nimport type {\n PlausibleClient,\n PlausibleTimeseriesPoint,\n PlausibleBreakdownEntry,\n PlausibleAggregateResult,\n} from '../types.js';\n\nconst PLAUSIBLE_BASE = 'https://plausible.io/api/v1';\n\nexport function createPlausibleClient(apiKey: string, selfHostedUrl?: string): PlausibleClient {\n const baseUrl = selfHostedUrl ? `${selfHostedUrl.replace(/\\/$/, '')}/api/v1` : PLAUSIBLE_BASE;\n\n async function request<T>(path: string): Promise<T> {\n const response = await globalThis.fetch(`${baseUrl}${path}`, {\n headers: {\n Authorization: `Bearer ${apiKey}`,\n 'Content-Type': 'application/json',\n },\n });\n\n if (!response.ok) {\n const text = await response.text();\n throw new Error(`Plausible API error: ${response.status} ${text}`);\n }\n\n return (await response.json()) as T;\n }\n\n return {\n async getTimeseries(siteId, period = '30d') {\n const raw = await request<{ results: PlausibleTimeseriesPoint[] }>(\n `/stats/timeseries?site_id=${encodeURIComponent(siteId)}&period=${period}`,\n );\n return raw.results ?? [];\n },\n\n async getBreakdown(siteId, property, period = '30d') {\n const raw = await request<{ results: PlausibleBreakdownEntry[] }>(\n `/stats/breakdown?site_id=${encodeURIComponent(siteId)}&property=${encodeURIComponent(property)}&period=${period}`,\n );\n return raw.results ?? [];\n },\n\n async getAggregate(siteId, period = '30d') {\n const raw = await request<{ results: PlausibleAggregateResult }>(\n `/stats/aggregate?site_id=${encodeURIComponent(siteId)}&period=${period}&metrics=visitors,pageviews,bounce_rate,visit_duration,events`,\n );\n return raw.results;\n },\n };\n}\n","// ============================================================================\n// @power-seo/tracking — Fathom API Client\n// ============================================================================\n\nimport type { FathomClient, FathomSite, FathomPageview, FathomReferrer } from '../types.js';\n\nconst FATHOM_BASE = 'https://api.usefathom.com/v1';\n\nexport function createFathomClient(apiKey: string): FathomClient {\n async function request<T>(path: string): Promise<T> {\n const response = await globalThis.fetch(`${FATHOM_BASE}${path}`, {\n headers: {\n Authorization: `Bearer ${apiKey}`,\n 'Content-Type': 'application/json',\n },\n });\n\n if (!response.ok) {\n const text = await response.text();\n throw new Error(`Fathom API error: ${response.status} ${text}`);\n }\n\n return (await response.json()) as T;\n }\n\n return {\n async getSites() {\n const raw = await request<{ data: FathomSite[] }>('/sites');\n return raw.data ?? [];\n },\n\n async getPageviews(siteId, period = '30d') {\n const raw = await request<{ data: FathomPageview[] }>(\n `/sites/${siteId}/pages?period=${period}`,\n );\n return raw.data ?? [];\n },\n\n async getReferrers(siteId, period = '30d') {\n const raw = await request<{ data: FathomReferrer[] }>(\n `/sites/${siteId}/referrers?period=${period}`,\n );\n return raw.data ?? [];\n },\n };\n}\n"]}
package/dist/index.js CHANGED
@@ -81,9 +81,7 @@ function buildGA4Script(config) {
81
81
  `gtag('config','${measurementId}',{${anonymizeIp ? "'anonymize_ip':true," : ""}${!sendPageView ? "'send_page_view':false" : ""}});`
82
82
  ];
83
83
  if (consentModeV2) {
84
- configParts.push(
85
- `gtag('consent','update',{'analytics_storage':'granted'});`
86
- );
84
+ configParts.push(`gtag('consent','update',{'analytics_storage':'granted'});`);
87
85
  }
88
86
  scripts.push({
89
87
  id: `ga4-config-${measurementId}`,
@@ -230,9 +228,7 @@ function createClarityClient(apiKey) {
230
228
  },
231
229
  async getHeatmapData(projectId, url) {
232
230
  const encodedUrl = encodeURIComponent(url);
233
- return request(
234
- `/projects/${projectId}/heatmaps?url=${encodedUrl}`
235
- );
231
+ return request(`/projects/${projectId}/heatmaps?url=${encodedUrl}`);
236
232
  }
237
233
  };
238
234
  }
package/dist/index.js.map CHANGED
@@ -1 +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.js","sourcesContent":["// ============================================================================\n// @power-seo/tracking — Consent Manager\n// ============================================================================\n\nimport type { ConsentState, ConsentCategory, ConsentManager, ConsentChangeCallback } from './types.js';\n\nconst DEFAULT_STATE: ConsentState = {\n necessary: true,\n analytics: false,\n marketing: false,\n preferences: false,\n};\n\nexport function createConsentManager(\n initial?: Partial<ConsentState>,\n): ConsentManager {\n const state: ConsentState = {\n ...DEFAULT_STATE,\n ...initial,\n necessary: true, // necessary cannot be overridden\n };\n\n const listeners = new Set<ConsentChangeCallback>();\n\n function notify(): void {\n for (const cb of listeners) {\n cb({ ...state });\n }\n }\n\n return {\n getState() {\n return { ...state };\n },\n\n grant(category: ConsentCategory) {\n if (state[category]) return; // already granted\n state[category] = true;\n notify();\n },\n\n revoke(category: ConsentCategory) {\n if (category === 'necessary') return; // cannot revoke necessary\n if (!state[category]) return; // already revoked\n state[category] = false;\n notify();\n },\n\n grantAll() {\n state.analytics = true;\n state.marketing = true;\n state.preferences = true;\n notify();\n },\n\n revokeAll() {\n state.analytics = false;\n state.marketing = false;\n state.preferences = false;\n notify();\n },\n\n isGranted(category: ConsentCategory) {\n return state[category];\n },\n\n onChange(callback: ConsentChangeCallback) {\n listeners.add(callback);\n return () => {\n listeners.delete(callback);\n };\n },\n };\n}\n","// ============================================================================\n// @power-seo/tracking — GA4 Script Builder\n// ============================================================================\n\nimport type { ScriptConfig, GA4Config, ConsentState } from '../types.js';\n\nexport function buildGA4Script(config: GA4Config): ScriptConfig[] {\n const { measurementId, consentModeV2 = true, anonymizeIp = true, sendPageView = true } = config;\n\n const scripts: ScriptConfig[] = [];\n\n if (consentModeV2) {\n scripts.push({\n id: `ga4-consent-${measurementId}`,\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'});`,\n consentCategory: 'necessary',\n shouldLoad: () => true,\n });\n }\n\n scripts.push({\n id: `ga4-gtag-${measurementId}`,\n src: `https://www.googletagmanager.com/gtag/js?id=${measurementId}`,\n async: true,\n consentCategory: 'analytics',\n shouldLoad: (consent: ConsentState) => consent.analytics,\n });\n\n const configParts = [\n `window.dataLayer=window.dataLayer||[];function gtag(){dataLayer.push(arguments);}gtag('js',new Date());`,\n `gtag('config','${measurementId}',{${anonymizeIp ? \"'anonymize_ip':true,\" : ''}${!sendPageView ? \"'send_page_view':false\" : ''}});`,\n ];\n\n if (consentModeV2) {\n configParts.push(\n `gtag('consent','update',{'analytics_storage':'granted'});`,\n );\n }\n\n scripts.push({\n id: `ga4-config-${measurementId}`,\n innerHTML: configParts.join(''),\n consentCategory: 'analytics',\n shouldLoad: (consent: ConsentState) => consent.analytics,\n });\n\n return scripts;\n}\n","// ============================================================================\n// @power-seo/tracking — Clarity Script Builder\n// ============================================================================\n\nimport type { ScriptConfig, ClarityConfig, ConsentState } from '../types.js';\n\nexport function buildClarityScript(config: ClarityConfig): ScriptConfig {\n const { projectId } = config;\n\n return {\n id: `clarity-${projectId}`,\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}\");`,\n consentCategory: 'analytics',\n shouldLoad: (consent: ConsentState) => consent.analytics,\n };\n}\n","// ============================================================================\n// @power-seo/tracking — PostHog Script Builder\n// ============================================================================\n\nimport type { ScriptConfig, PostHogConfig, ConsentState } from '../types.js';\n\nexport function buildPostHogScript(config: PostHogConfig): ScriptConfig {\n const { apiKey, host = 'https://us.i.posthog.com' } = config;\n\n return {\n id: `posthog-${apiKey}`,\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'});`,\n consentCategory: 'analytics',\n shouldLoad: (consent: ConsentState) => consent.analytics,\n };\n}\n","// ============================================================================\n// @power-seo/tracking — Plausible Script Builder\n// ============================================================================\n\nimport type { ScriptConfig, PlausibleConfig, ConsentState } from '../types.js';\n\nexport function buildPlausibleScript(config: PlausibleConfig): ScriptConfig {\n const { domain, selfHostedUrl } = config;\n const scriptSrc = selfHostedUrl\n ? `${selfHostedUrl.replace(/\\/$/, '')}/js/script.js`\n : 'https://plausible.io/js/script.js';\n\n return {\n id: `plausible-${domain}`,\n src: scriptSrc,\n defer: true,\n consentCategory: 'analytics',\n attributes: {\n 'data-domain': domain,\n },\n shouldLoad: (consent: ConsentState) => consent.analytics,\n };\n}\n","// ============================================================================\n// @power-seo/tracking — Fathom Script Builder\n// ============================================================================\n\nimport type { ScriptConfig, FathomConfig, ConsentState } from '../types.js';\n\nexport function buildFathomScript(config: FathomConfig): ScriptConfig {\n const { siteId } = config;\n\n return {\n id: `fathom-${siteId}`,\n src: 'https://cdn.usefathom.com/script.js',\n defer: true,\n consentCategory: 'analytics',\n attributes: {\n 'data-site': siteId,\n },\n shouldLoad: (consent: ConsentState) => consent.analytics,\n };\n}\n","// ============================================================================\n// @power-seo/tracking — GA4 API Client\n// ============================================================================\n\nimport type {\n GA4Client,\n GA4ReportResponse,\n GA4ReportRow,\n GA4Metadata,\n} from '../types.js';\n\nconst GA4_BASE = 'https://analyticsdata.googleapis.com/v1beta';\n\nexport function createGA4Client(accessToken: string): GA4Client {\n async function request<T>(url: string, body?: unknown): Promise<T> {\n const response = await globalThis.fetch(url, {\n method: body ? 'POST' : 'GET',\n headers: {\n Authorization: `Bearer ${accessToken}`,\n 'Content-Type': 'application/json',\n },\n body: body ? JSON.stringify(body) : undefined,\n });\n\n if (!response.ok) {\n const text = await response.text();\n throw new Error(`GA4 API error: ${response.status} ${text}`);\n }\n\n return (await response.json()) as T;\n }\n\n return {\n async queryReport(propertyId, req) {\n const body = {\n dateRanges: [{ startDate: req.startDate, endDate: req.endDate }],\n metrics: req.metrics.map((m) => ({ name: m })),\n dimensions: (req.dimensions ?? []).map((d) => ({ name: d })),\n limit: req.limit ?? 1000,\n };\n\n const raw = await request<{\n rows?: Array<{\n dimensionValues?: Array<{ value: string }>;\n metricValues?: Array<{ value: string }>;\n }>;\n rowCount?: number;\n metricHeaders?: Array<{ name: string; type: string }>;\n }>(`${GA4_BASE}/properties/${propertyId}:runReport`, body);\n\n const rows: GA4ReportRow[] = (raw.rows ?? []).map((r) => ({\n dimensions: (r.dimensionValues ?? []).map((d) => d.value),\n metrics: (r.metricValues ?? []).map((m) => Number(m.value)),\n }));\n\n return {\n rows,\n rowCount: raw.rowCount ?? rows.length,\n metadata: raw.metricHeaders ? { metricHeaders: raw.metricHeaders } : undefined,\n } satisfies GA4ReportResponse;\n },\n\n async getRealtimeReport(propertyId, metrics) {\n const body = {\n metrics: metrics.map((m) => ({ name: m })),\n };\n\n const raw = await request<{\n rows?: Array<{\n dimensionValues?: Array<{ value: string }>;\n metricValues?: Array<{ value: string }>;\n }>;\n rowCount?: number;\n }>(`${GA4_BASE}/properties/${propertyId}:runRealtimeReport`, body);\n\n const rows: GA4ReportRow[] = (raw.rows ?? []).map((r) => ({\n dimensions: (r.dimensionValues ?? []).map((d) => d.value),\n metrics: (r.metricValues ?? []).map((m) => Number(m.value)),\n }));\n\n return { rows, rowCount: raw.rowCount ?? rows.length } satisfies GA4ReportResponse;\n },\n\n async getMetadata(propertyId) {\n const raw = await request<{\n dimensions?: Array<{ apiName: string; uiName: string; description: string }>;\n metrics?: Array<{ apiName: string; uiName: string; description: string; type: string }>;\n }>(`${GA4_BASE}/properties/${propertyId}/metadata`);\n\n return {\n dimensions: raw.dimensions ?? [],\n metrics: raw.metrics ?? [],\n } satisfies GA4Metadata;\n },\n };\n}\n","// ============================================================================\n// @power-seo/tracking — Clarity API Client\n// ============================================================================\n\nimport type {\n ClarityClient,\n ClarityProject,\n ClarityInsight,\n ClarityHeatmapData,\n} from '../types.js';\n\nconst CLARITY_BASE = 'https://www.clarity.ms/api/v1';\n\nexport function createClarityClient(apiKey: string): ClarityClient {\n async function request<T>(path: string): Promise<T> {\n const response = await globalThis.fetch(`${CLARITY_BASE}${path}`, {\n headers: {\n Authorization: `Bearer ${apiKey}`,\n 'Content-Type': 'application/json',\n },\n });\n\n if (!response.ok) {\n const text = await response.text();\n throw new Error(`Clarity API error: ${response.status} ${text}`);\n }\n\n return (await response.json()) as T;\n }\n\n return {\n async getProjects() {\n return request<ClarityProject[]>('/projects');\n },\n\n async getInsights(projectId) {\n return request<ClarityInsight[]>(`/projects/${projectId}/insights`);\n },\n\n async getHeatmapData(projectId, url) {\n const encodedUrl = encodeURIComponent(url);\n return request<ClarityHeatmapData>(\n `/projects/${projectId}/heatmaps?url=${encodedUrl}`,\n );\n },\n };\n}\n","// ============================================================================\n// @power-seo/tracking — PostHog API Client\n// ============================================================================\n\nimport type {\n PostHogClient,\n PostHogEvent,\n PostHogTrendResult,\n PostHogFunnelStep,\n} from '../types.js';\n\nconst POSTHOG_BASE = 'https://us.posthog.com/api';\n\nexport function createPostHogClient(apiKey: string, host?: string): PostHogClient {\n const baseUrl = host ? `${host.replace(/\\/$/, '')}/api` : POSTHOG_BASE;\n\n async function request<T>(path: string, body?: unknown): Promise<T> {\n const response = await globalThis.fetch(`${baseUrl}${path}`, {\n method: body ? 'POST' : 'GET',\n headers: {\n Authorization: `Bearer ${apiKey}`,\n 'Content-Type': 'application/json',\n },\n body: body ? JSON.stringify(body) : undefined,\n });\n\n if (!response.ok) {\n const text = await response.text();\n throw new Error(`PostHog API error: ${response.status} ${text}`);\n }\n\n return (await response.json()) as T;\n }\n\n return {\n async queryEvents(projectId, event, limit = 100) {\n const raw = await request<{ results: PostHogEvent[] }>(\n `/projects/${projectId}/events?event=${encodeURIComponent(event)}&limit=${limit}`,\n );\n return raw.results ?? [];\n },\n\n async getTrends(projectId, events, days = 7) {\n const body = {\n events: events.map((e) => ({ id: e, type: 'events' })),\n date_from: `-${days}d`,\n };\n const raw = await request<{ result: PostHogTrendResult[] }>(\n `/projects/${projectId}/insights/trend`,\n body,\n );\n return raw.result ?? [];\n },\n\n async getFunnels(projectId, steps) {\n const body = {\n events: steps.map((s) => ({ id: s, type: 'events' })),\n };\n const raw = await request<{ result: PostHogFunnelStep[] }>(\n `/projects/${projectId}/insights/funnel`,\n body,\n );\n return raw.result ?? [];\n },\n };\n}\n","// ============================================================================\n// @power-seo/tracking — Plausible API Client\n// ============================================================================\n\nimport type {\n PlausibleClient,\n PlausibleTimeseriesPoint,\n PlausibleBreakdownEntry,\n PlausibleAggregateResult,\n} from '../types.js';\n\nconst PLAUSIBLE_BASE = 'https://plausible.io/api/v1';\n\nexport function createPlausibleClient(apiKey: string, selfHostedUrl?: string): PlausibleClient {\n const baseUrl = selfHostedUrl\n ? `${selfHostedUrl.replace(/\\/$/, '')}/api/v1`\n : PLAUSIBLE_BASE;\n\n async function request<T>(path: string): Promise<T> {\n const response = await globalThis.fetch(`${baseUrl}${path}`, {\n headers: {\n Authorization: `Bearer ${apiKey}`,\n 'Content-Type': 'application/json',\n },\n });\n\n if (!response.ok) {\n const text = await response.text();\n throw new Error(`Plausible API error: ${response.status} ${text}`);\n }\n\n return (await response.json()) as T;\n }\n\n return {\n async getTimeseries(siteId, period = '30d') {\n const raw = await request<{ results: PlausibleTimeseriesPoint[] }>(\n `/stats/timeseries?site_id=${encodeURIComponent(siteId)}&period=${period}`,\n );\n return raw.results ?? [];\n },\n\n async getBreakdown(siteId, property, period = '30d') {\n const raw = await request<{ results: PlausibleBreakdownEntry[] }>(\n `/stats/breakdown?site_id=${encodeURIComponent(siteId)}&property=${encodeURIComponent(property)}&period=${period}`,\n );\n return raw.results ?? [];\n },\n\n async getAggregate(siteId, period = '30d') {\n const raw = await request<{ results: PlausibleAggregateResult }>(\n `/stats/aggregate?site_id=${encodeURIComponent(siteId)}&period=${period}&metrics=visitors,pageviews,bounce_rate,visit_duration,events`,\n );\n return raw.results;\n },\n };\n}\n","// ============================================================================\n// @power-seo/tracking — Fathom API Client\n// ============================================================================\n\nimport type {\n FathomClient,\n FathomSite,\n FathomPageview,\n FathomReferrer,\n} from '../types.js';\n\nconst FATHOM_BASE = 'https://api.usefathom.com/v1';\n\nexport function createFathomClient(apiKey: string): FathomClient {\n async function request<T>(path: string): Promise<T> {\n const response = await globalThis.fetch(`${FATHOM_BASE}${path}`, {\n headers: {\n Authorization: `Bearer ${apiKey}`,\n 'Content-Type': 'application/json',\n },\n });\n\n if (!response.ok) {\n const text = await response.text();\n throw new Error(`Fathom API error: ${response.status} ${text}`);\n }\n\n return (await response.json()) as T;\n }\n\n return {\n async getSites() {\n const raw = await request<{ data: FathomSite[] }>('/sites');\n return raw.data ?? [];\n },\n\n async getPageviews(siteId, period = '30d') {\n const raw = await request<{ data: FathomPageview[] }>(\n `/sites/${siteId}/pages?period=${period}`,\n );\n return raw.data ?? [];\n },\n\n async getReferrers(siteId, period = '30d') {\n const raw = await request<{ data: FathomReferrer[] }>(\n `/sites/${siteId}/referrers?period=${period}`,\n );\n return raw.data ?? [];\n },\n };\n}\n"]}
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.js","sourcesContent":["// ============================================================================\n// @power-seo/tracking — Consent Manager\n// ============================================================================\n\nimport type {\n ConsentState,\n ConsentCategory,\n ConsentManager,\n ConsentChangeCallback,\n} from './types.js';\n\nconst DEFAULT_STATE: ConsentState = {\n necessary: true,\n analytics: false,\n marketing: false,\n preferences: false,\n};\n\nexport function createConsentManager(initial?: Partial<ConsentState>): ConsentManager {\n const state: ConsentState = {\n ...DEFAULT_STATE,\n ...initial,\n necessary: true, // necessary cannot be overridden\n };\n\n const listeners = new Set<ConsentChangeCallback>();\n\n function notify(): void {\n for (const cb of listeners) {\n cb({ ...state });\n }\n }\n\n return {\n getState() {\n return { ...state };\n },\n\n grant(category: ConsentCategory) {\n if (state[category]) return; // already granted\n state[category] = true;\n notify();\n },\n\n revoke(category: ConsentCategory) {\n if (category === 'necessary') return; // cannot revoke necessary\n if (!state[category]) return; // already revoked\n state[category] = false;\n notify();\n },\n\n grantAll() {\n state.analytics = true;\n state.marketing = true;\n state.preferences = true;\n notify();\n },\n\n revokeAll() {\n state.analytics = false;\n state.marketing = false;\n state.preferences = false;\n notify();\n },\n\n isGranted(category: ConsentCategory) {\n return state[category];\n },\n\n onChange(callback: ConsentChangeCallback) {\n listeners.add(callback);\n return () => {\n listeners.delete(callback);\n };\n },\n };\n}\n","// ============================================================================\n// @power-seo/tracking — GA4 Script Builder\n// ============================================================================\n\nimport type { ScriptConfig, GA4Config, ConsentState } from '../types.js';\n\nexport function buildGA4Script(config: GA4Config): ScriptConfig[] {\n const { measurementId, consentModeV2 = true, anonymizeIp = true, sendPageView = true } = config;\n\n const scripts: ScriptConfig[] = [];\n\n if (consentModeV2) {\n scripts.push({\n id: `ga4-consent-${measurementId}`,\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'});`,\n consentCategory: 'necessary',\n shouldLoad: () => true,\n });\n }\n\n scripts.push({\n id: `ga4-gtag-${measurementId}`,\n src: `https://www.googletagmanager.com/gtag/js?id=${measurementId}`,\n async: true,\n consentCategory: 'analytics',\n shouldLoad: (consent: ConsentState) => consent.analytics,\n });\n\n const configParts = [\n `window.dataLayer=window.dataLayer||[];function gtag(){dataLayer.push(arguments);}gtag('js',new Date());`,\n `gtag('config','${measurementId}',{${anonymizeIp ? \"'anonymize_ip':true,\" : ''}${!sendPageView ? \"'send_page_view':false\" : ''}});`,\n ];\n\n if (consentModeV2) {\n configParts.push(`gtag('consent','update',{'analytics_storage':'granted'});`);\n }\n\n scripts.push({\n id: `ga4-config-${measurementId}`,\n innerHTML: configParts.join(''),\n consentCategory: 'analytics',\n shouldLoad: (consent: ConsentState) => consent.analytics,\n });\n\n return scripts;\n}\n","// ============================================================================\n// @power-seo/tracking — Clarity Script Builder\n// ============================================================================\n\nimport type { ScriptConfig, ClarityConfig, ConsentState } from '../types.js';\n\nexport function buildClarityScript(config: ClarityConfig): ScriptConfig {\n const { projectId } = config;\n\n return {\n id: `clarity-${projectId}`,\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}\");`,\n consentCategory: 'analytics',\n shouldLoad: (consent: ConsentState) => consent.analytics,\n };\n}\n","// ============================================================================\n// @power-seo/tracking — PostHog Script Builder\n// ============================================================================\n\nimport type { ScriptConfig, PostHogConfig, ConsentState } from '../types.js';\n\nexport function buildPostHogScript(config: PostHogConfig): ScriptConfig {\n const { apiKey, host = 'https://us.i.posthog.com' } = config;\n\n return {\n id: `posthog-${apiKey}`,\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'});`,\n consentCategory: 'analytics',\n shouldLoad: (consent: ConsentState) => consent.analytics,\n };\n}\n","// ============================================================================\n// @power-seo/tracking — Plausible Script Builder\n// ============================================================================\n\nimport type { ScriptConfig, PlausibleConfig, ConsentState } from '../types.js';\n\nexport function buildPlausibleScript(config: PlausibleConfig): ScriptConfig {\n const { domain, selfHostedUrl } = config;\n const scriptSrc = selfHostedUrl\n ? `${selfHostedUrl.replace(/\\/$/, '')}/js/script.js`\n : 'https://plausible.io/js/script.js';\n\n return {\n id: `plausible-${domain}`,\n src: scriptSrc,\n defer: true,\n consentCategory: 'analytics',\n attributes: {\n 'data-domain': domain,\n },\n shouldLoad: (consent: ConsentState) => consent.analytics,\n };\n}\n","// ============================================================================\n// @power-seo/tracking — Fathom Script Builder\n// ============================================================================\n\nimport type { ScriptConfig, FathomConfig, ConsentState } from '../types.js';\n\nexport function buildFathomScript(config: FathomConfig): ScriptConfig {\n const { siteId } = config;\n\n return {\n id: `fathom-${siteId}`,\n src: 'https://cdn.usefathom.com/script.js',\n defer: true,\n consentCategory: 'analytics',\n attributes: {\n 'data-site': siteId,\n },\n shouldLoad: (consent: ConsentState) => consent.analytics,\n };\n}\n","// ============================================================================\n// @power-seo/tracking — GA4 API Client\n// ============================================================================\n\nimport type { GA4Client, GA4ReportResponse, GA4ReportRow, GA4Metadata } from '../types.js';\n\nconst GA4_BASE = 'https://analyticsdata.googleapis.com/v1beta';\n\nexport function createGA4Client(accessToken: string): GA4Client {\n async function request<T>(url: string, body?: unknown): Promise<T> {\n const response = await globalThis.fetch(url, {\n method: body ? 'POST' : 'GET',\n headers: {\n Authorization: `Bearer ${accessToken}`,\n 'Content-Type': 'application/json',\n },\n body: body ? JSON.stringify(body) : undefined,\n });\n\n if (!response.ok) {\n const text = await response.text();\n throw new Error(`GA4 API error: ${response.status} ${text}`);\n }\n\n return (await response.json()) as T;\n }\n\n return {\n async queryReport(propertyId, req) {\n const body = {\n dateRanges: [{ startDate: req.startDate, endDate: req.endDate }],\n metrics: req.metrics.map((m) => ({ name: m })),\n dimensions: (req.dimensions ?? []).map((d) => ({ name: d })),\n limit: req.limit ?? 1000,\n };\n\n const raw = await request<{\n rows?: Array<{\n dimensionValues?: Array<{ value: string }>;\n metricValues?: Array<{ value: string }>;\n }>;\n rowCount?: number;\n metricHeaders?: Array<{ name: string; type: string }>;\n }>(`${GA4_BASE}/properties/${propertyId}:runReport`, body);\n\n const rows: GA4ReportRow[] = (raw.rows ?? []).map((r) => ({\n dimensions: (r.dimensionValues ?? []).map((d) => d.value),\n metrics: (r.metricValues ?? []).map((m) => Number(m.value)),\n }));\n\n return {\n rows,\n rowCount: raw.rowCount ?? rows.length,\n metadata: raw.metricHeaders ? { metricHeaders: raw.metricHeaders } : undefined,\n } satisfies GA4ReportResponse;\n },\n\n async getRealtimeReport(propertyId, metrics) {\n const body = {\n metrics: metrics.map((m) => ({ name: m })),\n };\n\n const raw = await request<{\n rows?: Array<{\n dimensionValues?: Array<{ value: string }>;\n metricValues?: Array<{ value: string }>;\n }>;\n rowCount?: number;\n }>(`${GA4_BASE}/properties/${propertyId}:runRealtimeReport`, body);\n\n const rows: GA4ReportRow[] = (raw.rows ?? []).map((r) => ({\n dimensions: (r.dimensionValues ?? []).map((d) => d.value),\n metrics: (r.metricValues ?? []).map((m) => Number(m.value)),\n }));\n\n return { rows, rowCount: raw.rowCount ?? rows.length } satisfies GA4ReportResponse;\n },\n\n async getMetadata(propertyId) {\n const raw = await request<{\n dimensions?: Array<{ apiName: string; uiName: string; description: string }>;\n metrics?: Array<{ apiName: string; uiName: string; description: string; type: string }>;\n }>(`${GA4_BASE}/properties/${propertyId}/metadata`);\n\n return {\n dimensions: raw.dimensions ?? [],\n metrics: raw.metrics ?? [],\n } satisfies GA4Metadata;\n },\n };\n}\n","// ============================================================================\n// @power-seo/tracking — Clarity API Client\n// ============================================================================\n\nimport type {\n ClarityClient,\n ClarityProject,\n ClarityInsight,\n ClarityHeatmapData,\n} from '../types.js';\n\nconst CLARITY_BASE = 'https://www.clarity.ms/api/v1';\n\nexport function createClarityClient(apiKey: string): ClarityClient {\n async function request<T>(path: string): Promise<T> {\n const response = await globalThis.fetch(`${CLARITY_BASE}${path}`, {\n headers: {\n Authorization: `Bearer ${apiKey}`,\n 'Content-Type': 'application/json',\n },\n });\n\n if (!response.ok) {\n const text = await response.text();\n throw new Error(`Clarity API error: ${response.status} ${text}`);\n }\n\n return (await response.json()) as T;\n }\n\n return {\n async getProjects() {\n return request<ClarityProject[]>('/projects');\n },\n\n async getInsights(projectId) {\n return request<ClarityInsight[]>(`/projects/${projectId}/insights`);\n },\n\n async getHeatmapData(projectId, url) {\n const encodedUrl = encodeURIComponent(url);\n return request<ClarityHeatmapData>(`/projects/${projectId}/heatmaps?url=${encodedUrl}`);\n },\n };\n}\n","// ============================================================================\n// @power-seo/tracking — PostHog API Client\n// ============================================================================\n\nimport type {\n PostHogClient,\n PostHogEvent,\n PostHogTrendResult,\n PostHogFunnelStep,\n} from '../types.js';\n\nconst POSTHOG_BASE = 'https://us.posthog.com/api';\n\nexport function createPostHogClient(apiKey: string, host?: string): PostHogClient {\n const baseUrl = host ? `${host.replace(/\\/$/, '')}/api` : POSTHOG_BASE;\n\n async function request<T>(path: string, body?: unknown): Promise<T> {\n const response = await globalThis.fetch(`${baseUrl}${path}`, {\n method: body ? 'POST' : 'GET',\n headers: {\n Authorization: `Bearer ${apiKey}`,\n 'Content-Type': 'application/json',\n },\n body: body ? JSON.stringify(body) : undefined,\n });\n\n if (!response.ok) {\n const text = await response.text();\n throw new Error(`PostHog API error: ${response.status} ${text}`);\n }\n\n return (await response.json()) as T;\n }\n\n return {\n async queryEvents(projectId, event, limit = 100) {\n const raw = await request<{ results: PostHogEvent[] }>(\n `/projects/${projectId}/events?event=${encodeURIComponent(event)}&limit=${limit}`,\n );\n return raw.results ?? [];\n },\n\n async getTrends(projectId, events, days = 7) {\n const body = {\n events: events.map((e) => ({ id: e, type: 'events' })),\n date_from: `-${days}d`,\n };\n const raw = await request<{ result: PostHogTrendResult[] }>(\n `/projects/${projectId}/insights/trend`,\n body,\n );\n return raw.result ?? [];\n },\n\n async getFunnels(projectId, steps) {\n const body = {\n events: steps.map((s) => ({ id: s, type: 'events' })),\n };\n const raw = await request<{ result: PostHogFunnelStep[] }>(\n `/projects/${projectId}/insights/funnel`,\n body,\n );\n return raw.result ?? [];\n },\n };\n}\n","// ============================================================================\n// @power-seo/tracking — Plausible API Client\n// ============================================================================\n\nimport type {\n PlausibleClient,\n PlausibleTimeseriesPoint,\n PlausibleBreakdownEntry,\n PlausibleAggregateResult,\n} from '../types.js';\n\nconst PLAUSIBLE_BASE = 'https://plausible.io/api/v1';\n\nexport function createPlausibleClient(apiKey: string, selfHostedUrl?: string): PlausibleClient {\n const baseUrl = selfHostedUrl ? `${selfHostedUrl.replace(/\\/$/, '')}/api/v1` : PLAUSIBLE_BASE;\n\n async function request<T>(path: string): Promise<T> {\n const response = await globalThis.fetch(`${baseUrl}${path}`, {\n headers: {\n Authorization: `Bearer ${apiKey}`,\n 'Content-Type': 'application/json',\n },\n });\n\n if (!response.ok) {\n const text = await response.text();\n throw new Error(`Plausible API error: ${response.status} ${text}`);\n }\n\n return (await response.json()) as T;\n }\n\n return {\n async getTimeseries(siteId, period = '30d') {\n const raw = await request<{ results: PlausibleTimeseriesPoint[] }>(\n `/stats/timeseries?site_id=${encodeURIComponent(siteId)}&period=${period}`,\n );\n return raw.results ?? [];\n },\n\n async getBreakdown(siteId, property, period = '30d') {\n const raw = await request<{ results: PlausibleBreakdownEntry[] }>(\n `/stats/breakdown?site_id=${encodeURIComponent(siteId)}&property=${encodeURIComponent(property)}&period=${period}`,\n );\n return raw.results ?? [];\n },\n\n async getAggregate(siteId, period = '30d') {\n const raw = await request<{ results: PlausibleAggregateResult }>(\n `/stats/aggregate?site_id=${encodeURIComponent(siteId)}&period=${period}&metrics=visitors,pageviews,bounce_rate,visit_duration,events`,\n );\n return raw.results;\n },\n };\n}\n","// ============================================================================\n// @power-seo/tracking — Fathom API Client\n// ============================================================================\n\nimport type { FathomClient, FathomSite, FathomPageview, FathomReferrer } from '../types.js';\n\nconst FATHOM_BASE = 'https://api.usefathom.com/v1';\n\nexport function createFathomClient(apiKey: string): FathomClient {\n async function request<T>(path: string): Promise<T> {\n const response = await globalThis.fetch(`${FATHOM_BASE}${path}`, {\n headers: {\n Authorization: `Bearer ${apiKey}`,\n 'Content-Type': 'application/json',\n },\n });\n\n if (!response.ok) {\n const text = await response.text();\n throw new Error(`Fathom API error: ${response.status} ${text}`);\n }\n\n return (await response.json()) as T;\n }\n\n return {\n async getSites() {\n const raw = await request<{ data: FathomSite[] }>('/sites');\n return raw.data ?? [];\n },\n\n async getPageviews(siteId, period = '30d') {\n const raw = await request<{ data: FathomPageview[] }>(\n `/sites/${siteId}/pages?period=${period}`,\n );\n return raw.data ?? [];\n },\n\n async getReferrers(siteId, period = '30d') {\n const raw = await request<{ data: FathomReferrer[] }>(\n `/sites/${siteId}/referrers?period=${period}`,\n );\n return raw.data ?? [];\n },\n };\n}\n"]}
package/dist/react.cjs CHANGED
@@ -15,9 +15,7 @@ function AnalyticsScript({ scripts, consent }) {
15
15
  src: script.src,
16
16
  async: script.async ?? false,
17
17
  defer: script.defer ?? false,
18
- ...Object.fromEntries(
19
- Object.entries(script.attributes ?? {}).map(([k, v]) => [k, v])
20
- )
18
+ ...Object.fromEntries(Object.entries(script.attributes ?? {}).map(([k, v]) => [k, v]))
21
19
  }) : react.createElement("script", {
22
20
  key: script.id,
23
21
  dangerouslySetInnerHTML: { __html: script.innerHTML ?? "" }
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/react.ts"],"names":["createElement","useState","useEffect","useCallback"],"mappings":"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","file":"react.cjs","sourcesContent":["// ============================================================================\n// @power-seo/tracking — React Components\n// ============================================================================\n\nimport { createElement, useEffect, useState, useCallback } from 'react';\nimport type { ScriptConfig, ConsentManager, ConsentState } from './types.js';\n\n// --- AnalyticsScript ---\n\nexport interface AnalyticsScriptProps {\n scripts: ScriptConfig[];\n consent: ConsentState;\n}\n\nexport function AnalyticsScript({ scripts, consent }: AnalyticsScriptProps) {\n const loadable = scripts.filter((s) => s.shouldLoad(consent));\n\n if (loadable.length === 0) return null;\n\n return createElement(\n 'div',\n { 'data-testid': 'analytics-scripts' },\n ...loadable.map((script) =>\n script.src\n ? createElement('script', {\n key: script.id,\n src: script.src,\n async: script.async ?? false,\n defer: script.defer ?? false,\n ...Object.fromEntries(\n Object.entries(script.attributes ?? {}).map(([k, v]) => [k, v]),\n ),\n })\n : createElement('script', {\n key: script.id,\n dangerouslySetInnerHTML: { __html: script.innerHTML ?? '' },\n }),\n ),\n );\n}\n\n// --- ConsentBanner ---\n\nexport interface ConsentBannerProps {\n manager: ConsentManager;\n privacyPolicyUrl?: string;\n}\n\nexport function ConsentBanner({ manager, privacyPolicyUrl }: ConsentBannerProps) {\n const [state, setState] = useState<ConsentState>(manager.getState());\n const [visible, setVisible] = useState(!state.analytics);\n\n useEffect(() => {\n return manager.onChange((newState) => {\n setState(newState);\n });\n }, [manager]);\n\n const handleAcceptAll = useCallback(() => {\n manager.grantAll();\n setVisible(false);\n }, [manager]);\n\n const handleRejectAll = useCallback(() => {\n manager.revokeAll();\n setVisible(false);\n }, [manager]);\n\n if (!visible) return null;\n\n return createElement(\n 'div',\n {\n 'data-testid': 'consent-banner',\n role: 'dialog',\n 'aria-label': 'Cookie consent',\n style: {\n position: 'fixed',\n bottom: 0,\n left: 0,\n right: 0,\n padding: '16px 24px',\n backgroundColor: '#fff',\n borderTop: '1px solid #e0e0e0',\n boxShadow: '0 -2px 10px rgba(0,0,0,0.1)',\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n gap: '16px',\n fontFamily: 'system-ui, -apple-system, sans-serif',\n fontSize: '14px',\n zIndex: 9999,\n },\n },\n createElement(\n 'div',\n { style: { flex: 1 } },\n createElement(\n 'p',\n { style: { margin: 0, color: '#333' } },\n 'We use cookies to improve your experience and analyze site traffic.',\n privacyPolicyUrl\n ? createElement(\n 'a',\n {\n href: privacyPolicyUrl,\n style: { marginLeft: '4px', color: '#1a73e8', textDecoration: 'underline' },\n target: '_blank',\n rel: 'noopener noreferrer',\n },\n 'Privacy Policy',\n )\n : null,\n ),\n ),\n createElement(\n 'div',\n { style: { display: 'flex', gap: '8px', flexShrink: 0 } },\n createElement(\n 'button',\n {\n 'data-testid': 'consent-reject',\n onClick: handleRejectAll,\n style: {\n padding: '8px 16px',\n border: '1px solid #dadce0',\n borderRadius: '4px',\n backgroundColor: '#fff',\n cursor: 'pointer',\n fontSize: '13px',\n color: '#333',\n },\n },\n 'Reject All',\n ),\n createElement(\n 'button',\n {\n 'data-testid': 'consent-accept',\n onClick: handleAcceptAll,\n style: {\n padding: '8px 16px',\n border: 'none',\n borderRadius: '4px',\n backgroundColor: '#1a73e8',\n color: '#fff',\n cursor: 'pointer',\n fontSize: '13px',\n },\n },\n 'Accept All',\n ),\n ),\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/react.ts"],"names":["createElement","useState","useEffect","useCallback"],"mappings":"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","file":"react.cjs","sourcesContent":["// ============================================================================\n// @power-seo/tracking — React Components\n// ============================================================================\n\nimport { createElement, useEffect, useState, useCallback } from 'react';\nimport type { ScriptConfig, ConsentManager, ConsentState } from './types.js';\n\n// --- AnalyticsScript ---\n\nexport interface AnalyticsScriptProps {\n scripts: ScriptConfig[];\n consent: ConsentState;\n}\n\nexport function AnalyticsScript({ scripts, consent }: AnalyticsScriptProps) {\n const loadable = scripts.filter((s) => s.shouldLoad(consent));\n\n if (loadable.length === 0) return null;\n\n return createElement(\n 'div',\n { 'data-testid': 'analytics-scripts' },\n ...loadable.map((script) =>\n script.src\n ? createElement('script', {\n key: script.id,\n src: script.src,\n async: script.async ?? false,\n defer: script.defer ?? false,\n ...Object.fromEntries(Object.entries(script.attributes ?? {}).map(([k, v]) => [k, v])),\n })\n : createElement('script', {\n key: script.id,\n dangerouslySetInnerHTML: { __html: script.innerHTML ?? '' },\n }),\n ),\n );\n}\n\n// --- ConsentBanner ---\n\nexport interface ConsentBannerProps {\n manager: ConsentManager;\n privacyPolicyUrl?: string;\n}\n\nexport function ConsentBanner({ manager, privacyPolicyUrl }: ConsentBannerProps) {\n const [state, setState] = useState<ConsentState>(manager.getState());\n const [visible, setVisible] = useState(!state.analytics);\n\n useEffect(() => {\n return manager.onChange((newState) => {\n setState(newState);\n });\n }, [manager]);\n\n const handleAcceptAll = useCallback(() => {\n manager.grantAll();\n setVisible(false);\n }, [manager]);\n\n const handleRejectAll = useCallback(() => {\n manager.revokeAll();\n setVisible(false);\n }, [manager]);\n\n if (!visible) return null;\n\n return createElement(\n 'div',\n {\n 'data-testid': 'consent-banner',\n role: 'dialog',\n 'aria-label': 'Cookie consent',\n style: {\n position: 'fixed',\n bottom: 0,\n left: 0,\n right: 0,\n padding: '16px 24px',\n backgroundColor: '#fff',\n borderTop: '1px solid #e0e0e0',\n boxShadow: '0 -2px 10px rgba(0,0,0,0.1)',\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n gap: '16px',\n fontFamily: 'system-ui, -apple-system, sans-serif',\n fontSize: '14px',\n zIndex: 9999,\n },\n },\n createElement(\n 'div',\n { style: { flex: 1 } },\n createElement(\n 'p',\n { style: { margin: 0, color: '#333' } },\n 'We use cookies to improve your experience and analyze site traffic.',\n privacyPolicyUrl\n ? createElement(\n 'a',\n {\n href: privacyPolicyUrl,\n style: { marginLeft: '4px', color: '#1a73e8', textDecoration: 'underline' },\n target: '_blank',\n rel: 'noopener noreferrer',\n },\n 'Privacy Policy',\n )\n : null,\n ),\n ),\n createElement(\n 'div',\n { style: { display: 'flex', gap: '8px', flexShrink: 0 } },\n createElement(\n 'button',\n {\n 'data-testid': 'consent-reject',\n onClick: handleRejectAll,\n style: {\n padding: '8px 16px',\n border: '1px solid #dadce0',\n borderRadius: '4px',\n backgroundColor: '#fff',\n cursor: 'pointer',\n fontSize: '13px',\n color: '#333',\n },\n },\n 'Reject All',\n ),\n createElement(\n 'button',\n {\n 'data-testid': 'consent-accept',\n onClick: handleAcceptAll,\n style: {\n padding: '8px 16px',\n border: 'none',\n borderRadius: '4px',\n backgroundColor: '#1a73e8',\n color: '#fff',\n cursor: 'pointer',\n fontSize: '13px',\n },\n },\n 'Accept All',\n ),\n ),\n );\n}\n"]}
package/dist/react.js CHANGED
@@ -13,9 +13,7 @@ function AnalyticsScript({ scripts, consent }) {
13
13
  src: script.src,
14
14
  async: script.async ?? false,
15
15
  defer: script.defer ?? false,
16
- ...Object.fromEntries(
17
- Object.entries(script.attributes ?? {}).map(([k, v]) => [k, v])
18
- )
16
+ ...Object.fromEntries(Object.entries(script.attributes ?? {}).map(([k, v]) => [k, v]))
19
17
  }) : createElement("script", {
20
18
  key: script.id,
21
19
  dangerouslySetInnerHTML: { __html: script.innerHTML ?? "" }
package/dist/react.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/react.ts"],"names":[],"mappings":"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","file":"react.js","sourcesContent":["// ============================================================================\n// @power-seo/tracking — React Components\n// ============================================================================\n\nimport { createElement, useEffect, useState, useCallback } from 'react';\nimport type { ScriptConfig, ConsentManager, ConsentState } from './types.js';\n\n// --- AnalyticsScript ---\n\nexport interface AnalyticsScriptProps {\n scripts: ScriptConfig[];\n consent: ConsentState;\n}\n\nexport function AnalyticsScript({ scripts, consent }: AnalyticsScriptProps) {\n const loadable = scripts.filter((s) => s.shouldLoad(consent));\n\n if (loadable.length === 0) return null;\n\n return createElement(\n 'div',\n { 'data-testid': 'analytics-scripts' },\n ...loadable.map((script) =>\n script.src\n ? createElement('script', {\n key: script.id,\n src: script.src,\n async: script.async ?? false,\n defer: script.defer ?? false,\n ...Object.fromEntries(\n Object.entries(script.attributes ?? {}).map(([k, v]) => [k, v]),\n ),\n })\n : createElement('script', {\n key: script.id,\n dangerouslySetInnerHTML: { __html: script.innerHTML ?? '' },\n }),\n ),\n );\n}\n\n// --- ConsentBanner ---\n\nexport interface ConsentBannerProps {\n manager: ConsentManager;\n privacyPolicyUrl?: string;\n}\n\nexport function ConsentBanner({ manager, privacyPolicyUrl }: ConsentBannerProps) {\n const [state, setState] = useState<ConsentState>(manager.getState());\n const [visible, setVisible] = useState(!state.analytics);\n\n useEffect(() => {\n return manager.onChange((newState) => {\n setState(newState);\n });\n }, [manager]);\n\n const handleAcceptAll = useCallback(() => {\n manager.grantAll();\n setVisible(false);\n }, [manager]);\n\n const handleRejectAll = useCallback(() => {\n manager.revokeAll();\n setVisible(false);\n }, [manager]);\n\n if (!visible) return null;\n\n return createElement(\n 'div',\n {\n 'data-testid': 'consent-banner',\n role: 'dialog',\n 'aria-label': 'Cookie consent',\n style: {\n position: 'fixed',\n bottom: 0,\n left: 0,\n right: 0,\n padding: '16px 24px',\n backgroundColor: '#fff',\n borderTop: '1px solid #e0e0e0',\n boxShadow: '0 -2px 10px rgba(0,0,0,0.1)',\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n gap: '16px',\n fontFamily: 'system-ui, -apple-system, sans-serif',\n fontSize: '14px',\n zIndex: 9999,\n },\n },\n createElement(\n 'div',\n { style: { flex: 1 } },\n createElement(\n 'p',\n { style: { margin: 0, color: '#333' } },\n 'We use cookies to improve your experience and analyze site traffic.',\n privacyPolicyUrl\n ? createElement(\n 'a',\n {\n href: privacyPolicyUrl,\n style: { marginLeft: '4px', color: '#1a73e8', textDecoration: 'underline' },\n target: '_blank',\n rel: 'noopener noreferrer',\n },\n 'Privacy Policy',\n )\n : null,\n ),\n ),\n createElement(\n 'div',\n { style: { display: 'flex', gap: '8px', flexShrink: 0 } },\n createElement(\n 'button',\n {\n 'data-testid': 'consent-reject',\n onClick: handleRejectAll,\n style: {\n padding: '8px 16px',\n border: '1px solid #dadce0',\n borderRadius: '4px',\n backgroundColor: '#fff',\n cursor: 'pointer',\n fontSize: '13px',\n color: '#333',\n },\n },\n 'Reject All',\n ),\n createElement(\n 'button',\n {\n 'data-testid': 'consent-accept',\n onClick: handleAcceptAll,\n style: {\n padding: '8px 16px',\n border: 'none',\n borderRadius: '4px',\n backgroundColor: '#1a73e8',\n color: '#fff',\n cursor: 'pointer',\n fontSize: '13px',\n },\n },\n 'Accept All',\n ),\n ),\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/react.ts"],"names":[],"mappings":"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","file":"react.js","sourcesContent":["// ============================================================================\n// @power-seo/tracking — React Components\n// ============================================================================\n\nimport { createElement, useEffect, useState, useCallback } from 'react';\nimport type { ScriptConfig, ConsentManager, ConsentState } from './types.js';\n\n// --- AnalyticsScript ---\n\nexport interface AnalyticsScriptProps {\n scripts: ScriptConfig[];\n consent: ConsentState;\n}\n\nexport function AnalyticsScript({ scripts, consent }: AnalyticsScriptProps) {\n const loadable = scripts.filter((s) => s.shouldLoad(consent));\n\n if (loadable.length === 0) return null;\n\n return createElement(\n 'div',\n { 'data-testid': 'analytics-scripts' },\n ...loadable.map((script) =>\n script.src\n ? createElement('script', {\n key: script.id,\n src: script.src,\n async: script.async ?? false,\n defer: script.defer ?? false,\n ...Object.fromEntries(Object.entries(script.attributes ?? {}).map(([k, v]) => [k, v])),\n })\n : createElement('script', {\n key: script.id,\n dangerouslySetInnerHTML: { __html: script.innerHTML ?? '' },\n }),\n ),\n );\n}\n\n// --- ConsentBanner ---\n\nexport interface ConsentBannerProps {\n manager: ConsentManager;\n privacyPolicyUrl?: string;\n}\n\nexport function ConsentBanner({ manager, privacyPolicyUrl }: ConsentBannerProps) {\n const [state, setState] = useState<ConsentState>(manager.getState());\n const [visible, setVisible] = useState(!state.analytics);\n\n useEffect(() => {\n return manager.onChange((newState) => {\n setState(newState);\n });\n }, [manager]);\n\n const handleAcceptAll = useCallback(() => {\n manager.grantAll();\n setVisible(false);\n }, [manager]);\n\n const handleRejectAll = useCallback(() => {\n manager.revokeAll();\n setVisible(false);\n }, [manager]);\n\n if (!visible) return null;\n\n return createElement(\n 'div',\n {\n 'data-testid': 'consent-banner',\n role: 'dialog',\n 'aria-label': 'Cookie consent',\n style: {\n position: 'fixed',\n bottom: 0,\n left: 0,\n right: 0,\n padding: '16px 24px',\n backgroundColor: '#fff',\n borderTop: '1px solid #e0e0e0',\n boxShadow: '0 -2px 10px rgba(0,0,0,0.1)',\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n gap: '16px',\n fontFamily: 'system-ui, -apple-system, sans-serif',\n fontSize: '14px',\n zIndex: 9999,\n },\n },\n createElement(\n 'div',\n { style: { flex: 1 } },\n createElement(\n 'p',\n { style: { margin: 0, color: '#333' } },\n 'We use cookies to improve your experience and analyze site traffic.',\n privacyPolicyUrl\n ? createElement(\n 'a',\n {\n href: privacyPolicyUrl,\n style: { marginLeft: '4px', color: '#1a73e8', textDecoration: 'underline' },\n target: '_blank',\n rel: 'noopener noreferrer',\n },\n 'Privacy Policy',\n )\n : null,\n ),\n ),\n createElement(\n 'div',\n { style: { display: 'flex', gap: '8px', flexShrink: 0 } },\n createElement(\n 'button',\n {\n 'data-testid': 'consent-reject',\n onClick: handleRejectAll,\n style: {\n padding: '8px 16px',\n border: '1px solid #dadce0',\n borderRadius: '4px',\n backgroundColor: '#fff',\n cursor: 'pointer',\n fontSize: '13px',\n color: '#333',\n },\n },\n 'Reject All',\n ),\n createElement(\n 'button',\n {\n 'data-testid': 'consent-accept',\n onClick: handleAcceptAll,\n style: {\n padding: '8px 16px',\n border: 'none',\n borderRadius: '4px',\n backgroundColor: '#1a73e8',\n color: '#fff',\n cursor: 'pointer',\n fontSize: '13px',\n },\n },\n 'Accept All',\n ),\n ),\n );\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@power-seo/tracking",
3
- "version": "1.0.1",
3
+ "version": "1.0.4",
4
4
  "description": "Analytics platform integration with script builders, consent management, and React components",
5
5
  "license": "MIT",
6
6
  "type": "module",