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 +50 -400
- package/dist/src/index.d.ts +1 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +1 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/server/handler.d.ts +1 -1
- package/dist/src/server/handler.d.ts.map +1 -1
- package/dist/src/server/handler.js +1 -1
- package/dist/src/server/handler.js.map +1 -1
- package/package.json +1 -1
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,
|
|
8
|
-
- **Simple** —
|
|
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
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
### 2. Migrate Database
|
|
13
|
+
# Install
|
|
14
|
+
npm install locallytics better-sqlite3
|
|
20
15
|
|
|
21
|
-
|
|
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
|
-
###
|
|
21
|
+
### Next.js Example
|
|
32
22
|
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
**Next.js:**
|
|
23
|
+
**1. API Route** (`app/api/analytics/route.ts`):
|
|
36
24
|
```typescript
|
|
37
|
-
|
|
38
|
-
import { createHandler } from "locallytics";
|
|
25
|
+
import { createLocalyticsHandler } from "locallytics";
|
|
39
26
|
|
|
40
|
-
const handler = await
|
|
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
|
-
**
|
|
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 }
|
|
89
|
-
useEffect(() =>
|
|
90
|
-
|
|
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
|
-
**
|
|
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
|
-
|
|
143
|
-
|
|
144
|
-
LocallyticsGrabber({
|
|
145
|
-
endpoint: "/api/analytics", // default
|
|
146
|
-
});
|
|
68
|
+
LocallyticsGrabber({ endpoint: "/api/analytics" });
|
|
147
69
|
```
|
|
148
70
|
|
|
149
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
293
|
-
|
|
294
|
-
|
|
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
|
-
**
|
|
100
|
+
**SQLite:**
|
|
303
101
|
```bash
|
|
304
|
-
|
|
305
|
-
|
|
102
|
+
DATABASE_URL="./analytics.db"
|
|
103
|
+
npm install better-sqlite3
|
|
306
104
|
```
|
|
307
105
|
|
|
308
|
-
|
|
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
|
-
|
|
323
|
-
npx locallytics
|
|
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
|
-
|
|
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 {
|
|
118
|
+
import { createLocalyticsHandler } from "locallytics";
|
|
430
119
|
|
|
431
120
|
const app = express();
|
|
432
|
-
const
|
|
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
|
|
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
|
-
|
|
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 {
|
|
132
|
+
import { createLocalyticsHandler } from "locallytics";
|
|
470
133
|
|
|
471
134
|
const app = new Hono();
|
|
472
|
-
const
|
|
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) =>
|
|
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
|
|
package/dist/src/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export { LocallyticsGrabber } from "./client/index.js";
|
|
2
2
|
export { LocallyticsData } from "./server/data.js";
|
|
3
|
-
export {
|
|
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
|
package/dist/src/index.d.ts.map
CHANGED
|
@@ -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,
|
|
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
package/dist/src/index.js.map
CHANGED
|
@@ -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,
|
|
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
|
|
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,
|
|
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
|
|
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,
|
|
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"}
|