@happyvertical/analytics 0.80.0 → 0.80.1
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/chunks/ga4-B69in3EQ.js +668 -0
- package/dist/chunks/ga4-B69in3EQ.js.map +1 -0
- package/dist/chunks/matomo-CUUG_Drb.js +853 -0
- package/dist/chunks/matomo-CUUG_Drb.js.map +1 -0
- package/dist/chunks/plausible-dXl_rz_8.js +396 -0
- package/dist/chunks/plausible-dXl_rz_8.js.map +1 -0
- package/dist/chunks/types-zsbKROGX.js +93 -0
- package/dist/chunks/types-zsbKROGX.js.map +1 -0
- package/dist/cli/claude-context.js +17 -17
- package/dist/cli/claude-context.js.map +1 -1
- package/dist/index.js +104 -127
- package/dist/index.js.map +1 -1
- package/package.json +5 -5
- package/dist/chunks/ga4-6gyDPZRn.js +0 -863
- package/dist/chunks/ga4-6gyDPZRn.js.map +0 -1
- package/dist/chunks/matomo-Ds_oRmZ6.js +0 -1043
- package/dist/chunks/matomo-Ds_oRmZ6.js.map +0 -1
- package/dist/chunks/plausible-BxpNa6qF.js +0 -479
- package/dist/chunks/plausible-BxpNa6qF.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"plausible-BxpNa6qF.js","sources":["../../src/shared/providers/plausible.ts"],"sourcesContent":["/**\n * Plausible Analytics provider implementation\n *\n * Uses three APIs:\n * - Sites API: Site management\n * - Stats API v2: Reports and analytics queries\n * - Events API: Server-side event tracking\n */\n\nimport type {\n AnalyticsCapabilities,\n AnalyticsInterface,\n ConfigOptions,\n CreateDataStreamOptions,\n CreatePropertyOptions,\n CustomDimension,\n CustomDimensionOptions,\n CustomMetric,\n CustomMetricOptions,\n DataStream,\n DimensionMetadata,\n KeyEvent,\n KeyEventOptions,\n ListPropertiesOptions,\n MetricMetadata,\n PageviewEvent,\n PlausibleOptions,\n Property,\n RealtimeReportOptions,\n ReportOptions,\n ReportResult,\n SnippetOptions,\n TrackEvent,\n TrackingSnippet,\n UpdatePropertyOptions,\n} from '../types.js';\nimport {\n AnalyticsError,\n AuthenticationError,\n NotSupportedError,\n PropertyNotFoundError,\n RateLimitError,\n} from '../types.js';\n\n/**\n * Default Plausible base URL\n */\nconst DEFAULT_BASE_URL = 'https://plausible.io';\n\n/**\n * Plausible Analytics provider\n */\nexport class PlausibleProvider implements AnalyticsInterface {\n private options: PlausibleOptions;\n private baseUrl: string;\n\n constructor(options: PlausibleOptions) {\n this.options = {\n timeout: 30000,\n maxRetries: 3,\n baseUrl: DEFAULT_BASE_URL,\n ...options,\n };\n this.baseUrl = this.options.baseUrl || DEFAULT_BASE_URL;\n }\n\n /**\n * Make an authenticated API request\n */\n private async request<T>(\n endpoint: string,\n options: {\n method?: string;\n body?: unknown;\n headers?: Record<string, string>;\n } = {},\n ): Promise<T> {\n const url = `${this.baseUrl}${endpoint}`;\n const method = options.method || 'GET';\n\n try {\n const response = await fetch(url, {\n method,\n headers: {\n Authorization: `Bearer ${this.options.apiKey}`,\n 'Content-Type': 'application/json',\n ...options.headers,\n },\n body: options.body ? JSON.stringify(options.body) : undefined,\n });\n\n if (!response.ok) {\n if (response.status === 401) {\n throw new AuthenticationError('plausible');\n }\n if (response.status === 404) {\n throw new PropertyNotFoundError(endpoint, 'plausible');\n }\n if (response.status === 429) {\n const retryAfter = response.headers.get('Retry-After');\n throw new RateLimitError(\n 'plausible',\n retryAfter ? Number.parseInt(retryAfter, 10) : undefined,\n );\n }\n\n const errorText = await response.text();\n throw new AnalyticsError(\n `Plausible API error: ${response.status} - ${errorText}`,\n 'API_ERROR',\n 'plausible',\n );\n }\n\n // Handle empty responses\n const text = await response.text();\n if (!text) {\n return {} as T;\n }\n\n return JSON.parse(text) as T;\n } catch (error) {\n if (error instanceof AnalyticsError) {\n throw error;\n }\n throw new AnalyticsError(\n `Network error: ${(error as Error).message}`,\n 'NETWORK_ERROR',\n 'plausible',\n );\n }\n }\n\n // ===========================================================================\n // Property Management (Sites API)\n // ===========================================================================\n\n async createProperty(options: CreatePropertyOptions): Promise<Property> {\n // Plausible uses domain as the site ID\n const domain = options.displayName;\n\n interface PlausibleSite {\n domain: string;\n timezone?: string;\n }\n\n const site = await this.request<PlausibleSite>('/api/v1/sites', {\n method: 'POST',\n body: {\n domain,\n timezone: options.timeZone || 'Etc/UTC',\n },\n });\n\n return {\n id: site.domain,\n name: site.domain,\n displayName: site.domain,\n createTime: new Date().toISOString(),\n timeZone: site.timezone,\n };\n }\n\n async listProperties(_options?: ListPropertiesOptions): Promise<Property[]> {\n // Plausible doesn't have a list sites endpoint in the public API\n // This will need to be implemented when they add it\n throw new NotSupportedError('listProperties', 'plausible');\n }\n\n async getProperty(propertyId: string): Promise<Property> {\n // Plausible doesn't have a get site endpoint\n // Return a minimal property object\n return {\n id: propertyId,\n name: propertyId,\n displayName: propertyId,\n createTime: '',\n };\n }\n\n async updateProperty(\n _propertyId: string,\n _data: UpdatePropertyOptions,\n ): Promise<Property> {\n // Plausible doesn't support updating site settings via API\n throw new NotSupportedError('updateProperty', 'plausible');\n }\n\n async deleteProperty(propertyId: string): Promise<void> {\n await this.request(`/api/v1/sites/${propertyId}`, {\n method: 'DELETE',\n });\n }\n\n // ===========================================================================\n // Data Streams (Not supported by Plausible)\n // ===========================================================================\n\n async getDataStreams(_propertyId: string): Promise<DataStream[]> {\n throw new NotSupportedError('getDataStreams', 'plausible');\n }\n\n async createDataStream(\n _propertyId: string,\n _options: CreateDataStreamOptions,\n ): Promise<DataStream> {\n throw new NotSupportedError('createDataStream', 'plausible');\n }\n\n async deleteDataStream(\n _propertyId: string,\n _streamId: string,\n ): Promise<void> {\n throw new NotSupportedError('deleteDataStream', 'plausible');\n }\n\n // ===========================================================================\n // Custom Definitions (Not supported by Plausible via API)\n // ===========================================================================\n\n async getCustomDimensions(_propertyId: string): Promise<CustomDimension[]> {\n throw new NotSupportedError('getCustomDimensions', 'plausible');\n }\n\n async createCustomDimension(\n _propertyId: string,\n _options: CustomDimensionOptions,\n ): Promise<CustomDimension> {\n throw new NotSupportedError('createCustomDimension', 'plausible');\n }\n\n async archiveCustomDimension(\n _propertyId: string,\n _dimensionId: string,\n ): Promise<void> {\n throw new NotSupportedError('archiveCustomDimension', 'plausible');\n }\n\n async getCustomMetrics(_propertyId: string): Promise<CustomMetric[]> {\n throw new NotSupportedError('getCustomMetrics', 'plausible');\n }\n\n async createCustomMetric(\n _propertyId: string,\n _options: CustomMetricOptions,\n ): Promise<CustomMetric> {\n throw new NotSupportedError('createCustomMetric', 'plausible');\n }\n\n async archiveCustomMetric(\n _propertyId: string,\n _metricId: string,\n ): Promise<void> {\n throw new NotSupportedError('archiveCustomMetric', 'plausible');\n }\n\n // ===========================================================================\n // Key Events (Goals in Plausible - limited API support)\n // ===========================================================================\n\n async getKeyEvents(_propertyId: string): Promise<KeyEvent[]> {\n throw new NotSupportedError('getKeyEvents', 'plausible');\n }\n\n async createKeyEvent(\n propertyId: string,\n options: KeyEventOptions,\n ): Promise<KeyEvent> {\n // Plausible supports creating goals via API\n interface PlausibleGoal {\n id: number;\n display_name: string;\n goal_type: string;\n }\n\n const goal = await this.request<PlausibleGoal>(\n `/api/v1/sites/${propertyId}/goals`,\n {\n method: 'PUT',\n body: {\n goal_type: 'event',\n event_name: options.eventName,\n },\n },\n );\n\n return {\n id: String(goal.id),\n name: goal.display_name,\n eventName: options.eventName,\n createTime: new Date().toISOString(),\n };\n }\n\n async deleteKeyEvent(propertyId: string, eventId: string): Promise<void> {\n await this.request(`/api/v1/sites/${propertyId}/goals/${eventId}`, {\n method: 'DELETE',\n });\n }\n\n // ===========================================================================\n // Reporting (Stats API v2)\n // ===========================================================================\n\n async runReport(\n propertyId: string,\n options: ReportOptions,\n ): Promise<ReportResult> {\n const siteId = propertyId;\n const dateRange = options.dateRanges[0];\n\n // Convert to Plausible Stats API v2 format\n interface PlausibleQueryRequest {\n site_id: string;\n metrics: string[];\n date_range: [string, string];\n dimensions?: string[];\n filters?: Array<[string, string, string[]]>;\n order_by?: Array<[string, string]>;\n pagination?: {\n limit?: number;\n offset?: number;\n };\n }\n\n const queryBody: PlausibleQueryRequest = {\n site_id: siteId,\n metrics: options.metrics.map((m) => this.mapMetricName(m.name)),\n date_range: [dateRange.startDate, dateRange.endDate],\n };\n\n if (options.dimensions) {\n queryBody.dimensions = options.dimensions.map((d) =>\n this.mapDimensionName(d.name),\n );\n }\n\n if (options.orderBys) {\n queryBody.order_by = options.orderBys.map((o) => [\n o.metric?.metricName || o.dimension?.dimensionName || '',\n o.desc ? 'desc' : 'asc',\n ]);\n }\n\n if (options.limit || options.offset) {\n queryBody.pagination = {\n limit: options.limit,\n offset: options.offset,\n };\n }\n\n interface PlausibleQueryResponse {\n results: Array<{\n dimensions: string[];\n metrics: number[];\n }>;\n meta: {\n imports_included?: boolean;\n time_labels?: string[];\n total_rows?: number;\n };\n query: PlausibleQueryRequest;\n }\n\n const response = await this.request<PlausibleQueryResponse>(\n '/api/v2/query',\n {\n method: 'POST',\n body: queryBody,\n },\n );\n\n // Convert Plausible response to our format\n return {\n dimensionHeaders: (options.dimensions || []).map((d) => ({\n name: d.name,\n })),\n metricHeaders: options.metrics.map((m) => ({\n name: m.name,\n type: 'TYPE_INTEGER',\n })),\n rows: response.results.map((r) => ({\n dimensionValues: r.dimensions.map((v) => ({ value: String(v) })),\n metricValues: r.metrics.map((v) => ({ value: String(v) })),\n })),\n rowCount: response.meta.total_rows,\n };\n }\n\n async runRealtimeReport(\n propertyId: string,\n _options?: RealtimeReportOptions,\n ): Promise<ReportResult> {\n // Use the legacy v1 realtime endpoint\n interface PlausibleRealtimeResponse {\n visitors: number;\n }\n\n const response = await this.request<PlausibleRealtimeResponse>(\n `/api/v1/stats/realtime/visitors?site_id=${propertyId}`,\n );\n\n return {\n dimensionHeaders: [],\n metricHeaders: [{ name: 'activeUsers', type: 'TYPE_INTEGER' }],\n rows: [\n {\n dimensionValues: [],\n metricValues: [{ value: String(response.visitors) }],\n },\n ],\n };\n }\n\n async getMetrics(_propertyId: string): Promise<MetricMetadata[]> {\n // Plausible has a fixed set of metrics\n return [\n {\n apiName: 'visitors',\n uiName: 'Visitors',\n description: 'Unique visitors',\n type: 'TYPE_INTEGER',\n },\n {\n apiName: 'pageviews',\n uiName: 'Pageviews',\n description: 'Total page views',\n type: 'TYPE_INTEGER',\n },\n {\n apiName: 'bounce_rate',\n uiName: 'Bounce Rate',\n description: 'Percentage of single-page sessions',\n type: 'TYPE_FLOAT',\n },\n {\n apiName: 'visit_duration',\n uiName: 'Visit Duration',\n description: 'Average visit duration in seconds',\n type: 'TYPE_SECONDS',\n },\n {\n apiName: 'events',\n uiName: 'Events',\n description: 'Total events',\n type: 'TYPE_INTEGER',\n },\n {\n apiName: 'visits',\n uiName: 'Visits',\n description: 'Total visits (sessions)',\n type: 'TYPE_INTEGER',\n },\n {\n apiName: 'views_per_visit',\n uiName: 'Views per Visit',\n description: 'Average page views per visit',\n type: 'TYPE_FLOAT',\n },\n ];\n }\n\n async getDimensions(_propertyId: string): Promise<DimensionMetadata[]> {\n // Plausible has a fixed set of dimensions\n return [\n {\n apiName: 'event:page',\n uiName: 'Page',\n description: 'Page path',\n },\n {\n apiName: 'visit:source',\n uiName: 'Source',\n description: 'Traffic source',\n },\n {\n apiName: 'visit:referrer',\n uiName: 'Referrer',\n description: 'Referrer URL',\n },\n {\n apiName: 'visit:utm_source',\n uiName: 'UTM Source',\n description: 'UTM source parameter',\n },\n {\n apiName: 'visit:utm_medium',\n uiName: 'UTM Medium',\n description: 'UTM medium parameter',\n },\n {\n apiName: 'visit:utm_campaign',\n uiName: 'UTM Campaign',\n description: 'UTM campaign parameter',\n },\n {\n apiName: 'visit:device',\n uiName: 'Device',\n description: 'Device type',\n },\n {\n apiName: 'visit:browser',\n uiName: 'Browser',\n description: 'Browser name',\n },\n {\n apiName: 'visit:os',\n uiName: 'OS',\n description: 'Operating system',\n },\n {\n apiName: 'visit:country',\n uiName: 'Country',\n description: 'Country name',\n },\n {\n apiName: 'visit:city',\n uiName: 'City',\n description: 'City name',\n },\n ];\n }\n\n /**\n * Map GA4-style metric names to Plausible format\n */\n private mapMetricName(name: string): string {\n const mapping: Record<string, string> = {\n activeUsers: 'visitors',\n users: 'visitors',\n sessions: 'visits',\n pageviews: 'pageviews',\n bounceRate: 'bounce_rate',\n avgSessionDuration: 'visit_duration',\n events: 'events',\n };\n return mapping[name] || name;\n }\n\n /**\n * Map GA4-style dimension names to Plausible format\n */\n private mapDimensionName(name: string): string {\n const mapping: Record<string, string> = {\n pagePath: 'event:page',\n page: 'event:page',\n source: 'visit:source',\n medium: 'visit:utm_medium',\n campaign: 'visit:utm_campaign',\n country: 'visit:country',\n city: 'visit:city',\n deviceCategory: 'visit:device',\n browser: 'visit:browser',\n operatingSystem: 'visit:os',\n };\n return mapping[name] || name;\n }\n\n // ===========================================================================\n // Event Tracking (Events API)\n // ===========================================================================\n\n async track(event: TrackEvent): Promise<void> {\n const siteId = this.options.defaultSiteId;\n\n if (!siteId) {\n throw new AnalyticsError(\n 'Default site ID is required for server-side tracking',\n 'MISSING_SITE_ID',\n 'plausible',\n );\n }\n\n // Plausible Events API requires specific headers\n await this.request('/api/event', {\n method: 'POST',\n headers: {\n 'User-Agent': 'Mozilla/5.0 (compatible; PlausibleBot/1.0)',\n 'X-Forwarded-For': '127.0.0.1', // Will be overwritten by actual IP in production\n },\n body: {\n name: event.name,\n url: `https://${siteId}`,\n domain: siteId,\n props: event.params,\n },\n });\n }\n\n async trackPageview(pageview: PageviewEvent): Promise<void> {\n const siteId = this.options.defaultSiteId;\n\n if (!siteId) {\n throw new AnalyticsError(\n 'Default site ID is required for server-side tracking',\n 'MISSING_SITE_ID',\n 'plausible',\n );\n }\n\n await this.request('/api/event', {\n method: 'POST',\n headers: {\n 'User-Agent': 'Mozilla/5.0 (compatible; PlausibleBot/1.0)',\n 'X-Forwarded-For': '127.0.0.1',\n },\n body: {\n name: 'pageview',\n url: pageview.pageLocation || `https://${siteId}${pageview.pagePath}`,\n domain: siteId,\n props: pageview.params,\n },\n });\n }\n\n async trackBatch(events: TrackEvent[]): Promise<void> {\n // Plausible doesn't have a batch API, so we send events sequentially\n for (const event of events) {\n await this.track(event);\n }\n }\n\n async identify(\n _userId: string,\n _traits?: Record<string, unknown>,\n ): Promise<void> {\n // Plausible is privacy-focused and doesn't support user identification\n throw new NotSupportedError('identify', 'plausible');\n }\n\n // ===========================================================================\n // Client-Side Helpers\n // ===========================================================================\n\n generateTrackingSnippet(\n propertyId: string,\n _options?: SnippetOptions,\n ): TrackingSnippet {\n const domain = propertyId;\n const scriptUrl = `${this.baseUrl}/js/script.js`;\n\n // Plausible supports various script extensions\n const _scriptPath = 'script.js';\n const _extensions: string[] = [];\n\n // Note: These would need to be configured based on Plausible plan features\n // For now, using the basic script\n\n const html = `<script defer data-domain=\"${domain}\" src=\"${scriptUrl}\"></script>`;\n\n return {\n html,\n config: {\n domain,\n scriptUrl,\n },\n scripts: [scriptUrl],\n };\n }\n\n generateConfig(\n propertyId: string,\n _options?: ConfigOptions,\n ): Record<string, unknown> {\n return {\n domain: propertyId,\n apiHost: this.baseUrl,\n };\n }\n\n // ===========================================================================\n // Provider Info\n // ===========================================================================\n\n async getCapabilities(): Promise<AnalyticsCapabilities> {\n return {\n propertyManagement: true, // Limited - create and delete only\n dataStreams: false,\n customDimensions: false, // Via UI only\n customMetrics: false,\n keyEvents: true, // Goals\n reporting: true,\n realtimeReporting: true,\n serverSideTracking: true,\n clientSideSnippet: true,\n userIdentification: false, // Privacy-focused\n batchTracking: false, // No batch API\n };\n }\n}\n"],"names":[],"mappings":"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"}
|