@visitor-analytics-sdk/utils 1.0.0 → 1.0.1

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 ADDED
@@ -0,0 +1,24 @@
1
+ # @visitor-analytics-sdk/utils
2
+
3
+ Shared utilities for the visitor-analytics SDK — ID generation, browser detection, idle callbacks, SDK versioning, and type definitions.
4
+
5
+ ```bash
6
+ npm install @visitor-analytics-sdk/utils
7
+ ```
8
+
9
+ ## Utilities
10
+
11
+ | Export | Description |
12
+ |---|---|
13
+ | `generateId()` | Unique ID generator (crypto-based) |
14
+ | `isBrowser()` | Runtime environment detection |
15
+ | `requestIdle(fn)` | `requestIdleCallback` wrapper |
16
+ | `SDK_VERSION` | Current SDK version string |
17
+ | `deepFreeze(obj)` | Recursive `Object.freeze` |
18
+ | `EventBus` | Typed event emitter |
19
+ | `AnalyticsEvent` | Event type definitions |
20
+ | `StorageType` | Storage backend type union |
21
+
22
+ ## License
23
+
24
+ MIT
package/dist/index.d.ts CHANGED
@@ -1,3 +1,6 @@
1
+ type AnalyticsEvent = "start" | "stop" | "flush" | "sync" | "record-collected" | "batch-uploaded" | "batch-failed" | "error" | "collector-registered" | "collector-removed" | "plugin-installed" | "plugin-uninstalled" | "storage-saved" | "storage-loaded" | "config-changed";
2
+ type StorageType = "memory" | "localstorage" | "indexeddb";
3
+
1
4
  declare const SDK_VERSION = "1.0.0";
2
5
  declare function generateId(): string;
3
6
  declare function generateShortId(): string;
@@ -11,9 +14,17 @@ declare function safeCall<T>(fn: () => T, fallback: T): T;
11
14
  declare function safeCallAsync<T>(fn: () => Promise<T>, fallback: T): Promise<T>;
12
15
  declare function requestIdle(callback: () => void, timeout?: number): void;
13
16
  declare function deepFreeze<T extends object>(obj: T): Readonly<T>;
14
- declare function cloneRecord<T>(record: T): T;
15
17
  declare function isBrowser(): boolean;
16
- declare function noop(): void;
17
- declare function padZero(n: number): string;
18
18
 
19
- export { SDK_VERSION, cloneRecord, debounce, deepFreeze, generateId, generateShortId, isBrowser, noop, padZero, requestIdle, safeCall, safeCallAsync, throttle };
19
+ type Handler = (...args: readonly unknown[]) => void;
20
+ declare class EventBus {
21
+ private readonly listeners;
22
+ on(event: AnalyticsEvent, handler: Handler): void;
23
+ off(event: AnalyticsEvent, handler: Handler): void;
24
+ emit(event: AnalyticsEvent, ...args: readonly unknown[]): void;
25
+ removeAllListeners(event?: AnalyticsEvent): void;
26
+ listenerCount(event: AnalyticsEvent): number;
27
+ }
28
+ declare function detectBestStorage(): StorageType;
29
+
30
+ export { type AnalyticsEvent, EventBus, SDK_VERSION, type StorageType, debounce, deepFreeze, detectBestStorage, generateId, generateShortId, isBrowser, requestIdle, safeCall, safeCallAsync, throttle };
package/dist/index.js CHANGED
@@ -92,29 +92,59 @@ function deepFreeze(obj) {
92
92
  }
93
93
  return obj;
94
94
  }
95
- function cloneRecord(record) {
96
- return JSON.parse(JSON.stringify(record));
97
- }
98
95
  function isBrowser() {
99
96
  return typeof window !== "undefined" && typeof document !== "undefined" && typeof navigator !== "undefined";
100
97
  }
101
- function noop() {
102
- }
103
- function padZero(n) {
104
- return n < 10 ? `0${n}` : `${n}`;
105
- }
106
- export {
107
- SDK_VERSION,
108
- cloneRecord,
109
- debounce,
110
- deepFreeze,
111
- generateId,
112
- generateShortId,
113
- isBrowser,
114
- noop,
115
- padZero,
116
- requestIdle,
117
- safeCall,
118
- safeCallAsync,
119
- throttle
98
+ var EventBus = class {
99
+ listeners = /* @__PURE__ */ new Map();
100
+ on(event, handler) {
101
+ let set = this.listeners.get(event);
102
+ if (!set) {
103
+ set = /* @__PURE__ */ new Set();
104
+ this.listeners.set(event, set);
105
+ }
106
+ set.add(handler);
107
+ }
108
+ off(event, handler) {
109
+ this.listeners.get(event)?.delete(handler);
110
+ }
111
+ emit(event, ...args) {
112
+ const set = this.listeners.get(event);
113
+ if (!set) return;
114
+ for (const handler of set) {
115
+ try {
116
+ handler(...args);
117
+ } catch (_err) {
118
+ }
119
+ }
120
+ }
121
+ removeAllListeners(event) {
122
+ if (event) {
123
+ this.listeners.delete(event);
124
+ } else {
125
+ this.listeners.clear();
126
+ }
127
+ }
128
+ listenerCount(event) {
129
+ return this.listeners.get(event)?.size ?? 0;
130
+ }
120
131
  };
132
+ function detectBestStorage() {
133
+ if (typeof window === "undefined") return "memory";
134
+ try {
135
+ if (typeof indexedDB !== "undefined") return "indexeddb";
136
+ } catch {
137
+ }
138
+ try {
139
+ if (typeof localStorage !== "undefined") {
140
+ const testKey = "__va_storage_test__";
141
+ localStorage.setItem(testKey, "1");
142
+ localStorage.removeItem(testKey);
143
+ return "localstorage";
144
+ }
145
+ } catch {
146
+ }
147
+ return "memory";
148
+ }
149
+
150
+ export { EventBus, SDK_VERSION, debounce, deepFreeze, detectBestStorage, generateId, generateShortId, isBrowser, requestIdle, safeCall, safeCallAsync, throttle };
package/package.json CHANGED
@@ -1,10 +1,30 @@
1
1
  {
2
2
  "name": "@visitor-analytics-sdk/utils",
3
- "version": "1.0.0",
3
+ "description": "Shared utilities for the visitor-analytics SDK — ID generation, browser detection, idle callbacks, SDK versioning, and type definitions.",
4
+ "license": "MIT",
5
+ "keywords": [
6
+ "visitor-analytics",
7
+ "utilities",
8
+ "helpers",
9
+ "typescript",
10
+ "sdk"
11
+ ],
12
+ "repository": {
13
+ "type": "git",
14
+ "url": "git+https://github.com/instax-dutta/visitor-analytics.git"
15
+ },
16
+ "homepage": "https://github.com/instax-dutta/visitor-analytics#readme",
17
+ "bugs": {
18
+ "url": "https://github.com/instax-dutta/visitor-analytics/issues"
19
+ },
20
+ "version": "1.0.1",
4
21
  "type": "module",
5
22
  "main": "dist/index.js",
6
23
  "module": "dist/index.js",
7
24
  "types": "dist/index.d.ts",
25
+ "publishConfig": {
26
+ "access": "public"
27
+ },
8
28
  "exports": {
9
29
  ".": {
10
30
  "import": "./dist/index.js",
@@ -14,8 +34,12 @@
14
34
  "files": [
15
35
  "dist"
16
36
  ],
37
+ "devDependencies": {
38
+ "typescript": "^5.4.0",
39
+ "tsup": "^8.0.0"
40
+ },
17
41
  "scripts": {
18
- "build": "tsup src/index.ts --format esm --dts",
42
+ "build": "tsup src/index.ts --format esm --dts --treeshake",
19
43
  "typecheck": "tsc --noEmit"
20
44
  }
21
45
  }