locallytics 0.0.1-beta.2 → 0.0.1-beta.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -4,121 +4,51 @@ Self-hosted, privacy-first analytics for any JavaScript framework.
4
4
 
5
5
  - **Privacy-first** — No cookies, respects Do Not Track
6
6
  - **Self-hosted** — Your data in your database (PostgreSQL or SQLite)
7
- - **Framework-agnostic** — Works with Next.js, Remix, Express, Hono, etc.
8
- - **Simple** — Two main functions: `LocallyticsGrabber` and `LocallyticsData`
9
- - **Multiple formats** — Export analytics as JSON or CSV
7
+ - **Framework-agnostic** — Works with Next.js, Express, Remix, Hono, etc.
8
+ - **Simple** — Just two functions: `LocallyticsGrabber` and `LocallyticsData`
10
9
 
11
10
  ## Quick Start
12
11
 
13
- ### 1. Install
14
-
15
12
  ```bash
16
- npm install locallytics
17
- ```
18
-
19
- ### 2. Migrate Database
13
+ # Install
14
+ npm install locallytics better-sqlite3
20
15
 
21
- Set your database URL and run migrations:
22
-
23
- ```bash
24
- export DATABASE_URL="postgres://user:pass@localhost/db"
25
- # or
16
+ # Setup database
26
17
  export DATABASE_URL="./analytics.db"
27
-
28
18
  npx locallytics migrate
29
19
  ```
30
20
 
31
- ### 3. Create API Handler
21
+ ### Next.js Example
32
22
 
33
- The handler uses Web Standard `Request`/`Response` - works in any framework.
34
-
35
- **Next.js:**
23
+ **1. API Route** (`app/api/analytics/route.ts`):
36
24
  ```typescript
37
- // app/api/analytics/route.ts
38
- import { createHandler } from "locallytics";
25
+ import { createLocalyticsHandler } from "locallytics";
39
26
 
40
- const handler = await createHandler({
27
+ const handler = await createLocalyticsHandler({
41
28
  database: process.env.DATABASE_URL!,
42
29
  });
43
30
 
44
31
  export const POST = handler.POST;
45
32
  ```
46
33
 
47
- **Express:**
48
- ```javascript
49
- import express from "express";
50
- import { createHandler } from "locallytics";
51
-
52
- const app = express();
53
- const analytics = await createHandler({
54
- database: process.env.DATABASE_URL,
55
- });
56
-
57
- app.post("/api/analytics", async (req, res) => {
58
- const response = await analytics.POST(req);
59
- res.status(response.status).send(await response.text());
60
- });
61
- ```
62
-
63
- **Hono:**
64
- ```typescript
65
- import { Hono } from "hono";
66
- import { createHandler } from "locallytics";
67
-
68
- const app = new Hono();
69
- const analytics = await createHandler({
70
- database: process.env.DATABASE_URL!,
71
- });
72
-
73
- app.post("/api/analytics", (c) => analytics.POST(c.req.raw));
74
- ```
75
-
76
- ### 4. Add Client Tracker
77
-
78
- Call `LocallyticsGrabber()` on page load to track pageviews.
79
-
80
- **Next.js (React):**
34
+ **2. Track Pageviews** (`app/layout.tsx`):
81
35
  ```tsx
82
- // app/layout.tsx
83
36
  "use client";
84
-
85
37
  import { LocallyticsGrabber } from "locallytics/client";
86
38
  import { useEffect } from "react";
87
39
 
88
- export default function RootLayout({ children }: { children: React.ReactNode }) {
89
- useEffect(() => {
90
- LocallyticsGrabber();
91
- }, []);
92
-
93
- return (
94
- <html>
95
- <body>{children}</body>
96
- </html>
97
- );
40
+ export default function RootLayout({ children }) {
41
+ useEffect(() => LocallyticsGrabber(), []);
42
+ return <html><body>{children}</body></html>;
98
43
  }
99
44
  ```
100
45
 
101
- **Vanilla JavaScript:**
102
- ```html
103
- <script type="module">
104
- import { LocallyticsGrabber } from "/node_modules/locallytics/dist/client/index.js";
105
- LocallyticsGrabber();
106
- </script>
107
- ```
108
-
109
- ### 5. View Analytics
110
-
111
- Query analytics data on the server:
112
-
46
+ **3. View Analytics** (`app/dashboard/page.tsx`):
113
47
  ```typescript
114
- // app/dashboard/page.tsx (Next.js)
115
48
  import { LocallyticsData } from "locallytics";
116
49
 
117
50
  export default async function Dashboard() {
118
- const data = await LocallyticsData(
119
- process.env.DATABASE_URL!,
120
- "last7d" // "last24h" | "last7d" | "last30d"
121
- );
51
+ const data = await LocallyticsData(process.env.DATABASE_URL!, "last7d");
122
52
 
123
53
  return (
124
54
  <div>
@@ -129,370 +59,90 @@ export default async function Dashboard() {
129
59
  }
130
60
  ```
131
61
 
132
- ---
133
-
134
- ## API Reference
62
+ ## API
135
63
 
136
64
  ### `LocallyticsGrabber(options?)`
65
+ Client-side tracker. Call once on page load.
137
66
 
138
- Client-side function that tracks pageviews in the browser.
139
-
140
- **Usage:**
141
67
  ```typescript
142
- import { LocallyticsGrabber } from "locallytics/client";
143
-
144
- LocallyticsGrabber({
145
- endpoint: "/api/analytics", // default
146
- });
68
+ LocallyticsGrabber({ endpoint: "/api/analytics" });
147
69
  ```
148
70
 
149
- **Options:**
150
-
151
- | Option | Type | Default | Description |
152
- | ---------- | -------- | ------------------ | ------------------------------ |
153
- | `endpoint` | `string` | `"/api/analytics"` | API endpoint to send data to |
154
-
155
- **Data Collected:**
156
-
157
- Each pageview sends:
158
- - `pageUrl` — Current path
159
- - `referrer` — Where user came from
160
- - `sessionId` — Anonymous ID (localStorage)
161
- - `timestamp` — ISO timestamp
162
-
163
- **Privacy Features:**
164
- - **No cookies** — Uses localStorage only
165
- - **Respects DNT** — Tracking disabled when Do Not Track is on
166
- - **No PII** — Anonymous session IDs only
71
+ ### `createLocalyticsHandler(config)`
72
+ Creates API endpoint for receiving tracking data.
167
73
 
168
- ---
169
-
170
- ### `createHandler(config)`
171
-
172
- Creates API route handlers for receiving tracking data.
173
-
174
- **Usage:**
175
74
  ```typescript
176
- import { createHandler } from "locallytics";
177
-
178
- const handler = await createHandler({
179
- database: process.env.DATABASE_URL!,
180
- });
181
-
75
+ const handler = await createLocalyticsHandler({ database: process.env.DATABASE_URL! });
182
76
  export const POST = handler.POST;
183
77
  ```
184
78
 
185
- **Config:**
186
-
187
- | Option | Type | Required | Description |
188
- | ---------- | -------- | -------- | ------------------------------ |
189
- | `database` | `string` | Yes | Database connection string |
190
-
191
- **Returns:**
192
-
193
- Object with a `POST` method that accepts Web Standard `Request` and returns `Response`.
194
-
195
- **Response Codes:**
196
- - `201` — Pageview recorded successfully
197
- - `204` — Tracking skipped (DNT enabled)
198
- - `400` — Invalid payload
199
- - `500` — Server error
200
-
201
- ---
202
-
203
79
  ### `LocallyticsData(databaseUrl, range, format?)`
204
-
205
- Queries analytics data from the database.
206
-
207
- **Usage:**
208
- ```typescript
209
- import { LocallyticsData } from "locallytics";
210
-
211
- // Get JSON data (default)
212
- const data = await LocallyticsData(
213
- process.env.DATABASE_URL!,
214
- "last7d"
215
- );
216
-
217
- console.log(data.pageviews, data.uniqueVisitors);
218
-
219
- // Get CSV data
220
- const csv = await LocallyticsData(
221
- process.env.DATABASE_URL!,
222
- "last7d",
223
- "csv"
224
- );
225
-
226
- console.log(csv); // CSV formatted string
227
- ```
228
-
229
- **Parameters:**
230
-
231
- | Parameter | Type | Required | Description |
232
- | ------------- | --------------------------------- | -------- | ------------------------------ |
233
- | `databaseUrl` | `string` | Yes | Database connection string |
234
- | `range` | `"last24h"` \| `"last7d"` \| `"last30d"` | Yes | Date range to query |
235
- | `format` | `"json"` \| `"csv"` | No | Output format (default: `"json"`) |
236
-
237
- **Returns (JSON format):**
80
+ Query analytics from your database.
238
81
 
239
82
  ```typescript
240
- {
241
- pageviews: number; // Total pageviews
242
- uniqueVisitors: number; // Unique sessions
243
- topPages: Array<{
244
- page: string; // Page URL
245
- count: number; // View count
246
- }>; // Top 10 pages
247
- dailyStats: Array<{
248
- date: string; // YYYY-MM-DD
249
- views: number; // Views that day
250
- }>;
251
- }
252
- ```
83
+ // JSON (default)
84
+ const data = await LocallyticsData(databaseUrl, "last7d");
253
85
 
254
- **Returns (CSV format):**
255
-
256
- String with CSV formatted data including summary, top pages, and daily stats.
257
-
258
- ---
259
-
260
- ## CLI Commands
261
-
262
- ### `migrate`
263
-
264
- Creates or updates database tables.
265
-
266
- ```bash
267
- export DATABASE_URL="postgres://user:pass@localhost/db"
268
- npx locallytics migrate
86
+ // CSV
87
+ const csv = await LocallyticsData(databaseUrl, "last30d", "csv");
269
88
  ```
270
89
 
271
- ### `reset`
272
-
273
- Drops and recreates all tables. **WARNING: This destroys all data!**
274
-
275
- ```bash
276
- export DATABASE_URL="postgres://user:pass@localhost/db"
277
- npx locallytics reset
278
- ```
279
-
280
- ### `help`
281
-
282
- Shows available commands.
283
-
284
- ```bash
285
- npx locallytics help
286
- ```
287
-
288
- ---
90
+ **Ranges:** `"last24h"` | `"last7d"` | `"last30d"`
289
91
 
290
92
  ## Database Support
291
93
 
292
- Locallytics supports PostgreSQL and SQLite. The database type is detected automatically from the connection string.
293
-
294
- ### PostgreSQL
295
-
296
- **Connection String Format:**
297
- ```
298
- postgres://user:password@host:port/database
299
- postgresql://user:password@host:port/database
94
+ **PostgreSQL:**
95
+ ```bash
96
+ DATABASE_URL="postgres://user:pass@localhost:5432/db"
97
+ npm install pg
300
98
  ```
301
99
 
302
- **Example:**
100
+ **SQLite:**
303
101
  ```bash
304
- export DATABASE_URL="postgres://myuser:mypass@localhost:5432/analytics"
305
- npx locallytics migrate
102
+ DATABASE_URL="./analytics.db"
103
+ npm install better-sqlite3
306
104
  ```
307
105
 
308
- **Requirements:**
309
- - Install `pg` peer dependency: `npm install pg`
310
-
311
- ### SQLite
312
-
313
- **Connection String Format:**
314
- ```
315
- ./path/to/database.db
316
- /absolute/path/to/database.db
317
- sqlite:///path/to/database.db
318
- ```
106
+ ## CLI
319
107
 
320
- **Example:**
321
108
  ```bash
322
- export DATABASE_URL="./analytics.db"
323
- npx locallytics migrate
109
+ npx locallytics migrate # Create tables
110
+ npx locallytics reset # Drop and recreate (destroys data!)
324
111
  ```
325
112
 
326
- **Requirements:**
327
- - Install `better-sqlite3` peer dependency: `npm install better-sqlite3`
328
-
329
- ---
330
-
331
- ## Privacy Features
332
-
333
- Locallytics is designed with privacy in mind:
334
-
335
- ### No Cookies
336
- Uses localStorage for session IDs instead of cookies. No cookie banners required.
337
-
338
- ### Respects Do Not Track
339
- When a user has Do Not Track (DNT) enabled in their browser:
340
- - Client-side tracker won't send data
341
- - Server-side handler won't record data
342
-
343
- ### No Personal Information
344
- Only collects:
345
- - Page URLs
346
- - Referrer URLs
347
- - Anonymous session IDs (random UUIDs)
348
- - Timestamps
349
-
350
- No IP addresses, user agents, or any identifying information.
351
-
352
- ### Self-Hosted
353
- All data stays in your database. No third-party services involved.
354
-
355
- ---
356
-
357
113
  ## Framework Examples
358
114
 
359
- ### Next.js (App Router)
360
-
361
- See [examples/nextjs](./examples/nextjs) for complete example.
362
-
363
- **API Route:**
364
- ```typescript
365
- // app/api/analytics/route.ts
366
- import { createHandler } from "locallytics";
367
-
368
- const handler = await createHandler({
369
- database: process.env.DATABASE_URL!,
370
- });
371
-
372
- export const POST = handler.POST;
373
- ```
374
-
375
- **Layout (Client Component):**
376
- ```tsx
377
- // app/layout.tsx
378
- "use client";
379
-
380
- import { LocallyticsGrabber } from "locallytics/client";
381
- import { useEffect } from "react";
382
-
383
- export default function RootLayout({ children }: { children: React.ReactNode }) {
384
- useEffect(() => {
385
- LocallyticsGrabber();
386
- }, []);
387
-
388
- return (
389
- <html>
390
- <body>{children}</body>
391
- </html>
392
- );
393
- }
394
- ```
395
-
396
- **Dashboard (Server Component):**
397
- ```tsx
398
- // app/dashboard/page.tsx
399
- import { LocallyticsData } from "locallytics";
400
-
401
- export default async function Dashboard() {
402
- const data = await LocallyticsData(process.env.DATABASE_URL!, "last7d");
403
-
404
- return (
405
- <div>
406
- <h1>Analytics</h1>
407
- <p>Pageviews: {data.pageviews}</p>
408
- <p>Unique Visitors: {data.uniqueVisitors}</p>
409
-
410
- <h2>Top Pages</h2>
411
- <ul>
412
- {data.topPages.map((page) => (
413
- <li key={page.page}>
414
- {page.page}: {page.count} views
415
- </li>
416
- ))}
417
- </ul>
418
- </div>
419
- );
420
- }
421
- ```
422
-
423
- ### Express
424
-
425
- See [examples/express](./examples/express) for complete example.
426
-
115
+ **Express:**
427
116
  ```javascript
428
117
  import express from "express";
429
- import { createHandler, LocallyticsData } from "locallytics";
118
+ import { createLocalyticsHandler } from "locallytics";
430
119
 
431
120
  const app = express();
432
- const analytics = await createHandler({
433
- database: process.env.DATABASE_URL,
434
- });
121
+ const handler = await createLocalyticsHandler({ database: process.env.DATABASE_URL });
435
122
 
436
123
  app.post("/api/analytics", async (req, res) => {
437
- const response = await analytics.POST(req);
124
+ const response = await handler.POST(req);
438
125
  res.status(response.status).send(await response.text());
439
126
  });
440
-
441
- app.get("/dashboard", async (req, res) => {
442
- const data = await LocallyticsData(process.env.DATABASE_URL, "last7d");
443
- res.json(data);
444
- });
445
-
446
- app.listen(3000);
447
127
  ```
448
128
 
449
- ### Remix
450
-
451
- ```typescript
452
- // app/routes/api.analytics.ts
453
- import type { ActionFunction } from "@remix-run/node";
454
- import { createHandler } from "locallytics";
455
-
456
- const handler = await createHandler({
457
- database: process.env.DATABASE_URL!,
458
- });
459
-
460
- export const action: ActionFunction = async ({ request }) => {
461
- return handler.POST(request);
462
- };
463
- ```
464
-
465
- ### Hono
466
-
129
+ **Hono:**
467
130
  ```typescript
468
131
  import { Hono } from "hono";
469
- import { createHandler } from "locallytics";
132
+ import { createLocalyticsHandler } from "locallytics";
470
133
 
471
134
  const app = new Hono();
472
- const analytics = await createHandler({
473
- database: process.env.DATABASE_URL!,
474
- });
135
+ const handler = await createLocalyticsHandler({ database: process.env.DATABASE_URL! });
475
136
 
476
- app.post("/api/analytics", (c) => analytics.POST(c.req.raw));
137
+ app.post("/api/analytics", (c) => handler.POST(c.req.raw));
477
138
  ```
478
139
 
479
- ---
480
-
481
- ## TypeScript
482
-
483
- Locallytics is written in TypeScript and includes full type definitions.
484
-
485
- ```typescript
486
- import type {
487
- DateRange,
488
- DataFormat,
489
- AnalyticsResult,
490
- GrabberOptions,
491
- HandlerConfig,
492
- } from "locallytics";
493
- ```
140
+ ## Privacy
494
141
 
495
- ---
142
+ - **No cookies** — Uses localStorage for session IDs
143
+ - **Respects DNT** — Honors Do Not Track browser setting
144
+ - **No PII** — Only collects anonymous pageview data
145
+ - **Self-hosted** — Your data never leaves your servers
496
146
 
497
147
  ## License
498
148
 
@@ -1,5 +1,5 @@
1
1
  export { LocallyticsGrabber } from "./client/index.js";
2
2
  export { LocallyticsData } from "./server/data.js";
3
- export { createHandler } from "./server/handler.js";
3
+ export { createLocalyticsHandler } from "./server/handler.js";
4
4
  export type { DateRange, DataFormat, AnalyticsResult, GrabberOptions, HandlerConfig, } from "./types/index.js";
5
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,YAAY,EACV,SAAS,EACT,UAAU,EACV,eAAe,EACf,cAAc,EACd,aAAa,GACd,MAAM,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAC9D,YAAY,EACV,SAAS,EACT,UAAU,EACV,eAAe,EACf,cAAc,EACd,aAAa,GACd,MAAM,kBAAkB,CAAC"}
package/dist/src/index.js CHANGED
@@ -1,4 +1,4 @@
1
1
  export { LocallyticsGrabber } from "./client/index.js";
2
2
  export { LocallyticsData } from "./server/data.js";
3
- export { createHandler } from "./server/handler.js";
3
+ export { createLocalyticsHandler } from "./server/handler.js";
4
4
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC"}
@@ -1,5 +1,5 @@
1
1
  import type { HandlerConfig } from "../types/index.js";
2
- export declare function createHandler(config: HandlerConfig): Promise<{
2
+ export declare function createLocalyticsHandler(config: HandlerConfig): Promise<{
3
3
  POST: (request: Request) => Promise<Response>;
4
4
  }>;
5
5
  //# sourceMappingURL=handler.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../../src/server/handler.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAcvD,wBAAsB,aAAa,CAAC,MAAM,EAAE,aAAa;oBAG1B,OAAO,KAAG,OAAO,CAAC,QAAQ,CAAC;GA4BzD"}
1
+ {"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../../src/server/handler.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAcvD,wBAAsB,uBAAuB,CAAC,MAAM,EAAE,aAAa;oBAGpC,OAAO,KAAG,OAAO,CAAC,QAAQ,CAAC;GA4BzD"}
@@ -10,7 +10,7 @@ function respectsDNT(request) {
10
10
  const dnt = request.headers.get("dnt") || request.headers.get("DNT");
11
11
  return dnt === "1";
12
12
  }
13
- export async function createHandler(config) {
13
+ export async function createLocalyticsHandler(config) {
14
14
  const adapter = await createAdapter(config.database);
15
15
  const POST = async (request) => {
16
16
  if (respectsDNT(request)) {
@@ -1 +1 @@
1
- {"version":3,"file":"handler.js","sourceRoot":"","sources":["../../../src/server/handler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAG/C,MAAM,cAAc,GAAG,CAAC,CAAC,MAAM,CAAC;IAC9B,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;IACnB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC/B,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;IACrB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;CACtB,CAAC,CAAC;AAEH,SAAS,WAAW,CAAC,OAAgB;IACnC,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACrE,OAAO,GAAG,KAAK,GAAG,CAAC;AACrB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,MAAqB;IACvD,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAErD,MAAM,IAAI,GAAG,KAAK,EAAE,OAAgB,EAAqB,EAAE;QACzD,IAAI,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC;YACzB,OAAO,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;QAC7C,CAAC;QAED,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC;YAClC,MAAM,IAAI,GAAG,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAExC,MAAM,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAE3B,OAAO,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;QAC7C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,CAAC,CAAC,QAAQ,EAAE,CAAC;gBAChC,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,iBAAiB,EAAE,OAAO,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE;oBACvF,MAAM,EAAE,GAAG;oBACX,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;iBAChD,CAAC,CAAC;YACL,CAAC;YAED,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,uBAAuB,EAAE,CAAC,EAAE;gBACtE,MAAM,EAAE,GAAG;gBACX,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;aAChD,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CAAC;IAEF,OAAO,EAAE,IAAI,EAAE,CAAC;AAClB,CAAC"}
1
+ {"version":3,"file":"handler.js","sourceRoot":"","sources":["../../../src/server/handler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAG/C,MAAM,cAAc,GAAG,CAAC,CAAC,MAAM,CAAC;IAC9B,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;IACnB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC/B,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;IACrB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;CACtB,CAAC,CAAC;AAEH,SAAS,WAAW,CAAC,OAAgB;IACnC,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACrE,OAAO,GAAG,KAAK,GAAG,CAAC;AACrB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,MAAqB;IACjE,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAErD,MAAM,IAAI,GAAG,KAAK,EAAE,OAAgB,EAAqB,EAAE;QACzD,IAAI,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC;YACzB,OAAO,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;QAC7C,CAAC;QAED,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC;YAClC,MAAM,IAAI,GAAG,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAExC,MAAM,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAE3B,OAAO,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;QAC7C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,CAAC,CAAC,QAAQ,EAAE,CAAC;gBAChC,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,iBAAiB,EAAE,OAAO,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE;oBACvF,MAAM,EAAE,GAAG;oBACX,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;iBAChD,CAAC,CAAC;YACL,CAAC;YAED,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,uBAAuB,EAAE,CAAC,EAAE;gBACtE,MAAM,EAAE,GAAG;gBACX,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;aAChD,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CAAC;IAEF,OAAO,EAAE,IAAI,EAAE,CAAC;AAClB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "locallytics",
3
- "version": "0.0.1-beta.2",
3
+ "version": "0.0.1-beta.3",
4
4
  "description": "Self-hosted, privacy-first analytics for any JavaScript framework",
5
5
  "type": "module",
6
6
  "main": "./dist/src/index.js",