@seneris/nosework 0.2.0 → 0.3.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/README.md +54 -16
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/query.d.ts +1 -0
- package/dist/query.d.ts.map +1 -1
- package/dist/query.js +1 -1
- package/dist/query.js.map +1 -1
- package/dist/retention.d.ts +19 -0
- package/dist/retention.d.ts.map +1 -0
- package/dist/retention.js +34 -0
- package/dist/retention.js.map +1 -0
- package/dist/sites.d.ts +15 -0
- package/dist/sites.d.ts.map +1 -0
- package/dist/sites.js +31 -0
- package/dist/sites.js.map +1 -0
- package/dist/track.d.ts.map +1 -1
- package/dist/track.js +2 -2
- package/dist/track.js.map +1 -1
- package/dist/utils.d.ts +15 -1
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +29 -9
- package/dist/utils.js.map +1 -1
- package/package.json +6 -2
package/README.md
CHANGED
|
@@ -6,10 +6,24 @@ Privacy-focused, self-hosted analytics for your app suite.
|
|
|
6
6
|
|
|
7
7
|
- **Cookieless tracking** - No consent banners needed
|
|
8
8
|
- **City-level geolocation** - Via Vercel's geo headers
|
|
9
|
-
- **
|
|
9
|
+
- **No PII stored** - IPs are used for hashing only and never written; raw User-Agents are discarded
|
|
10
10
|
- **Multi-site support** - Track all your apps with one shared database
|
|
11
11
|
- **Full API** - Query your analytics data programmatically
|
|
12
12
|
|
|
13
|
+
See [Privacy and compliance](#privacy-and-compliance) below for the short
|
|
14
|
+
version. `docs/PRIVACY.md` in the source repository has the full accounting —
|
|
15
|
+
exactly what is collected, how visitors are counted without cookies, the
|
|
16
|
+
limits of those claims, and text you can adapt for a privacy page. That
|
|
17
|
+
document is not included in the npm package.
|
|
18
|
+
|
|
19
|
+
## Upgrading to 0.3.0
|
|
20
|
+
|
|
21
|
+
- The visitor hash is now scoped per site: the input changed from `ip|userAgent|salt` to `siteId|ip|userAgent|salt`.
|
|
22
|
+
- This is not a data migration — hashes already rotate nightly at UTC midnight, so deploying this change is equivalent to one extra rotation.
|
|
23
|
+
- The only practical effect: visitors who appear both before and after the deploy are counted twice on the deploy day. Historical rows keep their old hashes and remain internally consistent within each day; no backfill is possible or needed.
|
|
24
|
+
- Why it changed: previously the same visitor produced an identical hash on every site sharing the database, which made `visitorHash` a cross-site join key.
|
|
25
|
+
- **API removal:** `computeVisitorIds` is no longer exported from the package root (it remains exported from its module for testing). Update any import of it from `@seneris/nosework`.
|
|
26
|
+
|
|
13
27
|
## Architecture
|
|
14
28
|
|
|
15
29
|
```
|
|
@@ -93,13 +107,6 @@ ANALYTICS_DATABASE_URL="postgresql://user:pass@host/dbname"
|
|
|
93
107
|
ANALYTICS_SITE_ID="my-app" # Unique identifier for this app
|
|
94
108
|
```
|
|
95
109
|
|
|
96
|
-
**MoopySuite Users:** Your analytics tables are in the MoopySuite database, so use:
|
|
97
|
-
```env
|
|
98
|
-
ANALYTICS_DATABASE_URL="${DATABASE_URL}" # Same as MoopySuite DB
|
|
99
|
-
# No ANALYTICS_SITE_ID needed - use MOOPY_CLIENT_ID instead
|
|
100
|
-
```
|
|
101
|
-
See [MoopySuite Integration](./docs/MOOPYSUITE_INTEGRATION.md).
|
|
102
|
-
|
|
103
110
|
### 3. Add Tracking Endpoint
|
|
104
111
|
|
|
105
112
|
Create `app/api/analytics/track/route.ts`:
|
|
@@ -395,7 +402,9 @@ const data = await getTimeSeries({
|
|
|
395
402
|
nosework is designed to be privacy-friendly by default:
|
|
396
403
|
|
|
397
404
|
### No Cookies
|
|
398
|
-
Visitors are identified by a hash of IP + User-Agent + daily salt.
|
|
405
|
+
Visitors are identified by a hash of site ID + IP + User-Agent + daily salt. The site ID is part of the input, so the same visitor produces a different hash on every site sharing the database — you cannot group page views to follow one person across your apps. The salt rotates daily, so you can't follow anyone across days either (by design).
|
|
406
|
+
|
|
407
|
+
That separation holds against a query, not against you. For as long as a day's salt still exists — 7 days, if you schedule `cleanupOldSalts()` — anyone holding the database can recompute the hash for any site ID from a candidate IP and User-Agent. And the location, browser, OS and device columns are identical for the same visitor on all your sites, so on a low-traffic site that combination can correlate them with no hash involved at all.
|
|
399
408
|
|
|
400
409
|
### No PII Storage
|
|
401
410
|
- IP addresses are **never stored** - only used for hashing
|
|
@@ -408,13 +417,35 @@ Sessions are inferred using a 30-minute window hash. No session cookies needed.
|
|
|
408
417
|
### Bot Filtering
|
|
409
418
|
Known bots (Googlebot, crawlers, etc.) are automatically flagged and excluded from statistics.
|
|
410
419
|
|
|
411
|
-
|
|
412
|
-
Because no cookies are used and no PII is stored, you typically don't need:
|
|
413
|
-
- Cookie consent banners
|
|
414
|
-
- Privacy policy updates for analytics
|
|
415
|
-
- Data processing agreements
|
|
420
|
+
---
|
|
416
421
|
|
|
417
|
-
|
|
422
|
+
## Privacy and Compliance
|
|
423
|
+
|
|
424
|
+
Short version, for the GDPR/ePrivacy question this package usually gets asked:
|
|
425
|
+
|
|
426
|
+
- **No cookie consent banner.** Nothing is written to, or read from, the
|
|
427
|
+
visitor's device, so ePrivacy Directive Art. 5(3) — the rule that makes
|
|
428
|
+
consent banners necessary — is never triggered. This is the same basis
|
|
429
|
+
cookieless analytics products rely on.
|
|
430
|
+
- **You do still need privacy-policy text.** The processing that does happen
|
|
431
|
+
(deriving the hashes, storing page metadata) rests on GDPR Art. 6(1)(f)
|
|
432
|
+
legitimate interest, which carries Art. 13 transparency duties. Not needing
|
|
433
|
+
a banner is not the same as not needing a disclosure.
|
|
434
|
+
- **A DPA may still apply.** nosework is self-hosted, but whoever hosts your
|
|
435
|
+
app and your database (Vercel and Neon, in the common setup) processes that
|
|
436
|
+
data on your behalf and is a sub-processor like any other.
|
|
437
|
+
- **No cross-site identifier.** The visitor hash is scoped to the site ID, so
|
|
438
|
+
running several apps against one database does not produce a value that
|
|
439
|
+
links a person's activity between them. See [No Cookies](#no-cookies) above
|
|
440
|
+
for the two limits on that — it stops a join, not a determined operator.
|
|
441
|
+
|
|
442
|
+
`docs/PRIVACY.md` in the source repository documents every stored field, the
|
|
443
|
+
7-day salt lifetime the anonymity argument depends on, the retention jobs your
|
|
444
|
+
deployment has to schedule itself, and a paragraph you can adapt for a privacy
|
|
445
|
+
page.
|
|
446
|
+
|
|
447
|
+
*This is a summary of how the software behaves, not legal advice. Consult a
|
|
448
|
+
legal professional for your specific situation.*
|
|
418
449
|
|
|
419
450
|
---
|
|
420
451
|
|
|
@@ -490,12 +521,14 @@ interface PaginatedQueryOptions extends QueryOptions {
|
|
|
490
521
|
| `isBot(userAgent)` | Check if a user-agent is a bot |
|
|
491
522
|
| `parseUserAgent(ua)` | Parse a user-agent string |
|
|
492
523
|
| `cleanupOldSalts()` | Remove daily salts older than 7 days |
|
|
524
|
+
| `listSites()` | List every site that has reported a page view, derived from page-view data (there is no sites table) |
|
|
525
|
+
| `deleteOldPageViews(olderThan, siteId?)` | Delete page views older than a cutoff; omit `siteId` to sweep all sites |
|
|
493
526
|
|
|
494
527
|
---
|
|
495
528
|
|
|
496
529
|
## Database Schema
|
|
497
530
|
|
|
498
|
-
The package uses these tables (created by
|
|
531
|
+
The package uses these tables (created by this repo's own Drizzle migrations in `drizzle/`, generated with `bun run db:generate` and applied with `bun run db:migrate`):
|
|
499
532
|
|
|
500
533
|
- **page_views** - Individual page view events with location, device info
|
|
501
534
|
- **events** - Custom events with properties
|
|
@@ -505,6 +538,11 @@ The package uses these tables (created by MoopySuite migrations):
|
|
|
505
538
|
|
|
506
539
|
See `src/schema.ts` for the Drizzle schema definitions.
|
|
507
540
|
|
|
541
|
+
`bun run db:migrate` assumes an empty database. If these tables already exist,
|
|
542
|
+
migration 0000 fails with `relation "page_views" already exists` — do not drop
|
|
543
|
+
and recreate them; mark the migration as applied instead. The catch-up
|
|
544
|
+
procedure is in `docs/ARCHITECTURE.md` in the source repository.
|
|
545
|
+
|
|
508
546
|
---
|
|
509
547
|
|
|
510
548
|
## Limitations
|
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
export { trackPageView, trackEvent } from "./track.js";
|
|
2
2
|
export { trackError, getErrorStats, getErrorGroups, getErrorInstances, updateErrorGroupStatus, deleteOldErrors, } from "./error.js";
|
|
3
3
|
export { getStats, getTopPages, getLocations, getReferrers, getDevices, getTimeSeries, getSessionStats, getEntryPages, getExitPages, getPageFlows, getSessions, } from "./query.js";
|
|
4
|
+
export { listSites } from "./sites.js";
|
|
5
|
+
export type { SiteSummary } from "./sites.js";
|
|
6
|
+
export { deleteOldPageViews } from "./retention.js";
|
|
4
7
|
export * from "./schema.js";
|
|
5
8
|
export { getClient, disconnect } from "./client.js";
|
|
6
9
|
export { isBot, cleanupOldSalts } from "./utils.js";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAGvD,OAAO,EACL,UAAU,EACV,aAAa,EACb,cAAc,EACd,iBAAiB,EACjB,sBAAsB,EACtB,eAAe,GAChB,MAAM,YAAY,CAAC;AAGpB,OAAO,EACL,QAAQ,EACR,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,UAAU,EACV,aAAa,EAEb,eAAe,EACf,aAAa,EACb,YAAY,EACZ,YAAY,EACZ,WAAW,GACZ,MAAM,YAAY,CAAC;AAGpB,cAAc,aAAa,CAAC;AAG5B,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGpD,OAAO,EAAE,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAGpD,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAGzC,YAAY,EACV,oBAAoB,EACpB,iBAAiB,EACjB,SAAS,EACT,YAAY,EACZ,qBAAqB,EACrB,KAAK,EACL,OAAO,EACP,YAAY,EACZ,YAAY,EACZ,UAAU,EACV,WAAW,EACX,eAAe,EACf,WAAW,EAEX,YAAY,EACZ,WAAW,EACX,aAAa,EACb,QAAQ,EAER,iBAAiB,EACjB,UAAU,EACV,gBAAgB,EAChB,cAAc,EACd,aAAa,GACd,MAAM,YAAY,CAAC;AAGpB,YAAY,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAGvD,OAAO,EACL,UAAU,EACV,aAAa,EACb,cAAc,EACd,iBAAiB,EACjB,sBAAsB,EACtB,eAAe,GAChB,MAAM,YAAY,CAAC;AAGpB,OAAO,EACL,QAAQ,EACR,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,UAAU,EACV,aAAa,EAEb,eAAe,EACf,aAAa,EACb,YAAY,EACZ,YAAY,EACZ,WAAW,GACZ,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,YAAY,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAG9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAGpD,cAAc,aAAa,CAAC;AAG5B,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGpD,OAAO,EAAE,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAGpD,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAGzC,YAAY,EACV,oBAAoB,EACpB,iBAAiB,EACjB,SAAS,EACT,YAAY,EACZ,qBAAqB,EACrB,KAAK,EACL,OAAO,EACP,YAAY,EACZ,YAAY,EACZ,UAAU,EACV,WAAW,EACX,eAAe,EACf,WAAW,EAEX,YAAY,EACZ,WAAW,EACX,aAAa,EACb,QAAQ,EAER,iBAAiB,EACjB,UAAU,EACV,gBAAgB,EAChB,cAAc,EACd,aAAa,GACd,MAAM,YAAY,CAAC;AAGpB,YAAY,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -7,6 +7,10 @@ export { trackError, getErrorStats, getErrorGroups, getErrorInstances, updateErr
|
|
|
7
7
|
export { getStats, getTopPages, getLocations, getReferrers, getDevices, getTimeSeries,
|
|
8
8
|
// Session analytics
|
|
9
9
|
getSessionStats, getEntryPages, getExitPages, getPageFlows, getSessions, } from "./query.js";
|
|
10
|
+
// Site enumeration
|
|
11
|
+
export { listSites } from "./sites.js";
|
|
12
|
+
// Retention
|
|
13
|
+
export { deleteOldPageViews } from "./retention.js";
|
|
10
14
|
// Schema exports (for advanced use cases)
|
|
11
15
|
export * from "./schema.js";
|
|
12
16
|
// Client utilities
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,8CAA8C;AAE9C,qBAAqB;AACrB,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAEvD,2BAA2B;AAC3B,OAAO,EACL,UAAU,EACV,aAAa,EACb,cAAc,EACd,iBAAiB,EACjB,sBAAsB,EACtB,eAAe,GAChB,MAAM,YAAY,CAAC;AAEpB,kBAAkB;AAClB,OAAO,EACL,QAAQ,EACR,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,UAAU,EACV,aAAa;AACb,oBAAoB;AACpB,eAAe,EACf,aAAa,EACb,YAAY,EACZ,YAAY,EACZ,WAAW,GACZ,MAAM,YAAY,CAAC;AAEpB,0CAA0C;AAC1C,cAAc,aAAa,CAAC;AAE5B,mBAAmB;AACnB,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEpD,oBAAoB;AACpB,OAAO,EAAE,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAEpD,8CAA8C;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,8CAA8C;AAE9C,qBAAqB;AACrB,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAEvD,2BAA2B;AAC3B,OAAO,EACL,UAAU,EACV,aAAa,EACb,cAAc,EACd,iBAAiB,EACjB,sBAAsB,EACtB,eAAe,GAChB,MAAM,YAAY,CAAC;AAEpB,kBAAkB;AAClB,OAAO,EACL,QAAQ,EACR,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,UAAU,EACV,aAAa;AACb,oBAAoB;AACpB,eAAe,EACf,aAAa,EACb,YAAY,EACZ,YAAY,EACZ,WAAW,GACZ,MAAM,YAAY,CAAC;AAEpB,mBAAmB;AACnB,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAGvC,YAAY;AACZ,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAEpD,0CAA0C;AAC1C,cAAc,aAAa,CAAC;AAE5B,mBAAmB;AACnB,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEpD,oBAAoB;AACpB,OAAO,EAAE,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAEpD,8CAA8C;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC"}
|
package/dist/query.d.ts
CHANGED
|
@@ -12,6 +12,7 @@ export interface TimeSeriesDataPoint {
|
|
|
12
12
|
export declare function getTimeSeries(options: QueryOptions & {
|
|
13
13
|
interval?: "hour" | "day" | "week" | "month";
|
|
14
14
|
}): Promise<TimeSeriesDataPoint[]>;
|
|
15
|
+
export declare function formatDateKey(date: Date, interval: "hour" | "day" | "week" | "month"): string;
|
|
15
16
|
/**
|
|
16
17
|
* Get aggregate session statistics
|
|
17
18
|
*/
|
package/dist/query.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../src/query.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,YAAY,EACZ,qBAAqB,EACrB,KAAK,EACL,OAAO,EACP,YAAY,EACZ,YAAY,EACZ,UAAU,EACV,YAAY,EACZ,WAAW,EACX,aAAa,EACb,QAAQ,EACT,MAAM,YAAY,CAAC;AAWpB,wBAAsB,QAAQ,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,KAAK,CAAC,CA0CpE;AAED,wBAAsB,WAAW,CAC/B,OAAO,EAAE,qBAAqB,GAC7B,OAAO,CAAC,OAAO,EAAE,CAAC,CAuBpB;AAED,wBAAsB,YAAY,CAChC,OAAO,EAAE,qBAAqB,GAC7B,OAAO,CAAC,YAAY,EAAE,CAAC,CA0BzB;AAED,wBAAsB,YAAY,CAChC,OAAO,EAAE,qBAAqB,GAC7B,OAAO,CAAC,YAAY,EAAE,CAAC,CAsBzB;AAED,wBAAsB,UAAU,CAC9B,OAAO,EAAE,qBAAqB,GAC7B,OAAO,CAAC,UAAU,EAAE,CAAC,CA0BvB;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,wBAAsB,aAAa,CACjC,OAAO,EAAE,YAAY,GAAG;IAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,KAAK,GAAG,MAAM,GAAG,OAAO,CAAA;CAAE,GACvE,OAAO,CAAC,mBAAmB,EAAE,CAAC,CAgChC;
|
|
1
|
+
{"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../src/query.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,YAAY,EACZ,qBAAqB,EACrB,KAAK,EACL,OAAO,EACP,YAAY,EACZ,YAAY,EACZ,UAAU,EACV,YAAY,EACZ,WAAW,EACX,aAAa,EACb,QAAQ,EACT,MAAM,YAAY,CAAC;AAWpB,wBAAsB,QAAQ,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,KAAK,CAAC,CA0CpE;AAED,wBAAsB,WAAW,CAC/B,OAAO,EAAE,qBAAqB,GAC7B,OAAO,CAAC,OAAO,EAAE,CAAC,CAuBpB;AAED,wBAAsB,YAAY,CAChC,OAAO,EAAE,qBAAqB,GAC7B,OAAO,CAAC,YAAY,EAAE,CAAC,CA0BzB;AAED,wBAAsB,YAAY,CAChC,OAAO,EAAE,qBAAqB,GAC7B,OAAO,CAAC,YAAY,EAAE,CAAC,CAsBzB;AAED,wBAAsB,UAAU,CAC9B,OAAO,EAAE,qBAAqB,GAC7B,OAAO,CAAC,UAAU,EAAE,CAAC,CA0BvB;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,wBAAsB,aAAa,CACjC,OAAO,EAAE,YAAY,GAAG;IAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,KAAK,GAAG,MAAM,GAAG,OAAO,CAAA;CAAE,GACvE,OAAO,CAAC,mBAAmB,EAAE,CAAC,CAgChC;AAED,wBAAgB,aAAa,CAC3B,IAAI,EAAE,IAAI,EACV,QAAQ,EAAE,MAAM,GAAG,KAAK,GAAG,MAAM,GAAG,OAAO,GAC1C,MAAM,CAiBR;AAMD;;GAEG;AACH,wBAAsB,eAAe,CACnC,OAAO,EAAE,YAAY,GACpB,OAAO,CAAC,YAAY,CAAC,CA2DvB;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,OAAO,EAAE,qBAAqB,GAC7B,OAAO,CAAC,aAAa,EAAE,CAAC,CAuC1B;AAED;;GAEG;AACH,wBAAsB,YAAY,CAChC,OAAO,EAAE,qBAAqB,GAC7B,OAAO,CAAC,aAAa,EAAE,CAAC,CAuC1B;AAED;;GAEG;AACH,wBAAsB,YAAY,CAChC,OAAO,EAAE,qBAAqB,GAAG;IAAE,aAAa,CAAC,EAAE,MAAM,CAAA;CAAE,GAC1D,OAAO,CAAC,QAAQ,EAAE,CAAC,CA6CrB;AAED;;GAEG;AACH,wBAAsB,WAAW,CAC/B,OAAO,EAAE,qBAAqB,GAC7B,OAAO,CAAC,WAAW,EAAE,CAAC,CAkFxB"}
|
package/dist/query.js
CHANGED
|
@@ -163,7 +163,7 @@ export async function getTimeSeries(options) {
|
|
|
163
163
|
visitors: data.visitors.size,
|
|
164
164
|
}));
|
|
165
165
|
}
|
|
166
|
-
function formatDateKey(date, interval) {
|
|
166
|
+
export function formatDateKey(date, interval) {
|
|
167
167
|
const d = new Date(date);
|
|
168
168
|
switch (interval) {
|
|
169
169
|
case "hour":
|
package/dist/query.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query.js","sourceRoot":"","sources":["../src/query.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"query.js","sourceRoot":"","sources":["../src/query.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Build the WHERE predicate for retention deletion.
|
|
3
|
+
*
|
|
4
|
+
* Ensures correct scoping: if siteId is provided, scopes to that site;
|
|
5
|
+
* if omitted, sweeps all sites. Uses explicit undefined check (not truthiness)
|
|
6
|
+
* so that an empty siteId "" scopes to that site rather than sweeping all.
|
|
7
|
+
*/
|
|
8
|
+
export declare function buildRetentionWhere(olderThan: Date, siteId?: string): import("drizzle-orm").SQL<unknown> | undefined;
|
|
9
|
+
/**
|
|
10
|
+
* Delete page views older than the given cutoff.
|
|
11
|
+
*
|
|
12
|
+
* Enforces the stated retention period. Omit siteId to sweep every site, which
|
|
13
|
+
* is what the scheduled retention job does — deleteOldErrors() requires a
|
|
14
|
+
* siteId, but a retention cron has no list of sites to iterate.
|
|
15
|
+
*
|
|
16
|
+
* @returns the number of rows deleted
|
|
17
|
+
*/
|
|
18
|
+
export declare function deleteOldPageViews(olderThan: Date, siteId?: string): Promise<number>;
|
|
19
|
+
//# sourceMappingURL=retention.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retention.d.ts","sourceRoot":"","sources":["../src/retention.ts"],"names":[],"mappings":"AAIA;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,IAAI,EAAE,MAAM,CAAC,EAAE,MAAM,kDAInE;AAED;;;;;;;;GAQG;AACH,wBAAsB,kBAAkB,CACtC,SAAS,EAAE,IAAI,EACf,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,MAAM,CAAC,CAWjB"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { getClient } from "./client.js";
|
|
2
|
+
import { pageViews } from "./schema.js";
|
|
3
|
+
import { and, eq, lt } from "drizzle-orm";
|
|
4
|
+
/**
|
|
5
|
+
* Build the WHERE predicate for retention deletion.
|
|
6
|
+
*
|
|
7
|
+
* Ensures correct scoping: if siteId is provided, scopes to that site;
|
|
8
|
+
* if omitted, sweeps all sites. Uses explicit undefined check (not truthiness)
|
|
9
|
+
* so that an empty siteId "" scopes to that site rather than sweeping all.
|
|
10
|
+
*/
|
|
11
|
+
export function buildRetentionWhere(olderThan, siteId) {
|
|
12
|
+
return siteId !== undefined
|
|
13
|
+
? and(eq(pageViews.siteId, siteId), lt(pageViews.timestamp, olderThan))
|
|
14
|
+
: lt(pageViews.timestamp, olderThan);
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Delete page views older than the given cutoff.
|
|
18
|
+
*
|
|
19
|
+
* Enforces the stated retention period. Omit siteId to sweep every site, which
|
|
20
|
+
* is what the scheduled retention job does — deleteOldErrors() requires a
|
|
21
|
+
* siteId, but a retention cron has no list of sites to iterate.
|
|
22
|
+
*
|
|
23
|
+
* @returns the number of rows deleted
|
|
24
|
+
*/
|
|
25
|
+
export async function deleteOldPageViews(olderThan, siteId) {
|
|
26
|
+
const db = getClient();
|
|
27
|
+
const where = buildRetentionWhere(olderThan, siteId);
|
|
28
|
+
const deleted = await db
|
|
29
|
+
.delete(pageViews)
|
|
30
|
+
.where(where)
|
|
31
|
+
.returning({ id: pageViews.id });
|
|
32
|
+
return deleted.length;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=retention.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retention.js","sourceRoot":"","sources":["../src/retention.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AAE1C;;;;;;GAMG;AACH,MAAM,UAAU,mBAAmB,CAAC,SAAe,EAAE,MAAe;IAClE,OAAO,MAAM,KAAK,SAAS;QACzB,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QACvE,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;AACzC,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,SAAe,EACf,MAAe;IAEf,MAAM,EAAE,GAAG,SAAS,EAAE,CAAC;IAEvB,MAAM,KAAK,GAAG,mBAAmB,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAErD,MAAM,OAAO,GAAG,MAAM,EAAE;SACrB,MAAM,CAAC,SAAS,CAAC;SACjB,KAAK,CAAC,KAAK,CAAC;SACZ,SAAS,CAAC,EAAE,EAAE,EAAE,SAAS,CAAC,EAAE,EAAE,CAAC,CAAC;IAEnC,OAAO,OAAO,CAAC,MAAM,CAAC;AACxB,CAAC"}
|
package/dist/sites.d.ts
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export interface SiteSummary {
|
|
2
|
+
siteId: string;
|
|
3
|
+
pageViews: number;
|
|
4
|
+
visitors: number;
|
|
5
|
+
lastSeen: Date | null;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* List every site that has ever reported a page view, busiest first.
|
|
9
|
+
*
|
|
10
|
+
* There is no sites table — siteId is a bare column written by whichever app
|
|
11
|
+
* is reporting — so the list is derived from the data. A site appears here as
|
|
12
|
+
* soon as it sends its first non-bot page view, with no registration step.
|
|
13
|
+
*/
|
|
14
|
+
export declare function listSites(): Promise<SiteSummary[]>;
|
|
15
|
+
//# sourceMappingURL=sites.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sites.d.ts","sourceRoot":"","sources":["../src/sites.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,IAAI,GAAG,IAAI,CAAC;CACvB;AAED;;;;;;GAMG;AACH,wBAAsB,SAAS,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC,CAqBxD"}
|
package/dist/sites.js
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { getClient } from "./client.js";
|
|
2
|
+
import { pageViews } from "./schema.js";
|
|
3
|
+
import { count, countDistinct, desc, eq, max } from "drizzle-orm";
|
|
4
|
+
/**
|
|
5
|
+
* List every site that has ever reported a page view, busiest first.
|
|
6
|
+
*
|
|
7
|
+
* There is no sites table — siteId is a bare column written by whichever app
|
|
8
|
+
* is reporting — so the list is derived from the data. A site appears here as
|
|
9
|
+
* soon as it sends its first non-bot page view, with no registration step.
|
|
10
|
+
*/
|
|
11
|
+
export async function listSites() {
|
|
12
|
+
const db = getClient();
|
|
13
|
+
const rows = await db
|
|
14
|
+
.select({
|
|
15
|
+
siteId: pageViews.siteId,
|
|
16
|
+
pageViewCount: count(),
|
|
17
|
+
visitorCount: countDistinct(pageViews.visitorHash),
|
|
18
|
+
lastSeen: max(pageViews.timestamp),
|
|
19
|
+
})
|
|
20
|
+
.from(pageViews)
|
|
21
|
+
.where(eq(pageViews.isBot, false))
|
|
22
|
+
.groupBy(pageViews.siteId)
|
|
23
|
+
.orderBy(desc(count()));
|
|
24
|
+
return rows.map((r) => ({
|
|
25
|
+
siteId: r.siteId,
|
|
26
|
+
pageViews: r.pageViewCount,
|
|
27
|
+
visitors: r.visitorCount,
|
|
28
|
+
lastSeen: r.lastSeen ?? null,
|
|
29
|
+
}));
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=sites.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sites.js","sourceRoot":"","sources":["../src/sites.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AASlE;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS;IAC7B,MAAM,EAAE,GAAG,SAAS,EAAE,CAAC;IAEvB,MAAM,IAAI,GAAG,MAAM,EAAE;SAClB,MAAM,CAAC;QACN,MAAM,EAAE,SAAS,CAAC,MAAM;QACxB,aAAa,EAAE,KAAK,EAAE;QACtB,YAAY,EAAE,aAAa,CAAC,SAAS,CAAC,WAAW,CAAC;QAClD,QAAQ,EAAE,GAAG,CAAC,SAAS,CAAC,SAAS,CAAC;KACnC,CAAC;SACD,IAAI,CAAC,SAAS,CAAC;SACf,KAAK,CAAC,EAAE,CAAC,SAAS,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;SACjC,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC;SACzB,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IAE1B,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACtB,MAAM,EAAE,CAAC,CAAC,MAAM;QAChB,SAAS,EAAE,CAAC,CAAC,aAAa;QAC1B,QAAQ,EAAE,CAAC,CAAC,YAAY;QACxB,QAAQ,EAAE,CAAC,CAAC,QAAQ,IAAI,IAAI;KAC7B,CAAC,CAAC,CAAC;AACN,CAAC"}
|
package/dist/track.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"track.d.ts","sourceRoot":"","sources":["../src/track.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAE1E,wBAAsB,aAAa,CACjC,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"track.d.ts","sourceRoot":"","sources":["../src/track.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAE1E,wBAAsB,aAAa,CACjC,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAAC,IAAI,CAAC,CAoEf;AAED,wBAAsB,UAAU,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAyB1E"}
|
package/dist/track.js
CHANGED
|
@@ -10,7 +10,7 @@ export async function trackPageView(options) {
|
|
|
10
10
|
const ipNorm = ip ?? null;
|
|
11
11
|
const uaNorm = userAgent ?? null;
|
|
12
12
|
// Get visitor info (hashes for privacy)
|
|
13
|
-
const { visitorHash, sessionId } = await getVisitorInfo(ipNorm, uaNorm);
|
|
13
|
+
const { visitorHash, sessionId } = await getVisitorInfo(siteId, ipNorm, uaNorm);
|
|
14
14
|
// Parse user agent
|
|
15
15
|
const ua = parseUserAgent(uaNorm);
|
|
16
16
|
// Detect bots
|
|
@@ -56,7 +56,7 @@ export async function trackEvent(options) {
|
|
|
56
56
|
const ipNorm = ip ?? null;
|
|
57
57
|
const uaNorm = userAgent ?? null;
|
|
58
58
|
// Get visitor info (hashes for privacy)
|
|
59
|
-
const { visitorHash, sessionId } = await getVisitorInfo(ipNorm, uaNorm);
|
|
59
|
+
const { visitorHash, sessionId } = await getVisitorInfo(siteId, ipNorm, uaNorm);
|
|
60
60
|
const db = getClient();
|
|
61
61
|
await db.insert(events).values({
|
|
62
62
|
siteId,
|
package/dist/track.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"track.js","sourceRoot":"","sources":["../src/track.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAGpE,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,OAA6B;IAE7B,MAAM,EACJ,MAAM,EACN,GAAG,EACH,QAAQ,EACR,EAAE,EACF,SAAS,EACT,MAAM;IACN,uDAAuD;IACvD,OAAO,EACP,WAAW,EACX,MAAM,EACN,IAAI,GACL,GAAG,OAAO,CAAC;IAEZ,8BAA8B;IAC9B,MAAM,MAAM,GAAG,EAAE,IAAI,IAAI,CAAC;IAC1B,MAAM,MAAM,GAAG,SAAS,IAAI,IAAI,CAAC;IAEjC,wCAAwC;IACxC,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,GAAG,MAAM,cAAc,
|
|
1
|
+
{"version":3,"file":"track.js","sourceRoot":"","sources":["../src/track.ts"],"names":[],"mappings":"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"}
|
package/dist/utils.d.ts
CHANGED
|
@@ -1,6 +1,20 @@
|
|
|
1
1
|
import type { VisitorInfo } from "./types.js";
|
|
2
2
|
export declare function isBot(userAgent: string | null): boolean;
|
|
3
|
-
|
|
3
|
+
/**
|
|
4
|
+
* Pure derivation of visitor and session identifiers.
|
|
5
|
+
*
|
|
6
|
+
* Separated from getVisitorInfo() so the privacy-critical logic can be tested
|
|
7
|
+
* without a database. The inputs and their order are load-bearing: changing
|
|
8
|
+
* them resets every visitor's identity.
|
|
9
|
+
*
|
|
10
|
+
* siteId is part of the hash input so that the same person, on the same day,
|
|
11
|
+
* gets a different visitorHash on each site in a deployment. The daily salt is
|
|
12
|
+
* one row for the whole database, so without the site component a group-by on
|
|
13
|
+
* visitorHash would reconstruct a day of cross-site browsing. This is the same
|
|
14
|
+
* reason Plausible folds the domain into its hash.
|
|
15
|
+
*/
|
|
16
|
+
export declare function computeVisitorIds(siteId: string, ip: string | null, userAgent: string | null, salt: string, now: Date): VisitorInfo;
|
|
17
|
+
export declare function getVisitorInfo(siteId: string, ip: string | null, userAgent: string | null): Promise<VisitorInfo>;
|
|
4
18
|
export declare function extractPathname(url: string): string;
|
|
5
19
|
export declare function cleanupOldSalts(): Promise<number>;
|
|
6
20
|
//# sourceMappingURL=utils.d.ts.map
|
package/dist/utils.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AA6C9C,wBAAgB,KAAK,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAIvD;AAsCD,wBAAsB,cAAc,CAClC,EAAE,EAAE,MAAM,GAAG,IAAI,EACjB,SAAS,EAAE,MAAM,GAAG,IAAI,GACvB,OAAO,CAAC,WAAW,CAAC,
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AA6C9C,wBAAgB,KAAK,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAIvD;AAsCD;;;;;;;;;;;;GAYG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,MAAM,EACd,EAAE,EAAE,MAAM,GAAG,IAAI,EACjB,SAAS,EAAE,MAAM,GAAG,IAAI,EACxB,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,IAAI,GACR,WAAW,CAWb;AAED,wBAAsB,cAAc,CAClC,MAAM,EAAE,MAAM,EACd,EAAE,EAAE,MAAM,GAAG,IAAI,EACjB,SAAS,EAAE,MAAM,GAAG,IAAI,GACvB,OAAO,CAAC,WAAW,CAAC,CAItB;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CASnD;AASD,wBAAsB,eAAe,IAAI,OAAO,CAAC,MAAM,CAAC,CAYvD"}
|
package/dist/utils.js
CHANGED
|
@@ -81,20 +81,34 @@ async function getDailySalt(date) {
|
|
|
81
81
|
return retry?.salt ?? salt;
|
|
82
82
|
}
|
|
83
83
|
}
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
84
|
+
/**
|
|
85
|
+
* Pure derivation of visitor and session identifiers.
|
|
86
|
+
*
|
|
87
|
+
* Separated from getVisitorInfo() so the privacy-critical logic can be tested
|
|
88
|
+
* without a database. The inputs and their order are load-bearing: changing
|
|
89
|
+
* them resets every visitor's identity.
|
|
90
|
+
*
|
|
91
|
+
* siteId is part of the hash input so that the same person, on the same day,
|
|
92
|
+
* gets a different visitorHash on each site in a deployment. The daily salt is
|
|
93
|
+
* one row for the whole database, so without the site component a group-by on
|
|
94
|
+
* visitorHash would reconstruct a day of cross-site browsing. This is the same
|
|
95
|
+
* reason Plausible folds the domain into its hash.
|
|
96
|
+
*/
|
|
97
|
+
export function computeVisitorIds(siteId, ip, userAgent, salt, now) {
|
|
98
|
+
// Visitor hash: site-scoped, and rotates daily because the salt does
|
|
99
|
+
const visitorInput = `${siteId}|${ip ?? ""}|${userAgent ?? ""}|${salt}`;
|
|
90
100
|
const visitorHash = hash(visitorInput);
|
|
91
101
|
// Session hash: rotates every 30 minutes
|
|
92
102
|
// This provides session-like behavior without cookies
|
|
93
103
|
const thirtyMinWindow = Math.floor(now.getTime() / (30 * 60 * 1000));
|
|
94
|
-
const
|
|
95
|
-
const sessionId = hash(sessionInput);
|
|
104
|
+
const sessionId = hash(`${visitorInput}|${thirtyMinWindow}`);
|
|
96
105
|
return { visitorHash, sessionId };
|
|
97
106
|
}
|
|
107
|
+
export async function getVisitorInfo(siteId, ip, userAgent) {
|
|
108
|
+
const now = new Date();
|
|
109
|
+
const salt = await getDailySalt(now);
|
|
110
|
+
return computeVisitorIds(siteId, ip, userAgent, salt, now);
|
|
111
|
+
}
|
|
98
112
|
export function extractPathname(url) {
|
|
99
113
|
try {
|
|
100
114
|
const parsed = new URL(url);
|
|
@@ -107,10 +121,16 @@ export function extractPathname(url) {
|
|
|
107
121
|
}
|
|
108
122
|
}
|
|
109
123
|
// Clean up old daily salts (older than 7 days)
|
|
124
|
+
//
|
|
125
|
+
// The arithmetic is done in UTC throughout: salts are keyed by UTC calendar
|
|
126
|
+
// day (getDailySalt() derives its key from toISOString()), so subtracting in
|
|
127
|
+
// local time and then formatting in UTC would land the cutoff a day early or
|
|
128
|
+
// late on any host that isn't at UTC+0 — salts would live 6 or 8 days rather
|
|
129
|
+
// than 7. docs/PRIVACY.md makes the 7-day number load-bearing.
|
|
110
130
|
export async function cleanupOldSalts() {
|
|
111
131
|
const db = getClient();
|
|
112
132
|
const sevenDaysAgo = new Date();
|
|
113
|
-
sevenDaysAgo.
|
|
133
|
+
sevenDaysAgo.setUTCDate(sevenDaysAgo.getUTCDate() - 7);
|
|
114
134
|
const dateStr = sevenDaysAgo.toISOString().split("T")[0];
|
|
115
135
|
const deleted = await db
|
|
116
136
|
.delete(dailySalts)
|
package/dist/utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AAGrC,yBAAyB;AACzB,MAAM,YAAY,GAAG;IACnB,MAAM;IACN,QAAQ;IACR,SAAS;IACT,QAAQ;IACR,gBAAgB;IAChB,YAAY;IACZ,UAAU;IACV,SAAS;IACT,QAAQ;IACR,aAAa;IACb,sBAAsB;IACtB,aAAa;IACb,cAAc;IACd,WAAW;IACX,cAAc;IACd,aAAa;IACb,WAAW;IACX,UAAU;IACV,cAAc;IACd,WAAW;IACX,YAAY;IACZ,YAAY;IACZ,aAAa;IACb,WAAW;IACX,YAAY;IACZ,aAAa;IACb,YAAY;IACZ,WAAW;IACX,YAAY;IACZ,aAAa;IACb,UAAU;IACV,SAAS;IACT,aAAa;IACb,SAAS;IACT,YAAY;IACZ,YAAY;IACZ,SAAS;IACT,UAAU;IACV,WAAW;CACZ,CAAC;AAEF,MAAM,UAAU,KAAK,CAAC,SAAwB;IAC5C,IAAI,CAAC,SAAS;QAAE,OAAO,IAAI,CAAC,CAAC,6BAA6B;IAE1D,OAAO,YAAY,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;AACjE,CAAC;AAED,SAAS,IAAI,CAAC,KAAa;IACzB,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AACvE,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,IAAU;IACpC,MAAM,EAAE,GAAG,SAAS,EAAE,CAAC;IACvB,uDAAuD;IACvD,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC;IAElD,2BAA2B;IAC3B,MAAM,CAAC,YAAY,CAAC,GAAG,MAAM,EAAE;SAC5B,MAAM,EAAE;SACR,IAAI,CAAC,UAAU,CAAC;SAChB,KAAK,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;SACnC,KAAK,CAAC,CAAC,CAAC,CAAC;IAEZ,IAAI,YAAY,EAAE,CAAC;QACjB,OAAO,YAAY,CAAC,IAAI,CAAC;IAC3B,CAAC;IAED,0BAA0B;IAC1B,MAAM,IAAI,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC7C,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5D,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,kEAAkE;QAClE,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,EAAE;aACrB,MAAM,EAAE;aACR,IAAI,CAAC,UAAU,CAAC;aAChB,KAAK,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;aACnC,KAAK,CAAC,CAAC,CAAC,CAAC;QACZ,OAAO,KAAK,EAAE,IAAI,IAAI,IAAI,CAAC;IAC7B,CAAC;AACH,CAAC;AAED,MAAM,
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@seneris/nosework",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"description": "Privacy-focused, self-hosted analytics for your app suite",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -22,7 +22,10 @@
|
|
|
22
22
|
"scripts": {
|
|
23
23
|
"build": "tsc",
|
|
24
24
|
"dev": "tsc --watch",
|
|
25
|
-
"
|
|
25
|
+
"test": "bun test",
|
|
26
|
+
"prepublishOnly": "bun run build",
|
|
27
|
+
"db:generate": "drizzle-kit generate",
|
|
28
|
+
"db:migrate": "drizzle-kit migrate"
|
|
26
29
|
},
|
|
27
30
|
"keywords": [
|
|
28
31
|
"analytics",
|
|
@@ -41,6 +44,7 @@
|
|
|
41
44
|
"devDependencies": {
|
|
42
45
|
"@types/bun": "^1.3.5",
|
|
43
46
|
"@types/ua-parser-js": "^0.7.39",
|
|
47
|
+
"drizzle-kit": "^0.31.10",
|
|
44
48
|
"typescript": "^5.7.3"
|
|
45
49
|
},
|
|
46
50
|
"peerDependencies": {
|