@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 +118 -0
- package/dist/index.cjs +7 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +4 -1
- package/dist/index.d.ts +4 -1
- package/dist/index.js +7 -1
- package/dist/index.js.map +1 -1
- package/package.json +12 -4
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;
|
package/dist/index.cjs.map
CHANGED
|
@@ -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":"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","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.
|
|
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": [
|
|
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": [
|
|
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.
|
|
43
|
+
"@litemetrics/core": "0.1.1",
|
|
36
44
|
"axios": "^1.13.4"
|
|
37
45
|
},
|
|
38
46
|
"devDependencies": {
|