@litemetrics/client 0.1.0 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,118 @@
1
+ # @litemetrics/client
2
+
3
+ Client SDK for querying Litemetrics analytics data. Fetch stats, time series, events, users, and manage sites from your frontend or backend.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ npm install @litemetrics/client
9
+ ```
10
+
11
+ ## Quick Start
12
+
13
+ ```ts
14
+ import { createClient } from '@litemetrics/client';
15
+
16
+ const client = createClient({
17
+ baseUrl: 'https://your-server.com',
18
+ siteId: 'your-site-id',
19
+ secretKey: 'your-secret-key',
20
+ });
21
+ ```
22
+
23
+ ## Querying Stats
24
+
25
+ ```ts
26
+ // Overview metrics
27
+ const overview = await client.getOverview(
28
+ ['pageviews', 'visitors', 'sessions'],
29
+ { period: '7d', compare: true }
30
+ );
31
+
32
+ // Top pages
33
+ const pages = await client.getStats('top_pages', { period: '30d', limit: 10 });
34
+
35
+ // Top referrers
36
+ const referrers = await client.getStats('top_referrers', { period: '7d' });
37
+
38
+ // Country breakdown
39
+ const countries = await client.getTopCountries({ period: '30d', limit: 50 });
40
+ ```
41
+
42
+ ## Time Series
43
+
44
+ ```ts
45
+ const timeseries = await client.getTimeSeries('pageviews', {
46
+ period: '30d',
47
+ granularity: 'day',
48
+ filters: { 'geo.country': 'US' },
49
+ });
50
+
51
+ // Returns: { data: [{ date: '2025-01-01', value: 142 }, ...] }
52
+ ```
53
+
54
+ ## Segmentation Filters
55
+
56
+ All `getStats` and `getTimeSeries` calls accept `filters`:
57
+
58
+ ```ts
59
+ const filtered = await client.getStats('top_events', {
60
+ period: '7d',
61
+ filters: {
62
+ 'device.type': 'mobile',
63
+ 'utm.source': 'newsletter',
64
+ 'event_source': 'auto',
65
+ 'event_subtype': 'button_click',
66
+ },
67
+ });
68
+ ```
69
+
70
+ ## Events & Users
71
+
72
+ ```ts
73
+ // List events
74
+ const events = await client.getEventsList({
75
+ type: 'pageview',
76
+ period: '24h',
77
+ limit: 50,
78
+ });
79
+
80
+ // List users
81
+ const users = await client.getUsers({ limit: 20 });
82
+
83
+ // User detail
84
+ const user = await client.getUserDetail('visitor-id');
85
+ ```
86
+
87
+ ## Retention
88
+
89
+ ```ts
90
+ const retention = await client.getRetention({ period: '90d', weeks: 8 });
91
+ // Returns weekly cohort retention data
92
+ ```
93
+
94
+ ## Site Management
95
+
96
+ ```ts
97
+ import { createSitesClient } from '@litemetrics/client';
98
+
99
+ const sites = createSitesClient({
100
+ baseUrl: 'https://your-server.com',
101
+ adminSecret: 'your-admin-secret',
102
+ });
103
+
104
+ // CRUD
105
+ const { site } = await sites.createSite({ name: 'My App', domain: 'myapp.com' });
106
+ const { sites: allSites } = await sites.listSites();
107
+ await sites.updateSite(site.siteId, { allowedOrigins: ['myapp.com'] });
108
+ await sites.deleteSite(site.siteId);
109
+ await sites.regenerateSecret(site.siteId);
110
+ ```
111
+
112
+ ## Available Metrics
113
+
114
+ `pageviews` | `visitors` | `sessions` | `events` | `conversions` | `top_pages` | `top_referrers` | `top_countries` | `top_cities` | `top_events` | `top_conversions` | `top_exit_pages` | `top_transitions` | `top_scroll_pages` | `top_button_clicks` | `top_link_targets` | `top_browsers` | `top_os` | `top_devices`
115
+
116
+ ## License
117
+
118
+ MIT
package/dist/index.cjs CHANGED
@@ -112,7 +112,7 @@ var LitemetricsClient = class {
112
112
  return this.getStats("top_os", options);
113
113
  }
114
114
  /** Fetch multiple metrics in parallel */
115
- async getOverview(metrics = ["pageviews", "visitors", "sessions", "events"], options) {
115
+ async getOverview(metrics = ["pageviews", "visitors", "sessions", "events", "conversions"], options) {
116
116
  const results = await Promise.all(
117
117
  metrics.map((m) => this.getStats(m, options).then((r) => [m, r]))
118
118
  );
@@ -129,6 +129,7 @@ var LitemetricsClient = class {
129
129
  if (options?.dateFrom) params.dateFrom = options.dateFrom;
130
130
  if (options?.dateTo) params.dateTo = options.dateTo;
131
131
  if (options?.granularity) params.granularity = options.granularity;
132
+ if (options?.filters) params.filters = JSON.stringify(options.filters);
132
133
  const { data } = await this.http.get(this.endpoint, { params });
133
134
  return data;
134
135
  }
@@ -137,6 +138,8 @@ var LitemetricsClient = class {
137
138
  const params = { siteId: this.siteId };
138
139
  if (options?.type) params.type = options.type;
139
140
  if (options?.eventName) params.eventName = options.eventName;
141
+ if (options?.eventNames && options.eventNames.length > 0) params.eventNames = options.eventNames.join(",");
142
+ if (options?.eventSource) params.eventSource = options.eventSource;
140
143
  if (options?.visitorId) params.visitorId = options.visitorId;
141
144
  if (options?.userId) params.userId = options.userId;
142
145
  if (options?.period) params.period = options.period;
@@ -164,6 +167,9 @@ var LitemetricsClient = class {
164
167
  async getUserEvents(visitorId, options) {
165
168
  const params = { siteId: this.siteId };
166
169
  if (options?.type) params.type = options.type;
170
+ if (options?.eventName) params.eventName = options.eventName;
171
+ if (options?.eventNames && options.eventNames.length > 0) params.eventNames = options.eventNames.join(",");
172
+ if (options?.eventSource) params.eventSource = options.eventSource;
167
173
  if (options?.period) params.period = options.period;
168
174
  if (options?.dateFrom) params.dateFrom = options.dateFrom;
169
175
  if (options?.dateTo) params.dateTo = options.dateTo;
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/client.ts","../src/sites.ts"],"sourcesContent":["export { LitemetricsClient, createClient } from './client';\nexport type { LitemetricsClientConfig, StatsOptions, TimeSeriesOptions, EventsListOptions, UsersListOptions, RetentionOptions } from './client';\n\nexport { SitesClient, createSitesClient } from './sites';\nexport type { SitesClientConfig } from './sites';\n\n// Re-export query types from core\nexport type {\n Metric,\n Period,\n QueryResult,\n QueryDataPoint,\n Site,\n CreateSiteRequest,\n UpdateSiteRequest,\n EventType,\n EventListParams,\n EventListResult,\n EventListItem,\n UserListParams,\n UserListResult,\n UserDetail,\n Granularity,\n TimeSeriesParams,\n TimeSeriesResult,\n TimeSeriesPoint,\n RetentionParams,\n RetentionResult,\n RetentionCohort,\n} from '@litemetrics/core';\n","import axios, { type AxiosInstance } from 'axios';\nimport type { Metric, Period, Granularity, QueryResult, TimeSeriesResult, RetentionResult, EventListResult, UserListResult, UserDetail, EventType } from '@litemetrics/core';\n\nexport interface LitemetricsClientConfig {\n /** Base URL of the Litemetrics server (e.g. \"https://analytics.myapp.com\") */\n baseUrl: string;\n /** Site ID to query */\n siteId: string;\n /** Secret key for authentication (sk_xxx) */\n secretKey?: string;\n /** Query endpoint path (default: \"/api/stats\") */\n endpoint?: string;\n /** Custom headers to include in requests */\n headers?: Record<string, string>;\n}\n\nexport interface StatsOptions {\n period?: Period;\n dateFrom?: string;\n dateTo?: string;\n limit?: number;\n filters?: Record<string, string>;\n compare?: boolean;\n}\n\nexport interface RetentionOptions {\n period?: Period;\n weeks?: number;\n}\n\nexport interface EventsListOptions {\n type?: EventType;\n eventName?: string;\n visitorId?: string;\n userId?: string;\n period?: Period;\n dateFrom?: string;\n dateTo?: string;\n limit?: number;\n offset?: number;\n}\n\nexport interface TimeSeriesOptions {\n period?: Period;\n dateFrom?: string;\n dateTo?: string;\n granularity?: Granularity;\n}\n\nexport interface UsersListOptions {\n search?: string;\n limit?: number;\n offset?: number;\n}\n\nexport class LitemetricsClient {\n private siteId: string;\n private endpoint: string;\n private http: AxiosInstance;\n\n constructor(config: LitemetricsClientConfig) {\n this.siteId = config.siteId;\n this.endpoint = config.endpoint ?? '/api/stats';\n\n const headers: Record<string, string> = { ...config.headers };\n if (config.secretKey) {\n headers['X-Litemetrics-Secret'] = config.secretKey;\n }\n\n this.http = axios.create({\n baseURL: config.baseUrl.replace(/\\/$/, ''),\n headers,\n });\n }\n\n /** Change the active site ID */\n setSiteId(siteId: string): void {\n this.siteId = siteId;\n }\n\n /** Get any metric */\n async getStats(metric: Metric, options?: StatsOptions): Promise<QueryResult> {\n const params: Record<string, string> = {\n siteId: this.siteId,\n metric,\n };\n\n if (options?.period) params.period = options.period;\n if (options?.dateFrom) params.dateFrom = options.dateFrom;\n if (options?.dateTo) params.dateTo = options.dateTo;\n if (options?.limit) params.limit = String(options.limit);\n if (options?.filters) params.filters = JSON.stringify(options.filters);\n if (options?.compare) params.compare = 'true';\n\n const { data } = await this.http.get<QueryResult>(this.endpoint, { params });\n return data;\n }\n\n // ─── Convenience methods ──────────────────────────────────\n\n async getPageviews(options?: StatsOptions) { return this.getStats('pageviews', options); }\n async getVisitors(options?: StatsOptions) { return this.getStats('visitors', options); }\n async getSessions(options?: StatsOptions) { return this.getStats('sessions', options); }\n async getEvents(options?: StatsOptions) { return this.getStats('events', options); }\n async getTopPages(options?: StatsOptions) { return this.getStats('top_pages', options); }\n async getTopReferrers(options?: StatsOptions) { return this.getStats('top_referrers', options); }\n async getTopCountries(options?: StatsOptions) { return this.getStats('top_countries', options); }\n async getTopCities(options?: StatsOptions) { return this.getStats('top_cities', options); }\n async getTopEvents(options?: StatsOptions) { return this.getStats('top_events', options); }\n async getTopDevices(options?: StatsOptions) { return this.getStats('top_devices', options); }\n async getTopBrowsers(options?: StatsOptions) { return this.getStats('top_browsers', options); }\n async getTopOS(options?: StatsOptions) { return this.getStats('top_os', options); }\n\n /** Fetch multiple metrics in parallel */\n async getOverview(\n metrics: Metric[] = ['pageviews', 'visitors', 'sessions', 'events'],\n options?: StatsOptions,\n ): Promise<Record<Metric, QueryResult>> {\n const results = await Promise.all(\n metrics.map((m) => this.getStats(m, options).then((r) => [m, r] as const)),\n );\n return Object.fromEntries(results) as Record<Metric, QueryResult>;\n }\n\n // ─── Time series ──────────────────────────────────────\n\n async getTimeSeries(\n metric: 'pageviews' | 'visitors' | 'sessions',\n options?: TimeSeriesOptions,\n ): Promise<TimeSeriesResult> {\n const params: Record<string, string> = {\n siteId: this.siteId,\n metric: 'timeseries',\n tsMetric: metric,\n };\n\n if (options?.period) params.period = options.period;\n if (options?.dateFrom) params.dateFrom = options.dateFrom;\n if (options?.dateTo) params.dateTo = options.dateTo;\n if (options?.granularity) params.granularity = options.granularity;\n\n const { data } = await this.http.get<TimeSeriesResult>(this.endpoint, { params });\n return data;\n }\n\n // ─── Event listing ──────────────────────────────────────\n\n async getEventsList(options?: EventsListOptions): Promise<EventListResult> {\n const params: Record<string, string> = { siteId: this.siteId };\n\n if (options?.type) params.type = options.type;\n if (options?.eventName) params.eventName = options.eventName;\n if (options?.visitorId) params.visitorId = options.visitorId;\n if (options?.userId) params.userId = options.userId;\n if (options?.period) params.period = options.period;\n if (options?.dateFrom) params.dateFrom = options.dateFrom;\n if (options?.dateTo) params.dateTo = options.dateTo;\n if (options?.limit) params.limit = String(options.limit);\n if (options?.offset) params.offset = String(options.offset);\n\n const { data } = await this.http.get<EventListResult>('/api/events', { params });\n return data;\n }\n\n // ─── User listing ──────────────────────────────────────\n\n async getUsers(options?: UsersListOptions): Promise<UserListResult> {\n const params: Record<string, string> = { siteId: this.siteId };\n\n if (options?.search) params.search = options.search;\n if (options?.limit) params.limit = String(options.limit);\n if (options?.offset) params.offset = String(options.offset);\n\n const { data } = await this.http.get<UserListResult>('/api/users', { params });\n return data;\n }\n\n async getUserDetail(visitorId: string): Promise<UserDetail> {\n const params: Record<string, string> = { siteId: this.siteId };\n const { data } = await this.http.get<{ user: UserDetail }>(`/api/users/${encodeURIComponent(visitorId)}`, { params });\n return data.user;\n }\n\n async getUserEvents(visitorId: string, options?: EventsListOptions): Promise<EventListResult> {\n const params: Record<string, string> = { siteId: this.siteId };\n\n if (options?.type) params.type = options.type;\n if (options?.period) params.period = options.period;\n if (options?.dateFrom) params.dateFrom = options.dateFrom;\n if (options?.dateTo) params.dateTo = options.dateTo;\n if (options?.limit) params.limit = String(options.limit);\n if (options?.offset) params.offset = String(options.offset);\n\n const { data } = await this.http.get<EventListResult>(`/api/users/${encodeURIComponent(visitorId)}/events`, { params });\n return data;\n }\n\n // ─── Retention ──────────────────────────────────────\n\n async getRetention(options?: RetentionOptions): Promise<RetentionResult> {\n const params: Record<string, string> = {\n siteId: this.siteId,\n metric: 'retention',\n };\n\n if (options?.period) params.period = options.period;\n if (options?.weeks) params.weeks = String(options.weeks);\n\n const { data } = await this.http.get<RetentionResult>(this.endpoint, { params });\n return data;\n }\n}\n\n/** Create an LitemetricsClient instance */\nexport function createClient(config: LitemetricsClientConfig): LitemetricsClient {\n return new LitemetricsClient(config);\n}\n","import axios, { type AxiosInstance } from 'axios';\nimport type { Site, CreateSiteRequest, UpdateSiteRequest } from '@litemetrics/core';\n\nexport interface SitesClientConfig {\n /** Base URL of the Litemetrics server */\n baseUrl: string;\n /** Admin secret for authentication */\n adminSecret: string;\n /** Sites endpoint path (default: \"/api/sites\") */\n endpoint?: string;\n}\n\nexport class SitesClient {\n private endpoint: string;\n private http: AxiosInstance;\n\n constructor(config: SitesClientConfig) {\n this.endpoint = config.endpoint ?? '/api/sites';\n\n this.http = axios.create({\n baseURL: config.baseUrl.replace(/\\/$/, ''),\n headers: {\n 'Content-Type': 'application/json',\n 'X-Litemetrics-Admin-Secret': config.adminSecret,\n },\n });\n }\n\n async listSites(): Promise<{ sites: Site[]; total: number }> {\n const { data } = await this.http.get(this.endpoint);\n return data;\n }\n\n async getSite(siteId: string): Promise<{ site: Site }> {\n const { data } = await this.http.get(`${this.endpoint}/${siteId}`);\n return data;\n }\n\n async createSite(body: CreateSiteRequest): Promise<{ site: Site }> {\n const { data } = await this.http.post(this.endpoint, body);\n return data;\n }\n\n async updateSite(siteId: string, body: UpdateSiteRequest): Promise<{ site: Site }> {\n const { data } = await this.http.put(`${this.endpoint}/${siteId}`, body);\n return data;\n }\n\n async deleteSite(siteId: string): Promise<{ ok: boolean }> {\n const { data } = await this.http.delete(`${this.endpoint}/${siteId}`);\n return data;\n }\n\n async regenerateSecret(siteId: string): Promise<{ site: Site }> {\n const { data } = await this.http.post(`${this.endpoint}/${siteId}/regenerate`);\n return data;\n }\n}\n\nexport function createSitesClient(config: SitesClientConfig): SitesClient {\n return new SitesClient(config);\n}\n"],"mappings":"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","names":["axios","import_axios","axios"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/client.ts","../src/sites.ts"],"sourcesContent":["export { LitemetricsClient, createClient } from './client';\nexport type { LitemetricsClientConfig, StatsOptions, TimeSeriesOptions, EventsListOptions, UsersListOptions, RetentionOptions } from './client';\n\nexport { SitesClient, createSitesClient } from './sites';\nexport type { SitesClientConfig } from './sites';\n\n// Re-export query types from core\nexport type {\n Metric,\n Period,\n QueryResult,\n QueryDataPoint,\n Site,\n CreateSiteRequest,\n UpdateSiteRequest,\n EventType,\n EventListParams,\n EventListResult,\n EventListItem,\n UserListParams,\n UserListResult,\n UserDetail,\n Granularity,\n TimeSeriesParams,\n TimeSeriesResult,\n TimeSeriesPoint,\n RetentionParams,\n RetentionResult,\n RetentionCohort,\n} from '@litemetrics/core';\n","import axios, { type AxiosInstance } from 'axios';\nimport type { Metric, Period, Granularity, QueryResult, TimeSeriesResult, RetentionResult, EventListResult, UserListResult, UserDetail, EventType } from '@litemetrics/core';\n\nexport interface LitemetricsClientConfig {\n /** Base URL of the Litemetrics server (e.g. \"https://analytics.myapp.com\") */\n baseUrl: string;\n /** Site ID to query */\n siteId: string;\n /** Secret key for authentication (sk_xxx) */\n secretKey?: string;\n /** Query endpoint path (default: \"/api/stats\") */\n endpoint?: string;\n /** Custom headers to include in requests */\n headers?: Record<string, string>;\n}\n\nexport interface StatsOptions {\n period?: Period;\n dateFrom?: string;\n dateTo?: string;\n limit?: number;\n filters?: Record<string, string>;\n compare?: boolean;\n}\n\nexport interface RetentionOptions {\n period?: Period;\n weeks?: number;\n}\n\nexport interface EventsListOptions {\n type?: EventType;\n eventName?: string;\n eventNames?: string[];\n eventSource?: 'auto' | 'manual';\n visitorId?: string;\n userId?: string;\n period?: Period;\n dateFrom?: string;\n dateTo?: string;\n limit?: number;\n offset?: number;\n}\n\nexport interface TimeSeriesOptions {\n period?: Period;\n dateFrom?: string;\n dateTo?: string;\n granularity?: Granularity;\n filters?: Record<string, string>;\n}\n\nexport interface UsersListOptions {\n search?: string;\n limit?: number;\n offset?: number;\n}\n\nexport class LitemetricsClient {\n private siteId: string;\n private endpoint: string;\n private http: AxiosInstance;\n\n constructor(config: LitemetricsClientConfig) {\n this.siteId = config.siteId;\n this.endpoint = config.endpoint ?? '/api/stats';\n\n const headers: Record<string, string> = { ...config.headers };\n if (config.secretKey) {\n headers['X-Litemetrics-Secret'] = config.secretKey;\n }\n\n this.http = axios.create({\n baseURL: config.baseUrl.replace(/\\/$/, ''),\n headers,\n });\n }\n\n /** Change the active site ID */\n setSiteId(siteId: string): void {\n this.siteId = siteId;\n }\n\n /** Get any metric */\n async getStats(metric: Metric, options?: StatsOptions): Promise<QueryResult> {\n const params: Record<string, string> = {\n siteId: this.siteId,\n metric,\n };\n\n if (options?.period) params.period = options.period;\n if (options?.dateFrom) params.dateFrom = options.dateFrom;\n if (options?.dateTo) params.dateTo = options.dateTo;\n if (options?.limit) params.limit = String(options.limit);\n if (options?.filters) params.filters = JSON.stringify(options.filters);\n if (options?.compare) params.compare = 'true';\n\n const { data } = await this.http.get<QueryResult>(this.endpoint, { params });\n return data;\n }\n\n // ─── Convenience methods ──────────────────────────────────\n\n async getPageviews(options?: StatsOptions) { return this.getStats('pageviews', options); }\n async getVisitors(options?: StatsOptions) { return this.getStats('visitors', options); }\n async getSessions(options?: StatsOptions) { return this.getStats('sessions', options); }\n async getEvents(options?: StatsOptions) { return this.getStats('events', options); }\n async getTopPages(options?: StatsOptions) { return this.getStats('top_pages', options); }\n async getTopReferrers(options?: StatsOptions) { return this.getStats('top_referrers', options); }\n async getTopCountries(options?: StatsOptions) { return this.getStats('top_countries', options); }\n async getTopCities(options?: StatsOptions) { return this.getStats('top_cities', options); }\n async getTopEvents(options?: StatsOptions) { return this.getStats('top_events', options); }\n async getTopDevices(options?: StatsOptions) { return this.getStats('top_devices', options); }\n async getTopBrowsers(options?: StatsOptions) { return this.getStats('top_browsers', options); }\n async getTopOS(options?: StatsOptions) { return this.getStats('top_os', options); }\n\n /** Fetch multiple metrics in parallel */\n async getOverview(\n metrics: Metric[] = ['pageviews', 'visitors', 'sessions', 'events', 'conversions'],\n options?: StatsOptions,\n ): Promise<Record<Metric, QueryResult>> {\n const results = await Promise.all(\n metrics.map((m) => this.getStats(m, options).then((r) => [m, r] as const)),\n );\n return Object.fromEntries(results) as Record<Metric, QueryResult>;\n }\n\n // ─── Time series ──────────────────────────────────────\n\n async getTimeSeries(\n metric: 'pageviews' | 'visitors' | 'sessions' | 'events' | 'conversions',\n options?: TimeSeriesOptions,\n ): Promise<TimeSeriesResult> {\n const params: Record<string, string> = {\n siteId: this.siteId,\n metric: 'timeseries',\n tsMetric: metric,\n };\n\n if (options?.period) params.period = options.period;\n if (options?.dateFrom) params.dateFrom = options.dateFrom;\n if (options?.dateTo) params.dateTo = options.dateTo;\n if (options?.granularity) params.granularity = options.granularity;\n if (options?.filters) params.filters = JSON.stringify(options.filters);\n\n const { data } = await this.http.get<TimeSeriesResult>(this.endpoint, { params });\n return data;\n }\n\n // ─── Event listing ──────────────────────────────────────\n\n async getEventsList(options?: EventsListOptions): Promise<EventListResult> {\n const params: Record<string, string> = { siteId: this.siteId };\n\n if (options?.type) params.type = options.type;\n if (options?.eventName) params.eventName = options.eventName;\n if (options?.eventNames && options.eventNames.length > 0) params.eventNames = options.eventNames.join(',');\n if (options?.eventSource) params.eventSource = options.eventSource;\n if (options?.visitorId) params.visitorId = options.visitorId;\n if (options?.userId) params.userId = options.userId;\n if (options?.period) params.period = options.period;\n if (options?.dateFrom) params.dateFrom = options.dateFrom;\n if (options?.dateTo) params.dateTo = options.dateTo;\n if (options?.limit) params.limit = String(options.limit);\n if (options?.offset) params.offset = String(options.offset);\n\n const { data } = await this.http.get<EventListResult>('/api/events', { params });\n return data;\n }\n\n // ─── User listing ──────────────────────────────────────\n\n async getUsers(options?: UsersListOptions): Promise<UserListResult> {\n const params: Record<string, string> = { siteId: this.siteId };\n\n if (options?.search) params.search = options.search;\n if (options?.limit) params.limit = String(options.limit);\n if (options?.offset) params.offset = String(options.offset);\n\n const { data } = await this.http.get<UserListResult>('/api/users', { params });\n return data;\n }\n\n async getUserDetail(visitorId: string): Promise<UserDetail> {\n const params: Record<string, string> = { siteId: this.siteId };\n const { data } = await this.http.get<{ user: UserDetail }>(`/api/users/${encodeURIComponent(visitorId)}`, { params });\n return data.user;\n }\n\n async getUserEvents(visitorId: string, options?: EventsListOptions): Promise<EventListResult> {\n const params: Record<string, string> = { siteId: this.siteId };\n\n if (options?.type) params.type = options.type;\n if (options?.eventName) params.eventName = options.eventName;\n if (options?.eventNames && options.eventNames.length > 0) params.eventNames = options.eventNames.join(',');\n if (options?.eventSource) params.eventSource = options.eventSource;\n if (options?.period) params.period = options.period;\n if (options?.dateFrom) params.dateFrom = options.dateFrom;\n if (options?.dateTo) params.dateTo = options.dateTo;\n if (options?.limit) params.limit = String(options.limit);\n if (options?.offset) params.offset = String(options.offset);\n\n const { data } = await this.http.get<EventListResult>(`/api/users/${encodeURIComponent(visitorId)}/events`, { params });\n return data;\n }\n\n // ─── Retention ──────────────────────────────────────\n\n async getRetention(options?: RetentionOptions): Promise<RetentionResult> {\n const params: Record<string, string> = {\n siteId: this.siteId,\n metric: 'retention',\n };\n\n if (options?.period) params.period = options.period;\n if (options?.weeks) params.weeks = String(options.weeks);\n\n const { data } = await this.http.get<RetentionResult>(this.endpoint, { params });\n return data;\n }\n}\n\n/** Create an LitemetricsClient instance */\nexport function createClient(config: LitemetricsClientConfig): LitemetricsClient {\n return new LitemetricsClient(config);\n}\n","import axios, { type AxiosInstance } from 'axios';\nimport type { Site, CreateSiteRequest, UpdateSiteRequest } from '@litemetrics/core';\n\nexport interface SitesClientConfig {\n /** Base URL of the Litemetrics server */\n baseUrl: string;\n /** Admin secret for authentication */\n adminSecret: string;\n /** Sites endpoint path (default: \"/api/sites\") */\n endpoint?: string;\n}\n\nexport class SitesClient {\n private endpoint: string;\n private http: AxiosInstance;\n\n constructor(config: SitesClientConfig) {\n this.endpoint = config.endpoint ?? '/api/sites';\n\n this.http = axios.create({\n baseURL: config.baseUrl.replace(/\\/$/, ''),\n headers: {\n 'Content-Type': 'application/json',\n 'X-Litemetrics-Admin-Secret': config.adminSecret,\n },\n });\n }\n\n async listSites(): Promise<{ sites: Site[]; total: number }> {\n const { data } = await this.http.get(this.endpoint);\n return data;\n }\n\n async getSite(siteId: string): Promise<{ site: Site }> {\n const { data } = await this.http.get(`${this.endpoint}/${siteId}`);\n return data;\n }\n\n async createSite(body: CreateSiteRequest): Promise<{ site: Site }> {\n const { data } = await this.http.post(this.endpoint, body);\n return data;\n }\n\n async updateSite(siteId: string, body: UpdateSiteRequest): Promise<{ site: Site }> {\n const { data } = await this.http.put(`${this.endpoint}/${siteId}`, body);\n return data;\n }\n\n async deleteSite(siteId: string): Promise<{ ok: boolean }> {\n const { data } = await this.http.delete(`${this.endpoint}/${siteId}`);\n return data;\n }\n\n async regenerateSecret(siteId: string): Promise<{ site: Site }> {\n const { data } = await this.http.post(`${this.endpoint}/${siteId}/regenerate`);\n return data;\n }\n}\n\nexport function createSitesClient(config: SitesClientConfig): SitesClient {\n return new SitesClient(config);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,mBAA0C;AA0DnC,IAAM,oBAAN,MAAwB;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AAAA,EAER,YAAY,QAAiC;AAC3C,SAAK,SAAS,OAAO;AACrB,SAAK,WAAW,OAAO,YAAY;AAEnC,UAAM,UAAkC,EAAE,GAAG,OAAO,QAAQ;AAC5D,QAAI,OAAO,WAAW;AACpB,cAAQ,sBAAsB,IAAI,OAAO;AAAA,IAC3C;AAEA,SAAK,OAAO,aAAAA,QAAM,OAAO;AAAA,MACvB,SAAS,OAAO,QAAQ,QAAQ,OAAO,EAAE;AAAA,MACzC;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,UAAU,QAAsB;AAC9B,SAAK,SAAS;AAAA,EAChB;AAAA;AAAA,EAGA,MAAM,SAAS,QAAgB,SAA8C;AAC3E,UAAM,SAAiC;AAAA,MACrC,QAAQ,KAAK;AAAA,MACb;AAAA,IACF;AAEA,QAAI,SAAS,OAAQ,QAAO,SAAS,QAAQ;AAC7C,QAAI,SAAS,SAAU,QAAO,WAAW,QAAQ;AACjD,QAAI,SAAS,OAAQ,QAAO,SAAS,QAAQ;AAC7C,QAAI,SAAS,MAAO,QAAO,QAAQ,OAAO,QAAQ,KAAK;AACvD,QAAI,SAAS,QAAS,QAAO,UAAU,KAAK,UAAU,QAAQ,OAAO;AACrE,QAAI,SAAS,QAAS,QAAO,UAAU;AAEvC,UAAM,EAAE,KAAK,IAAI,MAAM,KAAK,KAAK,IAAiB,KAAK,UAAU,EAAE,OAAO,CAAC;AAC3E,WAAO;AAAA,EACT;AAAA;AAAA,EAIA,MAAM,aAAa,SAAwB;AAAE,WAAO,KAAK,SAAS,aAAa,OAAO;AAAA,EAAG;AAAA,EACzF,MAAM,YAAY,SAAwB;AAAE,WAAO,KAAK,SAAS,YAAY,OAAO;AAAA,EAAG;AAAA,EACvF,MAAM,YAAY,SAAwB;AAAE,WAAO,KAAK,SAAS,YAAY,OAAO;AAAA,EAAG;AAAA,EACvF,MAAM,UAAU,SAAwB;AAAE,WAAO,KAAK,SAAS,UAAU,OAAO;AAAA,EAAG;AAAA,EACnF,MAAM,YAAY,SAAwB;AAAE,WAAO,KAAK,SAAS,aAAa,OAAO;AAAA,EAAG;AAAA,EACxF,MAAM,gBAAgB,SAAwB;AAAE,WAAO,KAAK,SAAS,iBAAiB,OAAO;AAAA,EAAG;AAAA,EAChG,MAAM,gBAAgB,SAAwB;AAAE,WAAO,KAAK,SAAS,iBAAiB,OAAO;AAAA,EAAG;AAAA,EAChG,MAAM,aAAa,SAAwB;AAAE,WAAO,KAAK,SAAS,cAAc,OAAO;AAAA,EAAG;AAAA,EAC1F,MAAM,aAAa,SAAwB;AAAE,WAAO,KAAK,SAAS,cAAc,OAAO;AAAA,EAAG;AAAA,EAC1F,MAAM,cAAc,SAAwB;AAAE,WAAO,KAAK,SAAS,eAAe,OAAO;AAAA,EAAG;AAAA,EAC5F,MAAM,eAAe,SAAwB;AAAE,WAAO,KAAK,SAAS,gBAAgB,OAAO;AAAA,EAAG;AAAA,EAC9F,MAAM,SAAS,SAAwB;AAAE,WAAO,KAAK,SAAS,UAAU,OAAO;AAAA,EAAG;AAAA;AAAA,EAGlF,MAAM,YACJ,UAAoB,CAAC,aAAa,YAAY,YAAY,UAAU,aAAa,GACjF,SACsC;AACtC,UAAM,UAAU,MAAM,QAAQ;AAAA,MAC5B,QAAQ,IAAI,CAAC,MAAM,KAAK,SAAS,GAAG,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAU,CAAC;AAAA,IAC3E;AACA,WAAO,OAAO,YAAY,OAAO;AAAA,EACnC;AAAA;AAAA,EAIA,MAAM,cACJ,QACA,SAC2B;AAC3B,UAAM,SAAiC;AAAA,MACrC,QAAQ,KAAK;AAAA,MACb,QAAQ;AAAA,MACR,UAAU;AAAA,IACZ;AAEA,QAAI,SAAS,OAAQ,QAAO,SAAS,QAAQ;AAC7C,QAAI,SAAS,SAAU,QAAO,WAAW,QAAQ;AACjD,QAAI,SAAS,OAAQ,QAAO,SAAS,QAAQ;AAC7C,QAAI,SAAS,YAAa,QAAO,cAAc,QAAQ;AACvD,QAAI,SAAS,QAAS,QAAO,UAAU,KAAK,UAAU,QAAQ,OAAO;AAErE,UAAM,EAAE,KAAK,IAAI,MAAM,KAAK,KAAK,IAAsB,KAAK,UAAU,EAAE,OAAO,CAAC;AAChF,WAAO;AAAA,EACT;AAAA;AAAA,EAIA,MAAM,cAAc,SAAuD;AACzE,UAAM,SAAiC,EAAE,QAAQ,KAAK,OAAO;AAE7D,QAAI,SAAS,KAAM,QAAO,OAAO,QAAQ;AACzC,QAAI,SAAS,UAAW,QAAO,YAAY,QAAQ;AACnD,QAAI,SAAS,cAAc,QAAQ,WAAW,SAAS,EAAG,QAAO,aAAa,QAAQ,WAAW,KAAK,GAAG;AACzG,QAAI,SAAS,YAAa,QAAO,cAAc,QAAQ;AACvD,QAAI,SAAS,UAAW,QAAO,YAAY,QAAQ;AACnD,QAAI,SAAS,OAAQ,QAAO,SAAS,QAAQ;AAC7C,QAAI,SAAS,OAAQ,QAAO,SAAS,QAAQ;AAC7C,QAAI,SAAS,SAAU,QAAO,WAAW,QAAQ;AACjD,QAAI,SAAS,OAAQ,QAAO,SAAS,QAAQ;AAC7C,QAAI,SAAS,MAAO,QAAO,QAAQ,OAAO,QAAQ,KAAK;AACvD,QAAI,SAAS,OAAQ,QAAO,SAAS,OAAO,QAAQ,MAAM;AAE1D,UAAM,EAAE,KAAK,IAAI,MAAM,KAAK,KAAK,IAAqB,eAAe,EAAE,OAAO,CAAC;AAC/E,WAAO;AAAA,EACT;AAAA;AAAA,EAIA,MAAM,SAAS,SAAqD;AAClE,UAAM,SAAiC,EAAE,QAAQ,KAAK,OAAO;AAE7D,QAAI,SAAS,OAAQ,QAAO,SAAS,QAAQ;AAC7C,QAAI,SAAS,MAAO,QAAO,QAAQ,OAAO,QAAQ,KAAK;AACvD,QAAI,SAAS,OAAQ,QAAO,SAAS,OAAO,QAAQ,MAAM;AAE1D,UAAM,EAAE,KAAK,IAAI,MAAM,KAAK,KAAK,IAAoB,cAAc,EAAE,OAAO,CAAC;AAC7E,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,cAAc,WAAwC;AAC1D,UAAM,SAAiC,EAAE,QAAQ,KAAK,OAAO;AAC7D,UAAM,EAAE,KAAK,IAAI,MAAM,KAAK,KAAK,IAA0B,cAAc,mBAAmB,SAAS,CAAC,IAAI,EAAE,OAAO,CAAC;AACpH,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAM,cAAc,WAAmB,SAAuD;AAC5F,UAAM,SAAiC,EAAE,QAAQ,KAAK,OAAO;AAE7D,QAAI,SAAS,KAAM,QAAO,OAAO,QAAQ;AACzC,QAAI,SAAS,UAAW,QAAO,YAAY,QAAQ;AACnD,QAAI,SAAS,cAAc,QAAQ,WAAW,SAAS,EAAG,QAAO,aAAa,QAAQ,WAAW,KAAK,GAAG;AACzG,QAAI,SAAS,YAAa,QAAO,cAAc,QAAQ;AACvD,QAAI,SAAS,OAAQ,QAAO,SAAS,QAAQ;AAC7C,QAAI,SAAS,SAAU,QAAO,WAAW,QAAQ;AACjD,QAAI,SAAS,OAAQ,QAAO,SAAS,QAAQ;AAC7C,QAAI,SAAS,MAAO,QAAO,QAAQ,OAAO,QAAQ,KAAK;AACvD,QAAI,SAAS,OAAQ,QAAO,SAAS,OAAO,QAAQ,MAAM;AAE1D,UAAM,EAAE,KAAK,IAAI,MAAM,KAAK,KAAK,IAAqB,cAAc,mBAAmB,SAAS,CAAC,WAAW,EAAE,OAAO,CAAC;AACtH,WAAO;AAAA,EACT;AAAA;AAAA,EAIA,MAAM,aAAa,SAAsD;AACvE,UAAM,SAAiC;AAAA,MACrC,QAAQ,KAAK;AAAA,MACb,QAAQ;AAAA,IACV;AAEA,QAAI,SAAS,OAAQ,QAAO,SAAS,QAAQ;AAC7C,QAAI,SAAS,MAAO,QAAO,QAAQ,OAAO,QAAQ,KAAK;AAEvD,UAAM,EAAE,KAAK,IAAI,MAAM,KAAK,KAAK,IAAqB,KAAK,UAAU,EAAE,OAAO,CAAC;AAC/E,WAAO;AAAA,EACT;AACF;AAGO,SAAS,aAAa,QAAoD;AAC/E,SAAO,IAAI,kBAAkB,MAAM;AACrC;;;ACjOA,IAAAC,gBAA0C;AAYnC,IAAM,cAAN,MAAkB;AAAA,EACf;AAAA,EACA;AAAA,EAER,YAAY,QAA2B;AACrC,SAAK,WAAW,OAAO,YAAY;AAEnC,SAAK,OAAO,cAAAC,QAAM,OAAO;AAAA,MACvB,SAAS,OAAO,QAAQ,QAAQ,OAAO,EAAE;AAAA,MACzC,SAAS;AAAA,QACP,gBAAgB;AAAA,QAChB,8BAA8B,OAAO;AAAA,MACvC;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,YAAuD;AAC3D,UAAM,EAAE,KAAK,IAAI,MAAM,KAAK,KAAK,IAAI,KAAK,QAAQ;AAClD,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,QAAQ,QAAyC;AACrD,UAAM,EAAE,KAAK,IAAI,MAAM,KAAK,KAAK,IAAI,GAAG,KAAK,QAAQ,IAAI,MAAM,EAAE;AACjE,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,WAAW,MAAkD;AACjE,UAAM,EAAE,KAAK,IAAI,MAAM,KAAK,KAAK,KAAK,KAAK,UAAU,IAAI;AACzD,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,WAAW,QAAgB,MAAkD;AACjF,UAAM,EAAE,KAAK,IAAI,MAAM,KAAK,KAAK,IAAI,GAAG,KAAK,QAAQ,IAAI,MAAM,IAAI,IAAI;AACvE,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,WAAW,QAA0C;AACzD,UAAM,EAAE,KAAK,IAAI,MAAM,KAAK,KAAK,OAAO,GAAG,KAAK,QAAQ,IAAI,MAAM,EAAE;AACpE,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,iBAAiB,QAAyC;AAC9D,UAAM,EAAE,KAAK,IAAI,MAAM,KAAK,KAAK,KAAK,GAAG,KAAK,QAAQ,IAAI,MAAM,aAAa;AAC7E,WAAO;AAAA,EACT;AACF;AAEO,SAAS,kBAAkB,QAAwC;AACxE,SAAO,IAAI,YAAY,MAAM;AAC/B;","names":["axios","import_axios","axios"]}
package/dist/index.d.cts CHANGED
@@ -28,6 +28,8 @@ interface RetentionOptions {
28
28
  interface EventsListOptions {
29
29
  type?: EventType;
30
30
  eventName?: string;
31
+ eventNames?: string[];
32
+ eventSource?: 'auto' | 'manual';
31
33
  visitorId?: string;
32
34
  userId?: string;
33
35
  period?: Period;
@@ -41,6 +43,7 @@ interface TimeSeriesOptions {
41
43
  dateFrom?: string;
42
44
  dateTo?: string;
43
45
  granularity?: Granularity;
46
+ filters?: Record<string, string>;
44
47
  }
45
48
  interface UsersListOptions {
46
49
  search?: string;
@@ -70,7 +73,7 @@ declare class LitemetricsClient {
70
73
  getTopOS(options?: StatsOptions): Promise<QueryResult>;
71
74
  /** Fetch multiple metrics in parallel */
72
75
  getOverview(metrics?: Metric[], options?: StatsOptions): Promise<Record<Metric, QueryResult>>;
73
- getTimeSeries(metric: 'pageviews' | 'visitors' | 'sessions', options?: TimeSeriesOptions): Promise<TimeSeriesResult>;
76
+ getTimeSeries(metric: 'pageviews' | 'visitors' | 'sessions' | 'events' | 'conversions', options?: TimeSeriesOptions): Promise<TimeSeriesResult>;
74
77
  getEventsList(options?: EventsListOptions): Promise<EventListResult>;
75
78
  getUsers(options?: UsersListOptions): Promise<UserListResult>;
76
79
  getUserDetail(visitorId: string): Promise<UserDetail>;
package/dist/index.d.ts CHANGED
@@ -28,6 +28,8 @@ interface RetentionOptions {
28
28
  interface EventsListOptions {
29
29
  type?: EventType;
30
30
  eventName?: string;
31
+ eventNames?: string[];
32
+ eventSource?: 'auto' | 'manual';
31
33
  visitorId?: string;
32
34
  userId?: string;
33
35
  period?: Period;
@@ -41,6 +43,7 @@ interface TimeSeriesOptions {
41
43
  dateFrom?: string;
42
44
  dateTo?: string;
43
45
  granularity?: Granularity;
46
+ filters?: Record<string, string>;
44
47
  }
45
48
  interface UsersListOptions {
46
49
  search?: string;
@@ -70,7 +73,7 @@ declare class LitemetricsClient {
70
73
  getTopOS(options?: StatsOptions): Promise<QueryResult>;
71
74
  /** Fetch multiple metrics in parallel */
72
75
  getOverview(metrics?: Metric[], options?: StatsOptions): Promise<Record<Metric, QueryResult>>;
73
- getTimeSeries(metric: 'pageviews' | 'visitors' | 'sessions', options?: TimeSeriesOptions): Promise<TimeSeriesResult>;
76
+ getTimeSeries(metric: 'pageviews' | 'visitors' | 'sessions' | 'events' | 'conversions', options?: TimeSeriesOptions): Promise<TimeSeriesResult>;
74
77
  getEventsList(options?: EventsListOptions): Promise<EventListResult>;
75
78
  getUsers(options?: UsersListOptions): Promise<UserListResult>;
76
79
  getUserDetail(visitorId: string): Promise<UserDetail>;
package/dist/index.js CHANGED
@@ -73,7 +73,7 @@ var LitemetricsClient = class {
73
73
  return this.getStats("top_os", options);
74
74
  }
75
75
  /** Fetch multiple metrics in parallel */
76
- async getOverview(metrics = ["pageviews", "visitors", "sessions", "events"], options) {
76
+ async getOverview(metrics = ["pageviews", "visitors", "sessions", "events", "conversions"], options) {
77
77
  const results = await Promise.all(
78
78
  metrics.map((m) => this.getStats(m, options).then((r) => [m, r]))
79
79
  );
@@ -90,6 +90,7 @@ var LitemetricsClient = class {
90
90
  if (options?.dateFrom) params.dateFrom = options.dateFrom;
91
91
  if (options?.dateTo) params.dateTo = options.dateTo;
92
92
  if (options?.granularity) params.granularity = options.granularity;
93
+ if (options?.filters) params.filters = JSON.stringify(options.filters);
93
94
  const { data } = await this.http.get(this.endpoint, { params });
94
95
  return data;
95
96
  }
@@ -98,6 +99,8 @@ var LitemetricsClient = class {
98
99
  const params = { siteId: this.siteId };
99
100
  if (options?.type) params.type = options.type;
100
101
  if (options?.eventName) params.eventName = options.eventName;
102
+ if (options?.eventNames && options.eventNames.length > 0) params.eventNames = options.eventNames.join(",");
103
+ if (options?.eventSource) params.eventSource = options.eventSource;
101
104
  if (options?.visitorId) params.visitorId = options.visitorId;
102
105
  if (options?.userId) params.userId = options.userId;
103
106
  if (options?.period) params.period = options.period;
@@ -125,6 +128,9 @@ var LitemetricsClient = class {
125
128
  async getUserEvents(visitorId, options) {
126
129
  const params = { siteId: this.siteId };
127
130
  if (options?.type) params.type = options.type;
131
+ if (options?.eventName) params.eventName = options.eventName;
132
+ if (options?.eventNames && options.eventNames.length > 0) params.eventNames = options.eventNames.join(",");
133
+ if (options?.eventSource) params.eventSource = options.eventSource;
128
134
  if (options?.period) params.period = options.period;
129
135
  if (options?.dateFrom) params.dateFrom = options.dateFrom;
130
136
  if (options?.dateTo) params.dateTo = options.dateTo;
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/client.ts","../src/sites.ts"],"sourcesContent":["import axios, { type AxiosInstance } from 'axios';\nimport type { Metric, Period, Granularity, QueryResult, TimeSeriesResult, RetentionResult, EventListResult, UserListResult, UserDetail, EventType } from '@litemetrics/core';\n\nexport interface LitemetricsClientConfig {\n /** Base URL of the Litemetrics server (e.g. \"https://analytics.myapp.com\") */\n baseUrl: string;\n /** Site ID to query */\n siteId: string;\n /** Secret key for authentication (sk_xxx) */\n secretKey?: string;\n /** Query endpoint path (default: \"/api/stats\") */\n endpoint?: string;\n /** Custom headers to include in requests */\n headers?: Record<string, string>;\n}\n\nexport interface StatsOptions {\n period?: Period;\n dateFrom?: string;\n dateTo?: string;\n limit?: number;\n filters?: Record<string, string>;\n compare?: boolean;\n}\n\nexport interface RetentionOptions {\n period?: Period;\n weeks?: number;\n}\n\nexport interface EventsListOptions {\n type?: EventType;\n eventName?: string;\n visitorId?: string;\n userId?: string;\n period?: Period;\n dateFrom?: string;\n dateTo?: string;\n limit?: number;\n offset?: number;\n}\n\nexport interface TimeSeriesOptions {\n period?: Period;\n dateFrom?: string;\n dateTo?: string;\n granularity?: Granularity;\n}\n\nexport interface UsersListOptions {\n search?: string;\n limit?: number;\n offset?: number;\n}\n\nexport class LitemetricsClient {\n private siteId: string;\n private endpoint: string;\n private http: AxiosInstance;\n\n constructor(config: LitemetricsClientConfig) {\n this.siteId = config.siteId;\n this.endpoint = config.endpoint ?? '/api/stats';\n\n const headers: Record<string, string> = { ...config.headers };\n if (config.secretKey) {\n headers['X-Litemetrics-Secret'] = config.secretKey;\n }\n\n this.http = axios.create({\n baseURL: config.baseUrl.replace(/\\/$/, ''),\n headers,\n });\n }\n\n /** Change the active site ID */\n setSiteId(siteId: string): void {\n this.siteId = siteId;\n }\n\n /** Get any metric */\n async getStats(metric: Metric, options?: StatsOptions): Promise<QueryResult> {\n const params: Record<string, string> = {\n siteId: this.siteId,\n metric,\n };\n\n if (options?.period) params.period = options.period;\n if (options?.dateFrom) params.dateFrom = options.dateFrom;\n if (options?.dateTo) params.dateTo = options.dateTo;\n if (options?.limit) params.limit = String(options.limit);\n if (options?.filters) params.filters = JSON.stringify(options.filters);\n if (options?.compare) params.compare = 'true';\n\n const { data } = await this.http.get<QueryResult>(this.endpoint, { params });\n return data;\n }\n\n // ─── Convenience methods ──────────────────────────────────\n\n async getPageviews(options?: StatsOptions) { return this.getStats('pageviews', options); }\n async getVisitors(options?: StatsOptions) { return this.getStats('visitors', options); }\n async getSessions(options?: StatsOptions) { return this.getStats('sessions', options); }\n async getEvents(options?: StatsOptions) { return this.getStats('events', options); }\n async getTopPages(options?: StatsOptions) { return this.getStats('top_pages', options); }\n async getTopReferrers(options?: StatsOptions) { return this.getStats('top_referrers', options); }\n async getTopCountries(options?: StatsOptions) { return this.getStats('top_countries', options); }\n async getTopCities(options?: StatsOptions) { return this.getStats('top_cities', options); }\n async getTopEvents(options?: StatsOptions) { return this.getStats('top_events', options); }\n async getTopDevices(options?: StatsOptions) { return this.getStats('top_devices', options); }\n async getTopBrowsers(options?: StatsOptions) { return this.getStats('top_browsers', options); }\n async getTopOS(options?: StatsOptions) { return this.getStats('top_os', options); }\n\n /** Fetch multiple metrics in parallel */\n async getOverview(\n metrics: Metric[] = ['pageviews', 'visitors', 'sessions', 'events'],\n options?: StatsOptions,\n ): Promise<Record<Metric, QueryResult>> {\n const results = await Promise.all(\n metrics.map((m) => this.getStats(m, options).then((r) => [m, r] as const)),\n );\n return Object.fromEntries(results) as Record<Metric, QueryResult>;\n }\n\n // ─── Time series ──────────────────────────────────────\n\n async getTimeSeries(\n metric: 'pageviews' | 'visitors' | 'sessions',\n options?: TimeSeriesOptions,\n ): Promise<TimeSeriesResult> {\n const params: Record<string, string> = {\n siteId: this.siteId,\n metric: 'timeseries',\n tsMetric: metric,\n };\n\n if (options?.period) params.period = options.period;\n if (options?.dateFrom) params.dateFrom = options.dateFrom;\n if (options?.dateTo) params.dateTo = options.dateTo;\n if (options?.granularity) params.granularity = options.granularity;\n\n const { data } = await this.http.get<TimeSeriesResult>(this.endpoint, { params });\n return data;\n }\n\n // ─── Event listing ──────────────────────────────────────\n\n async getEventsList(options?: EventsListOptions): Promise<EventListResult> {\n const params: Record<string, string> = { siteId: this.siteId };\n\n if (options?.type) params.type = options.type;\n if (options?.eventName) params.eventName = options.eventName;\n if (options?.visitorId) params.visitorId = options.visitorId;\n if (options?.userId) params.userId = options.userId;\n if (options?.period) params.period = options.period;\n if (options?.dateFrom) params.dateFrom = options.dateFrom;\n if (options?.dateTo) params.dateTo = options.dateTo;\n if (options?.limit) params.limit = String(options.limit);\n if (options?.offset) params.offset = String(options.offset);\n\n const { data } = await this.http.get<EventListResult>('/api/events', { params });\n return data;\n }\n\n // ─── User listing ──────────────────────────────────────\n\n async getUsers(options?: UsersListOptions): Promise<UserListResult> {\n const params: Record<string, string> = { siteId: this.siteId };\n\n if (options?.search) params.search = options.search;\n if (options?.limit) params.limit = String(options.limit);\n if (options?.offset) params.offset = String(options.offset);\n\n const { data } = await this.http.get<UserListResult>('/api/users', { params });\n return data;\n }\n\n async getUserDetail(visitorId: string): Promise<UserDetail> {\n const params: Record<string, string> = { siteId: this.siteId };\n const { data } = await this.http.get<{ user: UserDetail }>(`/api/users/${encodeURIComponent(visitorId)}`, { params });\n return data.user;\n }\n\n async getUserEvents(visitorId: string, options?: EventsListOptions): Promise<EventListResult> {\n const params: Record<string, string> = { siteId: this.siteId };\n\n if (options?.type) params.type = options.type;\n if (options?.period) params.period = options.period;\n if (options?.dateFrom) params.dateFrom = options.dateFrom;\n if (options?.dateTo) params.dateTo = options.dateTo;\n if (options?.limit) params.limit = String(options.limit);\n if (options?.offset) params.offset = String(options.offset);\n\n const { data } = await this.http.get<EventListResult>(`/api/users/${encodeURIComponent(visitorId)}/events`, { params });\n return data;\n }\n\n // ─── Retention ──────────────────────────────────────\n\n async getRetention(options?: RetentionOptions): Promise<RetentionResult> {\n const params: Record<string, string> = {\n siteId: this.siteId,\n metric: 'retention',\n };\n\n if (options?.period) params.period = options.period;\n if (options?.weeks) params.weeks = String(options.weeks);\n\n const { data } = await this.http.get<RetentionResult>(this.endpoint, { params });\n return data;\n }\n}\n\n/** Create an LitemetricsClient instance */\nexport function createClient(config: LitemetricsClientConfig): LitemetricsClient {\n return new LitemetricsClient(config);\n}\n","import axios, { type AxiosInstance } from 'axios';\nimport type { Site, CreateSiteRequest, UpdateSiteRequest } from '@litemetrics/core';\n\nexport interface SitesClientConfig {\n /** Base URL of the Litemetrics server */\n baseUrl: string;\n /** Admin secret for authentication */\n adminSecret: string;\n /** Sites endpoint path (default: \"/api/sites\") */\n endpoint?: string;\n}\n\nexport class SitesClient {\n private endpoint: string;\n private http: AxiosInstance;\n\n constructor(config: SitesClientConfig) {\n this.endpoint = config.endpoint ?? '/api/sites';\n\n this.http = axios.create({\n baseURL: config.baseUrl.replace(/\\/$/, ''),\n headers: {\n 'Content-Type': 'application/json',\n 'X-Litemetrics-Admin-Secret': config.adminSecret,\n },\n });\n }\n\n async listSites(): Promise<{ sites: Site[]; total: number }> {\n const { data } = await this.http.get(this.endpoint);\n return data;\n }\n\n async getSite(siteId: string): Promise<{ site: Site }> {\n const { data } = await this.http.get(`${this.endpoint}/${siteId}`);\n return data;\n }\n\n async createSite(body: CreateSiteRequest): Promise<{ site: Site }> {\n const { data } = await this.http.post(this.endpoint, body);\n return data;\n }\n\n async updateSite(siteId: string, body: UpdateSiteRequest): Promise<{ site: Site }> {\n const { data } = await this.http.put(`${this.endpoint}/${siteId}`, body);\n return data;\n }\n\n async deleteSite(siteId: string): Promise<{ ok: boolean }> {\n const { data } = await this.http.delete(`${this.endpoint}/${siteId}`);\n return data;\n }\n\n async regenerateSecret(siteId: string): Promise<{ site: Site }> {\n const { data } = await this.http.post(`${this.endpoint}/${siteId}/regenerate`);\n return data;\n }\n}\n\nexport function createSitesClient(config: SitesClientConfig): SitesClient {\n return new SitesClient(config);\n}\n"],"mappings":"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","names":["axios"]}
1
+ {"version":3,"sources":["../src/client.ts","../src/sites.ts"],"sourcesContent":["import axios, { type AxiosInstance } from 'axios';\nimport type { Metric, Period, Granularity, QueryResult, TimeSeriesResult, RetentionResult, EventListResult, UserListResult, UserDetail, EventType } from '@litemetrics/core';\n\nexport interface LitemetricsClientConfig {\n /** Base URL of the Litemetrics server (e.g. \"https://analytics.myapp.com\") */\n baseUrl: string;\n /** Site ID to query */\n siteId: string;\n /** Secret key for authentication (sk_xxx) */\n secretKey?: string;\n /** Query endpoint path (default: \"/api/stats\") */\n endpoint?: string;\n /** Custom headers to include in requests */\n headers?: Record<string, string>;\n}\n\nexport interface StatsOptions {\n period?: Period;\n dateFrom?: string;\n dateTo?: string;\n limit?: number;\n filters?: Record<string, string>;\n compare?: boolean;\n}\n\nexport interface RetentionOptions {\n period?: Period;\n weeks?: number;\n}\n\nexport interface EventsListOptions {\n type?: EventType;\n eventName?: string;\n eventNames?: string[];\n eventSource?: 'auto' | 'manual';\n visitorId?: string;\n userId?: string;\n period?: Period;\n dateFrom?: string;\n dateTo?: string;\n limit?: number;\n offset?: number;\n}\n\nexport interface TimeSeriesOptions {\n period?: Period;\n dateFrom?: string;\n dateTo?: string;\n granularity?: Granularity;\n filters?: Record<string, string>;\n}\n\nexport interface UsersListOptions {\n search?: string;\n limit?: number;\n offset?: number;\n}\n\nexport class LitemetricsClient {\n private siteId: string;\n private endpoint: string;\n private http: AxiosInstance;\n\n constructor(config: LitemetricsClientConfig) {\n this.siteId = config.siteId;\n this.endpoint = config.endpoint ?? '/api/stats';\n\n const headers: Record<string, string> = { ...config.headers };\n if (config.secretKey) {\n headers['X-Litemetrics-Secret'] = config.secretKey;\n }\n\n this.http = axios.create({\n baseURL: config.baseUrl.replace(/\\/$/, ''),\n headers,\n });\n }\n\n /** Change the active site ID */\n setSiteId(siteId: string): void {\n this.siteId = siteId;\n }\n\n /** Get any metric */\n async getStats(metric: Metric, options?: StatsOptions): Promise<QueryResult> {\n const params: Record<string, string> = {\n siteId: this.siteId,\n metric,\n };\n\n if (options?.period) params.period = options.period;\n if (options?.dateFrom) params.dateFrom = options.dateFrom;\n if (options?.dateTo) params.dateTo = options.dateTo;\n if (options?.limit) params.limit = String(options.limit);\n if (options?.filters) params.filters = JSON.stringify(options.filters);\n if (options?.compare) params.compare = 'true';\n\n const { data } = await this.http.get<QueryResult>(this.endpoint, { params });\n return data;\n }\n\n // ─── Convenience methods ──────────────────────────────────\n\n async getPageviews(options?: StatsOptions) { return this.getStats('pageviews', options); }\n async getVisitors(options?: StatsOptions) { return this.getStats('visitors', options); }\n async getSessions(options?: StatsOptions) { return this.getStats('sessions', options); }\n async getEvents(options?: StatsOptions) { return this.getStats('events', options); }\n async getTopPages(options?: StatsOptions) { return this.getStats('top_pages', options); }\n async getTopReferrers(options?: StatsOptions) { return this.getStats('top_referrers', options); }\n async getTopCountries(options?: StatsOptions) { return this.getStats('top_countries', options); }\n async getTopCities(options?: StatsOptions) { return this.getStats('top_cities', options); }\n async getTopEvents(options?: StatsOptions) { return this.getStats('top_events', options); }\n async getTopDevices(options?: StatsOptions) { return this.getStats('top_devices', options); }\n async getTopBrowsers(options?: StatsOptions) { return this.getStats('top_browsers', options); }\n async getTopOS(options?: StatsOptions) { return this.getStats('top_os', options); }\n\n /** Fetch multiple metrics in parallel */\n async getOverview(\n metrics: Metric[] = ['pageviews', 'visitors', 'sessions', 'events', 'conversions'],\n options?: StatsOptions,\n ): Promise<Record<Metric, QueryResult>> {\n const results = await Promise.all(\n metrics.map((m) => this.getStats(m, options).then((r) => [m, r] as const)),\n );\n return Object.fromEntries(results) as Record<Metric, QueryResult>;\n }\n\n // ─── Time series ──────────────────────────────────────\n\n async getTimeSeries(\n metric: 'pageviews' | 'visitors' | 'sessions' | 'events' | 'conversions',\n options?: TimeSeriesOptions,\n ): Promise<TimeSeriesResult> {\n const params: Record<string, string> = {\n siteId: this.siteId,\n metric: 'timeseries',\n tsMetric: metric,\n };\n\n if (options?.period) params.period = options.period;\n if (options?.dateFrom) params.dateFrom = options.dateFrom;\n if (options?.dateTo) params.dateTo = options.dateTo;\n if (options?.granularity) params.granularity = options.granularity;\n if (options?.filters) params.filters = JSON.stringify(options.filters);\n\n const { data } = await this.http.get<TimeSeriesResult>(this.endpoint, { params });\n return data;\n }\n\n // ─── Event listing ──────────────────────────────────────\n\n async getEventsList(options?: EventsListOptions): Promise<EventListResult> {\n const params: Record<string, string> = { siteId: this.siteId };\n\n if (options?.type) params.type = options.type;\n if (options?.eventName) params.eventName = options.eventName;\n if (options?.eventNames && options.eventNames.length > 0) params.eventNames = options.eventNames.join(',');\n if (options?.eventSource) params.eventSource = options.eventSource;\n if (options?.visitorId) params.visitorId = options.visitorId;\n if (options?.userId) params.userId = options.userId;\n if (options?.period) params.period = options.period;\n if (options?.dateFrom) params.dateFrom = options.dateFrom;\n if (options?.dateTo) params.dateTo = options.dateTo;\n if (options?.limit) params.limit = String(options.limit);\n if (options?.offset) params.offset = String(options.offset);\n\n const { data } = await this.http.get<EventListResult>('/api/events', { params });\n return data;\n }\n\n // ─── User listing ──────────────────────────────────────\n\n async getUsers(options?: UsersListOptions): Promise<UserListResult> {\n const params: Record<string, string> = { siteId: this.siteId };\n\n if (options?.search) params.search = options.search;\n if (options?.limit) params.limit = String(options.limit);\n if (options?.offset) params.offset = String(options.offset);\n\n const { data } = await this.http.get<UserListResult>('/api/users', { params });\n return data;\n }\n\n async getUserDetail(visitorId: string): Promise<UserDetail> {\n const params: Record<string, string> = { siteId: this.siteId };\n const { data } = await this.http.get<{ user: UserDetail }>(`/api/users/${encodeURIComponent(visitorId)}`, { params });\n return data.user;\n }\n\n async getUserEvents(visitorId: string, options?: EventsListOptions): Promise<EventListResult> {\n const params: Record<string, string> = { siteId: this.siteId };\n\n if (options?.type) params.type = options.type;\n if (options?.eventName) params.eventName = options.eventName;\n if (options?.eventNames && options.eventNames.length > 0) params.eventNames = options.eventNames.join(',');\n if (options?.eventSource) params.eventSource = options.eventSource;\n if (options?.period) params.period = options.period;\n if (options?.dateFrom) params.dateFrom = options.dateFrom;\n if (options?.dateTo) params.dateTo = options.dateTo;\n if (options?.limit) params.limit = String(options.limit);\n if (options?.offset) params.offset = String(options.offset);\n\n const { data } = await this.http.get<EventListResult>(`/api/users/${encodeURIComponent(visitorId)}/events`, { params });\n return data;\n }\n\n // ─── Retention ──────────────────────────────────────\n\n async getRetention(options?: RetentionOptions): Promise<RetentionResult> {\n const params: Record<string, string> = {\n siteId: this.siteId,\n metric: 'retention',\n };\n\n if (options?.period) params.period = options.period;\n if (options?.weeks) params.weeks = String(options.weeks);\n\n const { data } = await this.http.get<RetentionResult>(this.endpoint, { params });\n return data;\n }\n}\n\n/** Create an LitemetricsClient instance */\nexport function createClient(config: LitemetricsClientConfig): LitemetricsClient {\n return new LitemetricsClient(config);\n}\n","import axios, { type AxiosInstance } from 'axios';\nimport type { Site, CreateSiteRequest, UpdateSiteRequest } from '@litemetrics/core';\n\nexport interface SitesClientConfig {\n /** Base URL of the Litemetrics server */\n baseUrl: string;\n /** Admin secret for authentication */\n adminSecret: string;\n /** Sites endpoint path (default: \"/api/sites\") */\n endpoint?: string;\n}\n\nexport class SitesClient {\n private endpoint: string;\n private http: AxiosInstance;\n\n constructor(config: SitesClientConfig) {\n this.endpoint = config.endpoint ?? '/api/sites';\n\n this.http = axios.create({\n baseURL: config.baseUrl.replace(/\\/$/, ''),\n headers: {\n 'Content-Type': 'application/json',\n 'X-Litemetrics-Admin-Secret': config.adminSecret,\n },\n });\n }\n\n async listSites(): Promise<{ sites: Site[]; total: number }> {\n const { data } = await this.http.get(this.endpoint);\n return data;\n }\n\n async getSite(siteId: string): Promise<{ site: Site }> {\n const { data } = await this.http.get(`${this.endpoint}/${siteId}`);\n return data;\n }\n\n async createSite(body: CreateSiteRequest): Promise<{ site: Site }> {\n const { data } = await this.http.post(this.endpoint, body);\n return data;\n }\n\n async updateSite(siteId: string, body: UpdateSiteRequest): Promise<{ site: Site }> {\n const { data } = await this.http.put(`${this.endpoint}/${siteId}`, body);\n return data;\n }\n\n async deleteSite(siteId: string): Promise<{ ok: boolean }> {\n const { data } = await this.http.delete(`${this.endpoint}/${siteId}`);\n return data;\n }\n\n async regenerateSecret(siteId: string): Promise<{ site: Site }> {\n const { data } = await this.http.post(`${this.endpoint}/${siteId}/regenerate`);\n return data;\n }\n}\n\nexport function createSitesClient(config: SitesClientConfig): SitesClient {\n return new SitesClient(config);\n}\n"],"mappings":"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","names":["axios"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@litemetrics/client",
3
- "version": "0.1.0",
3
+ "version": "0.1.2",
4
4
  "description": "Client-side SDK for querying Litemetrics analytics data",
5
5
  "license": "MIT",
6
6
  "author": "Metehan Kurucu",
@@ -9,7 +9,13 @@
9
9
  "url": "https://github.com/metehankurucu/litemetrics",
10
10
  "directory": "packages/client"
11
11
  },
12
- "keywords": ["analytics", "litemetrics", "client", "dashboard", "query"],
12
+ "keywords": [
13
+ "analytics",
14
+ "litemetrics",
15
+ "client",
16
+ "dashboard",
17
+ "query"
18
+ ],
13
19
  "type": "module",
14
20
  "main": "./dist/index.cjs",
15
21
  "module": "./dist/index.js",
@@ -21,7 +27,9 @@
21
27
  "require": "./dist/index.cjs"
22
28
  }
23
29
  },
24
- "files": ["dist"],
30
+ "files": [
31
+ "dist"
32
+ ],
25
33
  "publishConfig": {
26
34
  "access": "public"
27
35
  },
@@ -32,7 +40,7 @@
32
40
  "clean": "rm -rf dist"
33
41
  },
34
42
  "dependencies": {
35
- "@litemetrics/core": "0.1.0",
43
+ "@litemetrics/core": "0.1.1",
36
44
  "axios": "^1.13.4"
37
45
  },
38
46
  "devDependencies": {