locallytics 0.1.9 → 0.2.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.
Files changed (88) hide show
  1. package/dist/adapters/drizzle.d.mts +25 -0
  2. package/dist/adapters/drizzle.d.ts +25 -0
  3. package/dist/adapters/drizzle.js +38 -0
  4. package/dist/adapters/drizzle.mjs +7 -0
  5. package/dist/adapters/prisma.d.mts +25 -0
  6. package/dist/adapters/prisma.d.ts +25 -0
  7. package/dist/adapters/prisma.js +38 -0
  8. package/dist/adapters/prisma.mjs +7 -0
  9. package/dist/adapters.d.mts +7 -0
  10. package/dist/adapters.d.ts +7 -0
  11. package/dist/adapters.js +39 -0
  12. package/dist/adapters.mjs +8 -0
  13. package/dist/browser.d.mts +41 -0
  14. package/dist/browser.d.ts +41 -0
  15. package/dist/browser.js +79 -0
  16. package/dist/browser.mjs +10 -0
  17. package/dist/index.d.mts +59 -0
  18. package/dist/index.d.ts +59 -6
  19. package/dist/index.js +367 -7
  20. package/dist/index.mjs +336 -0
  21. package/dist/react.d.mts +48 -0
  22. package/dist/react.d.ts +48 -0
  23. package/dist/react.js +132 -0
  24. package/dist/react.mjs +61 -0
  25. package/dist/shared/chunk-8tbv1rg5.js +45 -0
  26. package/package.json +60 -48
  27. package/README.md +0 -73
  28. package/dist/client/LocallyticsGrabber.d.ts +0 -30
  29. package/dist/client/LocallyticsGrabber.d.ts.map +0 -1
  30. package/dist/client/LocallyticsGrabber.js +0 -71
  31. package/dist/client/LocallyticsGrabber.js.map +0 -1
  32. package/dist/client/batcher.d.ts +0 -48
  33. package/dist/client/batcher.d.ts.map +0 -1
  34. package/dist/client/batcher.js +0 -134
  35. package/dist/client/batcher.js.map +0 -1
  36. package/dist/client/tracker.d.ts +0 -18
  37. package/dist/client/tracker.d.ts.map +0 -1
  38. package/dist/client/tracker.js +0 -101
  39. package/dist/client/tracker.js.map +0 -1
  40. package/dist/db/factory.d.ts +0 -11
  41. package/dist/db/factory.d.ts.map +0 -1
  42. package/dist/db/factory.js +0 -46
  43. package/dist/db/factory.js.map +0 -1
  44. package/dist/db/mysql.d.ts +0 -17
  45. package/dist/db/mysql.d.ts.map +0 -1
  46. package/dist/db/mysql.js +0 -144
  47. package/dist/db/mysql.js.map +0 -1
  48. package/dist/db/postgres.d.ts +0 -16
  49. package/dist/db/postgres.d.ts.map +0 -1
  50. package/dist/db/postgres.js +0 -142
  51. package/dist/db/postgres.js.map +0 -1
  52. package/dist/db/sqlite.d.ts +0 -17
  53. package/dist/db/sqlite.d.ts.map +0 -1
  54. package/dist/db/sqlite.js +0 -130
  55. package/dist/db/sqlite.js.map +0 -1
  56. package/dist/index.d.ts.map +0 -1
  57. package/dist/index.js.map +0 -1
  58. package/dist/server/handlers.d.ts +0 -10
  59. package/dist/server/handlers.d.ts.map +0 -1
  60. package/dist/server/handlers.js +0 -96
  61. package/dist/server/handlers.js.map +0 -1
  62. package/dist/server/index.d.ts +0 -42
  63. package/dist/server/index.d.ts.map +0 -1
  64. package/dist/server/index.js +0 -96
  65. package/dist/server/index.js.map +0 -1
  66. package/dist/server/queries.d.ts +0 -10
  67. package/dist/server/queries.d.ts.map +0 -1
  68. package/dist/server/queries.js +0 -24
  69. package/dist/server/queries.js.map +0 -1
  70. package/dist/server/validator.d.ts +0 -32
  71. package/dist/server/validator.d.ts.map +0 -1
  72. package/dist/server/validator.js +0 -129
  73. package/dist/server/validator.js.map +0 -1
  74. package/dist/types/index.d.ts +0 -135
  75. package/dist/types/index.d.ts.map +0 -1
  76. package/dist/types/index.js +0 -24
  77. package/dist/types/index.js.map +0 -1
  78. package/dist/utils/hash.d.ts +0 -16
  79. package/dist/utils/hash.d.ts.map +0 -1
  80. package/dist/utils/hash.js +0 -36
  81. package/dist/utils/hash.js.map +0 -1
  82. package/dist/utils/rate-limit.d.ts +0 -32
  83. package/dist/utils/rate-limit.d.ts.map +0 -1
  84. package/dist/utils/rate-limit.js +0 -73
  85. package/dist/utils/rate-limit.js.map +0 -1
  86. package/src/db/schema-mysql.sql +0 -17
  87. package/src/db/schema-sqlite.sql +0 -29
  88. package/src/db/schema.sql +0 -35
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Locallytics - Analytics built around a database-first API.
3
+ * @packageDocumentation
4
+ */
5
+ type LocallyticsEvent = {
6
+ id?: string | number;
7
+ type: string;
8
+ timestamp: number;
9
+ sessionId?: string;
10
+ userId?: string;
11
+ metadata?: Record<string, unknown>;
12
+ };
13
+ interface DatabaseAdapter {
14
+ initialize?(): Promise<void> | void;
15
+ insertEvent(event: Omit<LocallyticsEvent, "id">): Promise<LocallyticsEvent>;
16
+ findEvents(): Promise<LocallyticsEvent[]>;
17
+ }
18
+ type DrizzleAdapterConfig = {
19
+ provider: "sqlite" | "pg" | "mysql";
20
+ };
21
+ /**
22
+ * TODO: Drizzle adapter is planned for a future release.
23
+ */
24
+ declare function drizzleAdapter(_db: unknown, _config: DrizzleAdapterConfig): DatabaseAdapter;
25
+ export { drizzleAdapter, DrizzleAdapterConfig };
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Locallytics - Analytics built around a database-first API.
3
+ * @packageDocumentation
4
+ */
5
+ type LocallyticsEvent = {
6
+ id?: string | number;
7
+ type: string;
8
+ timestamp: number;
9
+ sessionId?: string;
10
+ userId?: string;
11
+ metadata?: Record<string, unknown>;
12
+ };
13
+ interface DatabaseAdapter {
14
+ initialize?(): Promise<void> | void;
15
+ insertEvent(event: Omit<LocallyticsEvent, "id">): Promise<LocallyticsEvent>;
16
+ findEvents(): Promise<LocallyticsEvent[]>;
17
+ }
18
+ type DrizzleAdapterConfig = {
19
+ provider: "sqlite" | "pg" | "mysql";
20
+ };
21
+ /**
22
+ * TODO: Drizzle adapter is planned for a future release.
23
+ */
24
+ declare function drizzleAdapter(_db: unknown, _config: DrizzleAdapterConfig): DatabaseAdapter;
25
+ export { drizzleAdapter, DrizzleAdapterConfig };
@@ -0,0 +1,38 @@
1
+ var import_node_module = require("node:module");
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropNames = Object.getOwnPropertyNames;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __moduleCache = /* @__PURE__ */ new WeakMap;
7
+ var __toCommonJS = (from) => {
8
+ var entry = __moduleCache.get(from), desc;
9
+ if (entry)
10
+ return entry;
11
+ entry = __defProp({}, "__esModule", { value: true });
12
+ if (from && typeof from === "object" || typeof from === "function")
13
+ __getOwnPropNames(from).map((key) => !__hasOwnProp.call(entry, key) && __defProp(entry, key, {
14
+ get: () => from[key],
15
+ enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
16
+ }));
17
+ __moduleCache.set(from, entry);
18
+ return entry;
19
+ };
20
+ var __export = (target, all) => {
21
+ for (var name in all)
22
+ __defProp(target, name, {
23
+ get: all[name],
24
+ enumerable: true,
25
+ configurable: true,
26
+ set: (newValue) => all[name] = () => newValue
27
+ });
28
+ };
29
+
30
+ // src/adapters/drizzle.ts
31
+ var exports_drizzle = {};
32
+ __export(exports_drizzle, {
33
+ drizzleAdapter: () => drizzleAdapter
34
+ });
35
+ module.exports = __toCommonJS(exports_drizzle);
36
+ function drizzleAdapter(_db, _config) {
37
+ throw new Error("TODO: drizzleAdapter is not implemented yet. This is intentionally deferred in ideals.md.");
38
+ }
@@ -0,0 +1,7 @@
1
+ // src/adapters/drizzle.ts
2
+ function drizzleAdapter(_db, _config) {
3
+ throw new Error("TODO: drizzleAdapter is not implemented yet. This is intentionally deferred in ideals.md.");
4
+ }
5
+ export {
6
+ drizzleAdapter
7
+ };
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Locallytics - Analytics built around a database-first API.
3
+ * @packageDocumentation
4
+ */
5
+ type LocallyticsEvent = {
6
+ id?: string | number;
7
+ type: string;
8
+ timestamp: number;
9
+ sessionId?: string;
10
+ userId?: string;
11
+ metadata?: Record<string, unknown>;
12
+ };
13
+ interface DatabaseAdapter {
14
+ initialize?(): Promise<void> | void;
15
+ insertEvent(event: Omit<LocallyticsEvent, "id">): Promise<LocallyticsEvent>;
16
+ findEvents(): Promise<LocallyticsEvent[]>;
17
+ }
18
+ type PrismaAdapterConfig = {
19
+ provider: "sqlite" | "postgres" | "mysql";
20
+ };
21
+ /**
22
+ * TODO: Prisma adapter is planned for a future release.
23
+ */
24
+ declare function prismaAdapter(_prisma: unknown, _config: PrismaAdapterConfig): DatabaseAdapter;
25
+ export { prismaAdapter, PrismaAdapterConfig };
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Locallytics - Analytics built around a database-first API.
3
+ * @packageDocumentation
4
+ */
5
+ type LocallyticsEvent = {
6
+ id?: string | number;
7
+ type: string;
8
+ timestamp: number;
9
+ sessionId?: string;
10
+ userId?: string;
11
+ metadata?: Record<string, unknown>;
12
+ };
13
+ interface DatabaseAdapter {
14
+ initialize?(): Promise<void> | void;
15
+ insertEvent(event: Omit<LocallyticsEvent, "id">): Promise<LocallyticsEvent>;
16
+ findEvents(): Promise<LocallyticsEvent[]>;
17
+ }
18
+ type PrismaAdapterConfig = {
19
+ provider: "sqlite" | "postgres" | "mysql";
20
+ };
21
+ /**
22
+ * TODO: Prisma adapter is planned for a future release.
23
+ */
24
+ declare function prismaAdapter(_prisma: unknown, _config: PrismaAdapterConfig): DatabaseAdapter;
25
+ export { prismaAdapter, PrismaAdapterConfig };
@@ -0,0 +1,38 @@
1
+ var import_node_module = require("node:module");
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropNames = Object.getOwnPropertyNames;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __moduleCache = /* @__PURE__ */ new WeakMap;
7
+ var __toCommonJS = (from) => {
8
+ var entry = __moduleCache.get(from), desc;
9
+ if (entry)
10
+ return entry;
11
+ entry = __defProp({}, "__esModule", { value: true });
12
+ if (from && typeof from === "object" || typeof from === "function")
13
+ __getOwnPropNames(from).map((key) => !__hasOwnProp.call(entry, key) && __defProp(entry, key, {
14
+ get: () => from[key],
15
+ enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
16
+ }));
17
+ __moduleCache.set(from, entry);
18
+ return entry;
19
+ };
20
+ var __export = (target, all) => {
21
+ for (var name in all)
22
+ __defProp(target, name, {
23
+ get: all[name],
24
+ enumerable: true,
25
+ configurable: true,
26
+ set: (newValue) => all[name] = () => newValue
27
+ });
28
+ };
29
+
30
+ // src/adapters/prisma.ts
31
+ var exports_prisma = {};
32
+ __export(exports_prisma, {
33
+ prismaAdapter: () => prismaAdapter
34
+ });
35
+ module.exports = __toCommonJS(exports_prisma);
36
+ function prismaAdapter(_prisma, _config) {
37
+ throw new Error("TODO: prismaAdapter is not implemented yet. This is intentionally deferred in ideals.md.");
38
+ }
@@ -0,0 +1,7 @@
1
+ // src/adapters/prisma.ts
2
+ function prismaAdapter(_prisma, _config) {
3
+ throw new Error("TODO: prismaAdapter is not implemented yet. This is intentionally deferred in ideals.md.");
4
+ }
5
+ export {
6
+ prismaAdapter
7
+ };
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Adapter roadmap.
3
+ *
4
+ * Per ideals.md, ORM adapters are intentionally TODO for now.
5
+ */
6
+ declare const adapterTodoList: readonly ["prismaAdapter (TODO)", "drizzleAdapter (TODO)"];
7
+ export { adapterTodoList };
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Adapter roadmap.
3
+ *
4
+ * Per ideals.md, ORM adapters are intentionally TODO for now.
5
+ */
6
+ declare const adapterTodoList: readonly ["prismaAdapter (TODO)", "drizzleAdapter (TODO)"];
7
+ export { adapterTodoList };
@@ -0,0 +1,39 @@
1
+ var import_node_module = require("node:module");
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropNames = Object.getOwnPropertyNames;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __moduleCache = /* @__PURE__ */ new WeakMap;
7
+ var __toCommonJS = (from) => {
8
+ var entry = __moduleCache.get(from), desc;
9
+ if (entry)
10
+ return entry;
11
+ entry = __defProp({}, "__esModule", { value: true });
12
+ if (from && typeof from === "object" || typeof from === "function")
13
+ __getOwnPropNames(from).map((key) => !__hasOwnProp.call(entry, key) && __defProp(entry, key, {
14
+ get: () => from[key],
15
+ enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
16
+ }));
17
+ __moduleCache.set(from, entry);
18
+ return entry;
19
+ };
20
+ var __export = (target, all) => {
21
+ for (var name in all)
22
+ __defProp(target, name, {
23
+ get: all[name],
24
+ enumerable: true,
25
+ configurable: true,
26
+ set: (newValue) => all[name] = () => newValue
27
+ });
28
+ };
29
+
30
+ // src/adapters.ts
31
+ var exports_adapters = {};
32
+ __export(exports_adapters, {
33
+ adapterTodoList: () => adapterTodoList
34
+ });
35
+ module.exports = __toCommonJS(exports_adapters);
36
+ var adapterTodoList = [
37
+ "prismaAdapter (TODO)",
38
+ "drizzleAdapter (TODO)"
39
+ ];
@@ -0,0 +1,8 @@
1
+ // src/adapters.ts
2
+ var adapterTodoList = [
3
+ "prismaAdapter (TODO)",
4
+ "drizzleAdapter (TODO)"
5
+ ];
6
+ export {
7
+ adapterTodoList
8
+ };
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Locallytics - Analytics built around a database-first API.
3
+ * @packageDocumentation
4
+ */
5
+ type LocallyticsEvent = {
6
+ id?: string | number;
7
+ type: string;
8
+ timestamp: number;
9
+ sessionId?: string;
10
+ userId?: string;
11
+ metadata?: Record<string, unknown>;
12
+ };
13
+ type ClientQueryResult = {
14
+ events: LocallyticsEvent[];
15
+ loading: boolean;
16
+ error: Error | null;
17
+ refresh: () => Promise<LocallyticsEvent[]>;
18
+ };
19
+ type QueryResult = ClientQueryResult & PromiseLike<LocallyticsEvent[]>;
20
+ interface Locallytics {
21
+ track(type: string, metadata?: Record<string, unknown>): Promise<LocallyticsEvent>;
22
+ trackPageView(route?: string): Promise<LocallyticsEvent>;
23
+ query(): QueryResult;
24
+ setUserId(userId: string | undefined): void;
25
+ getUserId(): string | undefined;
26
+ getSessionId(): string | undefined;
27
+ subscribe(listener: () => void): () => void;
28
+ }
29
+ /**
30
+ * Track a page view.
31
+ */
32
+ declare function trackPageView2(locallytics: Locallytics, route?: string): Promise<void>;
33
+ /**
34
+ * Automatically track clicks.
35
+ */
36
+ declare function bindClickTracking(locallytics: Locallytics, target?: Window | Document): () => void;
37
+ /**
38
+ * Automatically track page views on SPA navigation.
39
+ */
40
+ declare function bindPageViewTracking(locallytics: Locallytics): () => void;
41
+ export { trackPageView2 as trackPageView, bindPageViewTracking, bindClickTracking };
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Locallytics - Analytics built around a database-first API.
3
+ * @packageDocumentation
4
+ */
5
+ type LocallyticsEvent = {
6
+ id?: string | number;
7
+ type: string;
8
+ timestamp: number;
9
+ sessionId?: string;
10
+ userId?: string;
11
+ metadata?: Record<string, unknown>;
12
+ };
13
+ type ClientQueryResult = {
14
+ events: LocallyticsEvent[];
15
+ loading: boolean;
16
+ error: Error | null;
17
+ refresh: () => Promise<LocallyticsEvent[]>;
18
+ };
19
+ type QueryResult = ClientQueryResult & PromiseLike<LocallyticsEvent[]>;
20
+ interface Locallytics {
21
+ track(type: string, metadata?: Record<string, unknown>): Promise<LocallyticsEvent>;
22
+ trackPageView(route?: string): Promise<LocallyticsEvent>;
23
+ query(): QueryResult;
24
+ setUserId(userId: string | undefined): void;
25
+ getUserId(): string | undefined;
26
+ getSessionId(): string | undefined;
27
+ subscribe(listener: () => void): () => void;
28
+ }
29
+ /**
30
+ * Track a page view.
31
+ */
32
+ declare function trackPageView2(locallytics: Locallytics, route?: string): Promise<void>;
33
+ /**
34
+ * Automatically track clicks.
35
+ */
36
+ declare function bindClickTracking(locallytics: Locallytics, target?: Window | Document): () => void;
37
+ /**
38
+ * Automatically track page views on SPA navigation.
39
+ */
40
+ declare function bindPageViewTracking(locallytics: Locallytics): () => void;
41
+ export { trackPageView2 as trackPageView, bindPageViewTracking, bindClickTracking };
@@ -0,0 +1,79 @@
1
+ var import_node_module = require("node:module");
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropNames = Object.getOwnPropertyNames;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __moduleCache = /* @__PURE__ */ new WeakMap;
7
+ var __toCommonJS = (from) => {
8
+ var entry = __moduleCache.get(from), desc;
9
+ if (entry)
10
+ return entry;
11
+ entry = __defProp({}, "__esModule", { value: true });
12
+ if (from && typeof from === "object" || typeof from === "function")
13
+ __getOwnPropNames(from).map((key) => !__hasOwnProp.call(entry, key) && __defProp(entry, key, {
14
+ get: () => from[key],
15
+ enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
16
+ }));
17
+ __moduleCache.set(from, entry);
18
+ return entry;
19
+ };
20
+ var __export = (target, all) => {
21
+ for (var name in all)
22
+ __defProp(target, name, {
23
+ get: all[name],
24
+ enumerable: true,
25
+ configurable: true,
26
+ set: (newValue) => all[name] = () => newValue
27
+ });
28
+ };
29
+
30
+ // src/browser.ts
31
+ var exports_browser = {};
32
+ __export(exports_browser, {
33
+ trackPageView: () => trackPageView,
34
+ bindPageViewTracking: () => bindPageViewTracking,
35
+ bindClickTracking: () => bindClickTracking
36
+ });
37
+ module.exports = __toCommonJS(exports_browser);
38
+ function trackPageView(locallytics, route) {
39
+ return locallytics.trackPageView(route).then(() => {
40
+ return;
41
+ });
42
+ }
43
+ function bindClickTracking(locallytics, target = window) {
44
+ const handler = (event) => {
45
+ const element = event.target;
46
+ locallytics.track("click", {
47
+ tag: element?.tagName,
48
+ id: element?.id,
49
+ classes: element?.className,
50
+ text: element?.textContent?.trim().slice(0, 100)
51
+ });
52
+ };
53
+ target.addEventListener("click", handler);
54
+ return () => {
55
+ target.removeEventListener("click", handler);
56
+ };
57
+ }
58
+ function bindPageViewTracking(locallytics) {
59
+ trackPageView(locallytics);
60
+ const popstateHandler = () => {
61
+ trackPageView(locallytics);
62
+ };
63
+ const originalPushState = history.pushState;
64
+ const originalReplaceState = history.replaceState;
65
+ history.pushState = function(...args) {
66
+ originalPushState.apply(this, args);
67
+ trackPageView(locallytics);
68
+ };
69
+ history.replaceState = function(...args) {
70
+ originalReplaceState.apply(this, args);
71
+ trackPageView(locallytics);
72
+ };
73
+ window.addEventListener("popstate", popstateHandler);
74
+ return () => {
75
+ window.removeEventListener("popstate", popstateHandler);
76
+ history.pushState = originalPushState;
77
+ history.replaceState = originalReplaceState;
78
+ };
79
+ }
@@ -0,0 +1,10 @@
1
+ import {
2
+ bindClickTracking,
3
+ bindPageViewTracking,
4
+ trackPageView
5
+ } from "./shared/chunk-8tbv1rg5.js";
6
+ export {
7
+ trackPageView,
8
+ bindPageViewTracking,
9
+ bindClickTracking
10
+ };
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Locallytics - Analytics built around a database-first API.
3
+ * @packageDocumentation
4
+ */
5
+ type LocallyticsEvent = {
6
+ id?: string | number;
7
+ type: string;
8
+ timestamp: number;
9
+ sessionId?: string;
10
+ userId?: string;
11
+ metadata?: Record<string, unknown>;
12
+ };
13
+ interface DatabaseAdapter {
14
+ initialize?(): Promise<void> | void;
15
+ insertEvent(event: Omit<LocallyticsEvent, "id">): Promise<LocallyticsEvent>;
16
+ findEvents(): Promise<LocallyticsEvent[]>;
17
+ }
18
+ type PostgresLikeDatabase = {
19
+ query: (sql: string, params?: unknown[]) => Promise<{
20
+ rows: Record<string, unknown>[];
21
+ }>;
22
+ };
23
+ type MysqlLikeDatabase = {
24
+ execute: (sql: string, params?: unknown[]) => Promise<[unknown, unknown]>;
25
+ };
26
+ type SqliteLikeStatement = {
27
+ run: (...params: unknown[]) => {
28
+ lastInsertRowid?: number | bigint;
29
+ };
30
+ all: (...params: unknown[]) => Record<string, unknown>[];
31
+ get?: (...params: unknown[]) => Record<string, unknown> | undefined;
32
+ };
33
+ type SqliteLikeDatabase = {
34
+ prepare: (sql: string) => SqliteLikeStatement;
35
+ };
36
+ type SupportedDatabase = DatabaseAdapter | PostgresLikeDatabase | MysqlLikeDatabase | SqliteLikeDatabase;
37
+ type LocallyticsConfig = {
38
+ database: SupportedDatabase;
39
+ sessionTracking?: boolean;
40
+ userId?: string;
41
+ };
42
+ type ClientQueryResult = {
43
+ events: LocallyticsEvent[];
44
+ loading: boolean;
45
+ error: Error | null;
46
+ refresh: () => Promise<LocallyticsEvent[]>;
47
+ };
48
+ type QueryResult = ClientQueryResult & PromiseLike<LocallyticsEvent[]>;
49
+ interface Locallytics {
50
+ track(type: string, metadata?: Record<string, unknown>): Promise<LocallyticsEvent>;
51
+ trackPageView(route?: string): Promise<LocallyticsEvent>;
52
+ query(): QueryResult;
53
+ setUserId(userId: string | undefined): void;
54
+ getUserId(): string | undefined;
55
+ getSessionId(): string | undefined;
56
+ subscribe(listener: () => void): () => void;
57
+ }
58
+ declare function createLocallytics(config: LocallyticsConfig): Locallytics;
59
+ export { createLocallytics, SupportedDatabase, SqliteLikeStatement, SqliteLikeDatabase, QueryResult, PostgresLikeDatabase, MysqlLikeDatabase, LocallyticsEvent, LocallyticsConfig, Locallytics, DatabaseAdapter, ClientQueryResult };
package/dist/index.d.ts CHANGED
@@ -1,6 +1,59 @@
1
- export { LocallyticsGrabber } from "./client/LocallyticsGrabber.js";
2
- export { createDatabase } from "./db/factory.js";
3
- export { LocallyticsData, locallytics } from "./server/index.js";
4
- export type { AnalyticsDataOptions, AnalyticsDB, AnalyticsResult, DailyStats, DateRange, LocallyticsConfig, PageStats, PageviewEvent, } from "./types/index.js";
5
- export { LocallyticsError } from "./types/index.js";
6
- //# sourceMappingURL=index.d.ts.map
1
+ /**
2
+ * Locallytics - Analytics built around a database-first API.
3
+ * @packageDocumentation
4
+ */
5
+ type LocallyticsEvent = {
6
+ id?: string | number;
7
+ type: string;
8
+ timestamp: number;
9
+ sessionId?: string;
10
+ userId?: string;
11
+ metadata?: Record<string, unknown>;
12
+ };
13
+ interface DatabaseAdapter {
14
+ initialize?(): Promise<void> | void;
15
+ insertEvent(event: Omit<LocallyticsEvent, "id">): Promise<LocallyticsEvent>;
16
+ findEvents(): Promise<LocallyticsEvent[]>;
17
+ }
18
+ type PostgresLikeDatabase = {
19
+ query: (sql: string, params?: unknown[]) => Promise<{
20
+ rows: Record<string, unknown>[];
21
+ }>;
22
+ };
23
+ type MysqlLikeDatabase = {
24
+ execute: (sql: string, params?: unknown[]) => Promise<[unknown, unknown]>;
25
+ };
26
+ type SqliteLikeStatement = {
27
+ run: (...params: unknown[]) => {
28
+ lastInsertRowid?: number | bigint;
29
+ };
30
+ all: (...params: unknown[]) => Record<string, unknown>[];
31
+ get?: (...params: unknown[]) => Record<string, unknown> | undefined;
32
+ };
33
+ type SqliteLikeDatabase = {
34
+ prepare: (sql: string) => SqliteLikeStatement;
35
+ };
36
+ type SupportedDatabase = DatabaseAdapter | PostgresLikeDatabase | MysqlLikeDatabase | SqliteLikeDatabase;
37
+ type LocallyticsConfig = {
38
+ database: SupportedDatabase;
39
+ sessionTracking?: boolean;
40
+ userId?: string;
41
+ };
42
+ type ClientQueryResult = {
43
+ events: LocallyticsEvent[];
44
+ loading: boolean;
45
+ error: Error | null;
46
+ refresh: () => Promise<LocallyticsEvent[]>;
47
+ };
48
+ type QueryResult = ClientQueryResult & PromiseLike<LocallyticsEvent[]>;
49
+ interface Locallytics {
50
+ track(type: string, metadata?: Record<string, unknown>): Promise<LocallyticsEvent>;
51
+ trackPageView(route?: string): Promise<LocallyticsEvent>;
52
+ query(): QueryResult;
53
+ setUserId(userId: string | undefined): void;
54
+ getUserId(): string | undefined;
55
+ getSessionId(): string | undefined;
56
+ subscribe(listener: () => void): () => void;
57
+ }
58
+ declare function createLocallytics(config: LocallyticsConfig): Locallytics;
59
+ export { createLocallytics, SupportedDatabase, SqliteLikeStatement, SqliteLikeDatabase, QueryResult, PostgresLikeDatabase, MysqlLikeDatabase, LocallyticsEvent, LocallyticsConfig, Locallytics, DatabaseAdapter, ClientQueryResult };