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.
- package/dist/adapters/drizzle.d.mts +25 -0
- package/dist/adapters/drizzle.d.ts +25 -0
- package/dist/adapters/drizzle.js +38 -0
- package/dist/adapters/drizzle.mjs +7 -0
- package/dist/adapters/prisma.d.mts +25 -0
- package/dist/adapters/prisma.d.ts +25 -0
- package/dist/adapters/prisma.js +38 -0
- package/dist/adapters/prisma.mjs +7 -0
- package/dist/adapters.d.mts +7 -0
- package/dist/adapters.d.ts +7 -0
- package/dist/adapters.js +39 -0
- package/dist/adapters.mjs +8 -0
- package/dist/browser.d.mts +41 -0
- package/dist/browser.d.ts +41 -0
- package/dist/browser.js +79 -0
- package/dist/browser.mjs +10 -0
- package/dist/index.d.mts +59 -0
- package/dist/index.d.ts +59 -6
- package/dist/index.js +367 -7
- package/dist/index.mjs +336 -0
- package/dist/react.d.mts +48 -0
- package/dist/react.d.ts +48 -0
- package/dist/react.js +132 -0
- package/dist/react.mjs +61 -0
- package/dist/shared/chunk-8tbv1rg5.js +45 -0
- package/package.json +60 -48
- package/README.md +0 -73
- package/dist/client/LocallyticsGrabber.d.ts +0 -30
- package/dist/client/LocallyticsGrabber.d.ts.map +0 -1
- package/dist/client/LocallyticsGrabber.js +0 -71
- package/dist/client/LocallyticsGrabber.js.map +0 -1
- package/dist/client/batcher.d.ts +0 -48
- package/dist/client/batcher.d.ts.map +0 -1
- package/dist/client/batcher.js +0 -134
- package/dist/client/batcher.js.map +0 -1
- package/dist/client/tracker.d.ts +0 -18
- package/dist/client/tracker.d.ts.map +0 -1
- package/dist/client/tracker.js +0 -101
- package/dist/client/tracker.js.map +0 -1
- package/dist/db/factory.d.ts +0 -11
- package/dist/db/factory.d.ts.map +0 -1
- package/dist/db/factory.js +0 -46
- package/dist/db/factory.js.map +0 -1
- package/dist/db/mysql.d.ts +0 -17
- package/dist/db/mysql.d.ts.map +0 -1
- package/dist/db/mysql.js +0 -144
- package/dist/db/mysql.js.map +0 -1
- package/dist/db/postgres.d.ts +0 -16
- package/dist/db/postgres.d.ts.map +0 -1
- package/dist/db/postgres.js +0 -142
- package/dist/db/postgres.js.map +0 -1
- package/dist/db/sqlite.d.ts +0 -17
- package/dist/db/sqlite.d.ts.map +0 -1
- package/dist/db/sqlite.js +0 -130
- package/dist/db/sqlite.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/server/handlers.d.ts +0 -10
- package/dist/server/handlers.d.ts.map +0 -1
- package/dist/server/handlers.js +0 -96
- package/dist/server/handlers.js.map +0 -1
- package/dist/server/index.d.ts +0 -42
- package/dist/server/index.d.ts.map +0 -1
- package/dist/server/index.js +0 -96
- package/dist/server/index.js.map +0 -1
- package/dist/server/queries.d.ts +0 -10
- package/dist/server/queries.d.ts.map +0 -1
- package/dist/server/queries.js +0 -24
- package/dist/server/queries.js.map +0 -1
- package/dist/server/validator.d.ts +0 -32
- package/dist/server/validator.d.ts.map +0 -1
- package/dist/server/validator.js +0 -129
- package/dist/server/validator.js.map +0 -1
- package/dist/types/index.d.ts +0 -135
- package/dist/types/index.d.ts.map +0 -1
- package/dist/types/index.js +0 -24
- package/dist/types/index.js.map +0 -1
- package/dist/utils/hash.d.ts +0 -16
- package/dist/utils/hash.d.ts.map +0 -1
- package/dist/utils/hash.js +0 -36
- package/dist/utils/hash.js.map +0 -1
- package/dist/utils/rate-limit.d.ts +0 -32
- package/dist/utils/rate-limit.d.ts.map +0 -1
- package/dist/utils/rate-limit.js +0 -73
- package/dist/utils/rate-limit.js.map +0 -1
- package/src/db/schema-mysql.sql +0 -17
- package/src/db/schema-sqlite.sql +0 -29
- 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,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
|
+
}
|
package/dist/adapters.js
ADDED
|
@@ -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,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 };
|
package/dist/browser.js
ADDED
|
@@ -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
|
+
}
|
package/dist/browser.mjs
ADDED
package/dist/index.d.mts
ADDED
|
@@ -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
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
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 };
|