@litemetrics/client 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs ADDED
@@ -0,0 +1,241 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+
30
+ // src/index.ts
31
+ var index_exports = {};
32
+ __export(index_exports, {
33
+ LitemetricsClient: () => LitemetricsClient,
34
+ SitesClient: () => SitesClient,
35
+ createClient: () => createClient,
36
+ createSitesClient: () => createSitesClient
37
+ });
38
+ module.exports = __toCommonJS(index_exports);
39
+
40
+ // src/client.ts
41
+ var import_axios = __toESM(require("axios"), 1);
42
+ var LitemetricsClient = class {
43
+ siteId;
44
+ endpoint;
45
+ http;
46
+ constructor(config) {
47
+ this.siteId = config.siteId;
48
+ this.endpoint = config.endpoint ?? "/api/stats";
49
+ const headers = { ...config.headers };
50
+ if (config.secretKey) {
51
+ headers["X-Litemetrics-Secret"] = config.secretKey;
52
+ }
53
+ this.http = import_axios.default.create({
54
+ baseURL: config.baseUrl.replace(/\/$/, ""),
55
+ headers
56
+ });
57
+ }
58
+ /** Change the active site ID */
59
+ setSiteId(siteId) {
60
+ this.siteId = siteId;
61
+ }
62
+ /** Get any metric */
63
+ async getStats(metric, options) {
64
+ const params = {
65
+ siteId: this.siteId,
66
+ metric
67
+ };
68
+ if (options?.period) params.period = options.period;
69
+ if (options?.dateFrom) params.dateFrom = options.dateFrom;
70
+ if (options?.dateTo) params.dateTo = options.dateTo;
71
+ if (options?.limit) params.limit = String(options.limit);
72
+ if (options?.filters) params.filters = JSON.stringify(options.filters);
73
+ if (options?.compare) params.compare = "true";
74
+ const { data } = await this.http.get(this.endpoint, { params });
75
+ return data;
76
+ }
77
+ // ─── Convenience methods ──────────────────────────────────
78
+ async getPageviews(options) {
79
+ return this.getStats("pageviews", options);
80
+ }
81
+ async getVisitors(options) {
82
+ return this.getStats("visitors", options);
83
+ }
84
+ async getSessions(options) {
85
+ return this.getStats("sessions", options);
86
+ }
87
+ async getEvents(options) {
88
+ return this.getStats("events", options);
89
+ }
90
+ async getTopPages(options) {
91
+ return this.getStats("top_pages", options);
92
+ }
93
+ async getTopReferrers(options) {
94
+ return this.getStats("top_referrers", options);
95
+ }
96
+ async getTopCountries(options) {
97
+ return this.getStats("top_countries", options);
98
+ }
99
+ async getTopCities(options) {
100
+ return this.getStats("top_cities", options);
101
+ }
102
+ async getTopEvents(options) {
103
+ return this.getStats("top_events", options);
104
+ }
105
+ async getTopDevices(options) {
106
+ return this.getStats("top_devices", options);
107
+ }
108
+ async getTopBrowsers(options) {
109
+ return this.getStats("top_browsers", options);
110
+ }
111
+ async getTopOS(options) {
112
+ return this.getStats("top_os", options);
113
+ }
114
+ /** Fetch multiple metrics in parallel */
115
+ async getOverview(metrics = ["pageviews", "visitors", "sessions", "events"], options) {
116
+ const results = await Promise.all(
117
+ metrics.map((m) => this.getStats(m, options).then((r) => [m, r]))
118
+ );
119
+ return Object.fromEntries(results);
120
+ }
121
+ // ─── Time series ──────────────────────────────────────
122
+ async getTimeSeries(metric, options) {
123
+ const params = {
124
+ siteId: this.siteId,
125
+ metric: "timeseries",
126
+ tsMetric: metric
127
+ };
128
+ if (options?.period) params.period = options.period;
129
+ if (options?.dateFrom) params.dateFrom = options.dateFrom;
130
+ if (options?.dateTo) params.dateTo = options.dateTo;
131
+ if (options?.granularity) params.granularity = options.granularity;
132
+ const { data } = await this.http.get(this.endpoint, { params });
133
+ return data;
134
+ }
135
+ // ─── Event listing ──────────────────────────────────────
136
+ async getEventsList(options) {
137
+ const params = { siteId: this.siteId };
138
+ if (options?.type) params.type = options.type;
139
+ if (options?.eventName) params.eventName = options.eventName;
140
+ if (options?.visitorId) params.visitorId = options.visitorId;
141
+ if (options?.userId) params.userId = options.userId;
142
+ if (options?.period) params.period = options.period;
143
+ if (options?.dateFrom) params.dateFrom = options.dateFrom;
144
+ if (options?.dateTo) params.dateTo = options.dateTo;
145
+ if (options?.limit) params.limit = String(options.limit);
146
+ if (options?.offset) params.offset = String(options.offset);
147
+ const { data } = await this.http.get("/api/events", { params });
148
+ return data;
149
+ }
150
+ // ─── User listing ──────────────────────────────────────
151
+ async getUsers(options) {
152
+ const params = { siteId: this.siteId };
153
+ if (options?.search) params.search = options.search;
154
+ if (options?.limit) params.limit = String(options.limit);
155
+ if (options?.offset) params.offset = String(options.offset);
156
+ const { data } = await this.http.get("/api/users", { params });
157
+ return data;
158
+ }
159
+ async getUserDetail(visitorId) {
160
+ const params = { siteId: this.siteId };
161
+ const { data } = await this.http.get(`/api/users/${encodeURIComponent(visitorId)}`, { params });
162
+ return data.user;
163
+ }
164
+ async getUserEvents(visitorId, options) {
165
+ const params = { siteId: this.siteId };
166
+ if (options?.type) params.type = options.type;
167
+ if (options?.period) params.period = options.period;
168
+ if (options?.dateFrom) params.dateFrom = options.dateFrom;
169
+ if (options?.dateTo) params.dateTo = options.dateTo;
170
+ if (options?.limit) params.limit = String(options.limit);
171
+ if (options?.offset) params.offset = String(options.offset);
172
+ const { data } = await this.http.get(`/api/users/${encodeURIComponent(visitorId)}/events`, { params });
173
+ return data;
174
+ }
175
+ // ─── Retention ──────────────────────────────────────
176
+ async getRetention(options) {
177
+ const params = {
178
+ siteId: this.siteId,
179
+ metric: "retention"
180
+ };
181
+ if (options?.period) params.period = options.period;
182
+ if (options?.weeks) params.weeks = String(options.weeks);
183
+ const { data } = await this.http.get(this.endpoint, { params });
184
+ return data;
185
+ }
186
+ };
187
+ function createClient(config) {
188
+ return new LitemetricsClient(config);
189
+ }
190
+
191
+ // src/sites.ts
192
+ var import_axios2 = __toESM(require("axios"), 1);
193
+ var SitesClient = class {
194
+ endpoint;
195
+ http;
196
+ constructor(config) {
197
+ this.endpoint = config.endpoint ?? "/api/sites";
198
+ this.http = import_axios2.default.create({
199
+ baseURL: config.baseUrl.replace(/\/$/, ""),
200
+ headers: {
201
+ "Content-Type": "application/json",
202
+ "X-Litemetrics-Admin-Secret": config.adminSecret
203
+ }
204
+ });
205
+ }
206
+ async listSites() {
207
+ const { data } = await this.http.get(this.endpoint);
208
+ return data;
209
+ }
210
+ async getSite(siteId) {
211
+ const { data } = await this.http.get(`${this.endpoint}/${siteId}`);
212
+ return data;
213
+ }
214
+ async createSite(body) {
215
+ const { data } = await this.http.post(this.endpoint, body);
216
+ return data;
217
+ }
218
+ async updateSite(siteId, body) {
219
+ const { data } = await this.http.put(`${this.endpoint}/${siteId}`, body);
220
+ return data;
221
+ }
222
+ async deleteSite(siteId) {
223
+ const { data } = await this.http.delete(`${this.endpoint}/${siteId}`);
224
+ return data;
225
+ }
226
+ async regenerateSecret(siteId) {
227
+ const { data } = await this.http.post(`${this.endpoint}/${siteId}/regenerate`);
228
+ return data;
229
+ }
230
+ };
231
+ function createSitesClient(config) {
232
+ return new SitesClient(config);
233
+ }
234
+ // Annotate the CommonJS export names for ESM import in node:
235
+ 0 && (module.exports = {
236
+ LitemetricsClient,
237
+ SitesClient,
238
+ createClient,
239
+ createSitesClient
240
+ });
241
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +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"]}
@@ -0,0 +1,117 @@
1
+ import { EventType, Period, Metric, QueryResult, Granularity, TimeSeriesResult, EventListResult, UserListResult, UserDetail, RetentionResult, Site, CreateSiteRequest, UpdateSiteRequest } from '@litemetrics/core';
2
+ export { CreateSiteRequest, EventListItem, EventListParams, EventListResult, EventType, Granularity, Metric, Period, QueryDataPoint, QueryResult, RetentionCohort, RetentionParams, RetentionResult, Site, TimeSeriesParams, TimeSeriesPoint, TimeSeriesResult, UpdateSiteRequest, UserDetail, UserListParams, UserListResult } from '@litemetrics/core';
3
+
4
+ interface LitemetricsClientConfig {
5
+ /** Base URL of the Litemetrics server (e.g. "https://analytics.myapp.com") */
6
+ baseUrl: string;
7
+ /** Site ID to query */
8
+ siteId: string;
9
+ /** Secret key for authentication (sk_xxx) */
10
+ secretKey?: string;
11
+ /** Query endpoint path (default: "/api/stats") */
12
+ endpoint?: string;
13
+ /** Custom headers to include in requests */
14
+ headers?: Record<string, string>;
15
+ }
16
+ interface StatsOptions {
17
+ period?: Period;
18
+ dateFrom?: string;
19
+ dateTo?: string;
20
+ limit?: number;
21
+ filters?: Record<string, string>;
22
+ compare?: boolean;
23
+ }
24
+ interface RetentionOptions {
25
+ period?: Period;
26
+ weeks?: number;
27
+ }
28
+ interface EventsListOptions {
29
+ type?: EventType;
30
+ eventName?: string;
31
+ visitorId?: string;
32
+ userId?: string;
33
+ period?: Period;
34
+ dateFrom?: string;
35
+ dateTo?: string;
36
+ limit?: number;
37
+ offset?: number;
38
+ }
39
+ interface TimeSeriesOptions {
40
+ period?: Period;
41
+ dateFrom?: string;
42
+ dateTo?: string;
43
+ granularity?: Granularity;
44
+ }
45
+ interface UsersListOptions {
46
+ search?: string;
47
+ limit?: number;
48
+ offset?: number;
49
+ }
50
+ declare class LitemetricsClient {
51
+ private siteId;
52
+ private endpoint;
53
+ private http;
54
+ constructor(config: LitemetricsClientConfig);
55
+ /** Change the active site ID */
56
+ setSiteId(siteId: string): void;
57
+ /** Get any metric */
58
+ getStats(metric: Metric, options?: StatsOptions): Promise<QueryResult>;
59
+ getPageviews(options?: StatsOptions): Promise<QueryResult>;
60
+ getVisitors(options?: StatsOptions): Promise<QueryResult>;
61
+ getSessions(options?: StatsOptions): Promise<QueryResult>;
62
+ getEvents(options?: StatsOptions): Promise<QueryResult>;
63
+ getTopPages(options?: StatsOptions): Promise<QueryResult>;
64
+ getTopReferrers(options?: StatsOptions): Promise<QueryResult>;
65
+ getTopCountries(options?: StatsOptions): Promise<QueryResult>;
66
+ getTopCities(options?: StatsOptions): Promise<QueryResult>;
67
+ getTopEvents(options?: StatsOptions): Promise<QueryResult>;
68
+ getTopDevices(options?: StatsOptions): Promise<QueryResult>;
69
+ getTopBrowsers(options?: StatsOptions): Promise<QueryResult>;
70
+ getTopOS(options?: StatsOptions): Promise<QueryResult>;
71
+ /** Fetch multiple metrics in parallel */
72
+ getOverview(metrics?: Metric[], options?: StatsOptions): Promise<Record<Metric, QueryResult>>;
73
+ getTimeSeries(metric: 'pageviews' | 'visitors' | 'sessions', options?: TimeSeriesOptions): Promise<TimeSeriesResult>;
74
+ getEventsList(options?: EventsListOptions): Promise<EventListResult>;
75
+ getUsers(options?: UsersListOptions): Promise<UserListResult>;
76
+ getUserDetail(visitorId: string): Promise<UserDetail>;
77
+ getUserEvents(visitorId: string, options?: EventsListOptions): Promise<EventListResult>;
78
+ getRetention(options?: RetentionOptions): Promise<RetentionResult>;
79
+ }
80
+ /** Create an LitemetricsClient instance */
81
+ declare function createClient(config: LitemetricsClientConfig): LitemetricsClient;
82
+
83
+ interface SitesClientConfig {
84
+ /** Base URL of the Litemetrics server */
85
+ baseUrl: string;
86
+ /** Admin secret for authentication */
87
+ adminSecret: string;
88
+ /** Sites endpoint path (default: "/api/sites") */
89
+ endpoint?: string;
90
+ }
91
+ declare class SitesClient {
92
+ private endpoint;
93
+ private http;
94
+ constructor(config: SitesClientConfig);
95
+ listSites(): Promise<{
96
+ sites: Site[];
97
+ total: number;
98
+ }>;
99
+ getSite(siteId: string): Promise<{
100
+ site: Site;
101
+ }>;
102
+ createSite(body: CreateSiteRequest): Promise<{
103
+ site: Site;
104
+ }>;
105
+ updateSite(siteId: string, body: UpdateSiteRequest): Promise<{
106
+ site: Site;
107
+ }>;
108
+ deleteSite(siteId: string): Promise<{
109
+ ok: boolean;
110
+ }>;
111
+ regenerateSecret(siteId: string): Promise<{
112
+ site: Site;
113
+ }>;
114
+ }
115
+ declare function createSitesClient(config: SitesClientConfig): SitesClient;
116
+
117
+ export { type EventsListOptions, LitemetricsClient, type LitemetricsClientConfig, type RetentionOptions, SitesClient, type SitesClientConfig, type StatsOptions, type TimeSeriesOptions, type UsersListOptions, createClient, createSitesClient };
@@ -0,0 +1,117 @@
1
+ import { EventType, Period, Metric, QueryResult, Granularity, TimeSeriesResult, EventListResult, UserListResult, UserDetail, RetentionResult, Site, CreateSiteRequest, UpdateSiteRequest } from '@litemetrics/core';
2
+ export { CreateSiteRequest, EventListItem, EventListParams, EventListResult, EventType, Granularity, Metric, Period, QueryDataPoint, QueryResult, RetentionCohort, RetentionParams, RetentionResult, Site, TimeSeriesParams, TimeSeriesPoint, TimeSeriesResult, UpdateSiteRequest, UserDetail, UserListParams, UserListResult } from '@litemetrics/core';
3
+
4
+ interface LitemetricsClientConfig {
5
+ /** Base URL of the Litemetrics server (e.g. "https://analytics.myapp.com") */
6
+ baseUrl: string;
7
+ /** Site ID to query */
8
+ siteId: string;
9
+ /** Secret key for authentication (sk_xxx) */
10
+ secretKey?: string;
11
+ /** Query endpoint path (default: "/api/stats") */
12
+ endpoint?: string;
13
+ /** Custom headers to include in requests */
14
+ headers?: Record<string, string>;
15
+ }
16
+ interface StatsOptions {
17
+ period?: Period;
18
+ dateFrom?: string;
19
+ dateTo?: string;
20
+ limit?: number;
21
+ filters?: Record<string, string>;
22
+ compare?: boolean;
23
+ }
24
+ interface RetentionOptions {
25
+ period?: Period;
26
+ weeks?: number;
27
+ }
28
+ interface EventsListOptions {
29
+ type?: EventType;
30
+ eventName?: string;
31
+ visitorId?: string;
32
+ userId?: string;
33
+ period?: Period;
34
+ dateFrom?: string;
35
+ dateTo?: string;
36
+ limit?: number;
37
+ offset?: number;
38
+ }
39
+ interface TimeSeriesOptions {
40
+ period?: Period;
41
+ dateFrom?: string;
42
+ dateTo?: string;
43
+ granularity?: Granularity;
44
+ }
45
+ interface UsersListOptions {
46
+ search?: string;
47
+ limit?: number;
48
+ offset?: number;
49
+ }
50
+ declare class LitemetricsClient {
51
+ private siteId;
52
+ private endpoint;
53
+ private http;
54
+ constructor(config: LitemetricsClientConfig);
55
+ /** Change the active site ID */
56
+ setSiteId(siteId: string): void;
57
+ /** Get any metric */
58
+ getStats(metric: Metric, options?: StatsOptions): Promise<QueryResult>;
59
+ getPageviews(options?: StatsOptions): Promise<QueryResult>;
60
+ getVisitors(options?: StatsOptions): Promise<QueryResult>;
61
+ getSessions(options?: StatsOptions): Promise<QueryResult>;
62
+ getEvents(options?: StatsOptions): Promise<QueryResult>;
63
+ getTopPages(options?: StatsOptions): Promise<QueryResult>;
64
+ getTopReferrers(options?: StatsOptions): Promise<QueryResult>;
65
+ getTopCountries(options?: StatsOptions): Promise<QueryResult>;
66
+ getTopCities(options?: StatsOptions): Promise<QueryResult>;
67
+ getTopEvents(options?: StatsOptions): Promise<QueryResult>;
68
+ getTopDevices(options?: StatsOptions): Promise<QueryResult>;
69
+ getTopBrowsers(options?: StatsOptions): Promise<QueryResult>;
70
+ getTopOS(options?: StatsOptions): Promise<QueryResult>;
71
+ /** Fetch multiple metrics in parallel */
72
+ getOverview(metrics?: Metric[], options?: StatsOptions): Promise<Record<Metric, QueryResult>>;
73
+ getTimeSeries(metric: 'pageviews' | 'visitors' | 'sessions', options?: TimeSeriesOptions): Promise<TimeSeriesResult>;
74
+ getEventsList(options?: EventsListOptions): Promise<EventListResult>;
75
+ getUsers(options?: UsersListOptions): Promise<UserListResult>;
76
+ getUserDetail(visitorId: string): Promise<UserDetail>;
77
+ getUserEvents(visitorId: string, options?: EventsListOptions): Promise<EventListResult>;
78
+ getRetention(options?: RetentionOptions): Promise<RetentionResult>;
79
+ }
80
+ /** Create an LitemetricsClient instance */
81
+ declare function createClient(config: LitemetricsClientConfig): LitemetricsClient;
82
+
83
+ interface SitesClientConfig {
84
+ /** Base URL of the Litemetrics server */
85
+ baseUrl: string;
86
+ /** Admin secret for authentication */
87
+ adminSecret: string;
88
+ /** Sites endpoint path (default: "/api/sites") */
89
+ endpoint?: string;
90
+ }
91
+ declare class SitesClient {
92
+ private endpoint;
93
+ private http;
94
+ constructor(config: SitesClientConfig);
95
+ listSites(): Promise<{
96
+ sites: Site[];
97
+ total: number;
98
+ }>;
99
+ getSite(siteId: string): Promise<{
100
+ site: Site;
101
+ }>;
102
+ createSite(body: CreateSiteRequest): Promise<{
103
+ site: Site;
104
+ }>;
105
+ updateSite(siteId: string, body: UpdateSiteRequest): Promise<{
106
+ site: Site;
107
+ }>;
108
+ deleteSite(siteId: string): Promise<{
109
+ ok: boolean;
110
+ }>;
111
+ regenerateSecret(siteId: string): Promise<{
112
+ site: Site;
113
+ }>;
114
+ }
115
+ declare function createSitesClient(config: SitesClientConfig): SitesClient;
116
+
117
+ export { type EventsListOptions, LitemetricsClient, type LitemetricsClientConfig, type RetentionOptions, SitesClient, type SitesClientConfig, type StatsOptions, type TimeSeriesOptions, type UsersListOptions, createClient, createSitesClient };
package/dist/index.js ADDED
@@ -0,0 +1,201 @@
1
+ // src/client.ts
2
+ import axios from "axios";
3
+ var LitemetricsClient = class {
4
+ siteId;
5
+ endpoint;
6
+ http;
7
+ constructor(config) {
8
+ this.siteId = config.siteId;
9
+ this.endpoint = config.endpoint ?? "/api/stats";
10
+ const headers = { ...config.headers };
11
+ if (config.secretKey) {
12
+ headers["X-Litemetrics-Secret"] = config.secretKey;
13
+ }
14
+ this.http = axios.create({
15
+ baseURL: config.baseUrl.replace(/\/$/, ""),
16
+ headers
17
+ });
18
+ }
19
+ /** Change the active site ID */
20
+ setSiteId(siteId) {
21
+ this.siteId = siteId;
22
+ }
23
+ /** Get any metric */
24
+ async getStats(metric, options) {
25
+ const params = {
26
+ siteId: this.siteId,
27
+ metric
28
+ };
29
+ if (options?.period) params.period = options.period;
30
+ if (options?.dateFrom) params.dateFrom = options.dateFrom;
31
+ if (options?.dateTo) params.dateTo = options.dateTo;
32
+ if (options?.limit) params.limit = String(options.limit);
33
+ if (options?.filters) params.filters = JSON.stringify(options.filters);
34
+ if (options?.compare) params.compare = "true";
35
+ const { data } = await this.http.get(this.endpoint, { params });
36
+ return data;
37
+ }
38
+ // ─── Convenience methods ──────────────────────────────────
39
+ async getPageviews(options) {
40
+ return this.getStats("pageviews", options);
41
+ }
42
+ async getVisitors(options) {
43
+ return this.getStats("visitors", options);
44
+ }
45
+ async getSessions(options) {
46
+ return this.getStats("sessions", options);
47
+ }
48
+ async getEvents(options) {
49
+ return this.getStats("events", options);
50
+ }
51
+ async getTopPages(options) {
52
+ return this.getStats("top_pages", options);
53
+ }
54
+ async getTopReferrers(options) {
55
+ return this.getStats("top_referrers", options);
56
+ }
57
+ async getTopCountries(options) {
58
+ return this.getStats("top_countries", options);
59
+ }
60
+ async getTopCities(options) {
61
+ return this.getStats("top_cities", options);
62
+ }
63
+ async getTopEvents(options) {
64
+ return this.getStats("top_events", options);
65
+ }
66
+ async getTopDevices(options) {
67
+ return this.getStats("top_devices", options);
68
+ }
69
+ async getTopBrowsers(options) {
70
+ return this.getStats("top_browsers", options);
71
+ }
72
+ async getTopOS(options) {
73
+ return this.getStats("top_os", options);
74
+ }
75
+ /** Fetch multiple metrics in parallel */
76
+ async getOverview(metrics = ["pageviews", "visitors", "sessions", "events"], options) {
77
+ const results = await Promise.all(
78
+ metrics.map((m) => this.getStats(m, options).then((r) => [m, r]))
79
+ );
80
+ return Object.fromEntries(results);
81
+ }
82
+ // ─── Time series ──────────────────────────────────────
83
+ async getTimeSeries(metric, options) {
84
+ const params = {
85
+ siteId: this.siteId,
86
+ metric: "timeseries",
87
+ tsMetric: metric
88
+ };
89
+ if (options?.period) params.period = options.period;
90
+ if (options?.dateFrom) params.dateFrom = options.dateFrom;
91
+ if (options?.dateTo) params.dateTo = options.dateTo;
92
+ if (options?.granularity) params.granularity = options.granularity;
93
+ const { data } = await this.http.get(this.endpoint, { params });
94
+ return data;
95
+ }
96
+ // ─── Event listing ──────────────────────────────────────
97
+ async getEventsList(options) {
98
+ const params = { siteId: this.siteId };
99
+ if (options?.type) params.type = options.type;
100
+ if (options?.eventName) params.eventName = options.eventName;
101
+ if (options?.visitorId) params.visitorId = options.visitorId;
102
+ if (options?.userId) params.userId = options.userId;
103
+ if (options?.period) params.period = options.period;
104
+ if (options?.dateFrom) params.dateFrom = options.dateFrom;
105
+ if (options?.dateTo) params.dateTo = options.dateTo;
106
+ if (options?.limit) params.limit = String(options.limit);
107
+ if (options?.offset) params.offset = String(options.offset);
108
+ const { data } = await this.http.get("/api/events", { params });
109
+ return data;
110
+ }
111
+ // ─── User listing ──────────────────────────────────────
112
+ async getUsers(options) {
113
+ const params = { siteId: this.siteId };
114
+ if (options?.search) params.search = options.search;
115
+ if (options?.limit) params.limit = String(options.limit);
116
+ if (options?.offset) params.offset = String(options.offset);
117
+ const { data } = await this.http.get("/api/users", { params });
118
+ return data;
119
+ }
120
+ async getUserDetail(visitorId) {
121
+ const params = { siteId: this.siteId };
122
+ const { data } = await this.http.get(`/api/users/${encodeURIComponent(visitorId)}`, { params });
123
+ return data.user;
124
+ }
125
+ async getUserEvents(visitorId, options) {
126
+ const params = { siteId: this.siteId };
127
+ if (options?.type) params.type = options.type;
128
+ if (options?.period) params.period = options.period;
129
+ if (options?.dateFrom) params.dateFrom = options.dateFrom;
130
+ if (options?.dateTo) params.dateTo = options.dateTo;
131
+ if (options?.limit) params.limit = String(options.limit);
132
+ if (options?.offset) params.offset = String(options.offset);
133
+ const { data } = await this.http.get(`/api/users/${encodeURIComponent(visitorId)}/events`, { params });
134
+ return data;
135
+ }
136
+ // ─── Retention ──────────────────────────────────────
137
+ async getRetention(options) {
138
+ const params = {
139
+ siteId: this.siteId,
140
+ metric: "retention"
141
+ };
142
+ if (options?.period) params.period = options.period;
143
+ if (options?.weeks) params.weeks = String(options.weeks);
144
+ const { data } = await this.http.get(this.endpoint, { params });
145
+ return data;
146
+ }
147
+ };
148
+ function createClient(config) {
149
+ return new LitemetricsClient(config);
150
+ }
151
+
152
+ // src/sites.ts
153
+ import axios2 from "axios";
154
+ var SitesClient = class {
155
+ endpoint;
156
+ http;
157
+ constructor(config) {
158
+ this.endpoint = config.endpoint ?? "/api/sites";
159
+ this.http = axios2.create({
160
+ baseURL: config.baseUrl.replace(/\/$/, ""),
161
+ headers: {
162
+ "Content-Type": "application/json",
163
+ "X-Litemetrics-Admin-Secret": config.adminSecret
164
+ }
165
+ });
166
+ }
167
+ async listSites() {
168
+ const { data } = await this.http.get(this.endpoint);
169
+ return data;
170
+ }
171
+ async getSite(siteId) {
172
+ const { data } = await this.http.get(`${this.endpoint}/${siteId}`);
173
+ return data;
174
+ }
175
+ async createSite(body) {
176
+ const { data } = await this.http.post(this.endpoint, body);
177
+ return data;
178
+ }
179
+ async updateSite(siteId, body) {
180
+ const { data } = await this.http.put(`${this.endpoint}/${siteId}`, body);
181
+ return data;
182
+ }
183
+ async deleteSite(siteId) {
184
+ const { data } = await this.http.delete(`${this.endpoint}/${siteId}`);
185
+ return data;
186
+ }
187
+ async regenerateSecret(siteId) {
188
+ const { data } = await this.http.post(`${this.endpoint}/${siteId}/regenerate`);
189
+ return data;
190
+ }
191
+ };
192
+ function createSitesClient(config) {
193
+ return new SitesClient(config);
194
+ }
195
+ export {
196
+ LitemetricsClient,
197
+ SitesClient,
198
+ createClient,
199
+ createSitesClient
200
+ };
201
+ //# sourceMappingURL=index.js.map
@@ -0,0 +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"]}
package/package.json ADDED
@@ -0,0 +1,42 @@
1
+ {
2
+ "name": "@litemetrics/client",
3
+ "version": "0.1.0",
4
+ "description": "Client-side SDK for querying Litemetrics analytics data",
5
+ "license": "MIT",
6
+ "author": "Metehan Kurucu",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "https://github.com/metehankurucu/litemetrics",
10
+ "directory": "packages/client"
11
+ },
12
+ "keywords": ["analytics", "litemetrics", "client", "dashboard", "query"],
13
+ "type": "module",
14
+ "main": "./dist/index.cjs",
15
+ "module": "./dist/index.js",
16
+ "types": "./dist/index.d.ts",
17
+ "exports": {
18
+ ".": {
19
+ "types": "./dist/index.d.ts",
20
+ "import": "./dist/index.js",
21
+ "require": "./dist/index.cjs"
22
+ }
23
+ },
24
+ "files": ["dist"],
25
+ "publishConfig": {
26
+ "access": "public"
27
+ },
28
+ "scripts": {
29
+ "build": "tsup",
30
+ "dev": "tsup --watch",
31
+ "typecheck": "tsc --noEmit",
32
+ "clean": "rm -rf dist"
33
+ },
34
+ "dependencies": {
35
+ "@litemetrics/core": "0.1.0",
36
+ "axios": "^1.13.4"
37
+ },
38
+ "devDependencies": {
39
+ "tsup": "^8",
40
+ "typescript": "^5.7"
41
+ }
42
+ }