@attributehq/web-sdk 1.0.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/LICENSE +21 -0
- package/README.md +240 -0
- package/dist/attribution.cjs.js +2 -0
- package/dist/attribution.cjs.js.map +1 -0
- package/dist/attribution.esm.js +2 -0
- package/dist/attribution.esm.js.map +1 -0
- package/dist/attribution.umd.js +2 -0
- package/dist/attribution.umd.js.map +1 -0
- package/dist/index.d.ts +70 -0
- package/package.json +61 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 AttributeHQ
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
# @attributehq/web-sdk
|
|
2
|
+
|
|
3
|
+
Lightweight web attribution SDK for [AttributeHQ](https://attributehq.com) — track installs, events, and revenue with automatic attribution.
|
|
4
|
+
|
|
5
|
+
**~2.9 KB gzipped** | Zero dependencies | TypeScript-first
|
|
6
|
+
|
|
7
|
+
## Install
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
# npm
|
|
11
|
+
npm install @attributehq/web-sdk
|
|
12
|
+
|
|
13
|
+
# yarn
|
|
14
|
+
yarn add @attributehq/web-sdk
|
|
15
|
+
|
|
16
|
+
# pnpm
|
|
17
|
+
pnpm add @attributehq/web-sdk
|
|
18
|
+
|
|
19
|
+
# bun
|
|
20
|
+
bun add @attributehq/web-sdk
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
### CDN (script tag)
|
|
24
|
+
|
|
25
|
+
```html
|
|
26
|
+
<script src="https://unpkg.com/@attributehq/web-sdk@1/dist/attribution.umd.js"></script>
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
Or via jsDelivr:
|
|
30
|
+
|
|
31
|
+
```html
|
|
32
|
+
<script src="https://cdn.jsdelivr.net/npm/@attributehq/web-sdk@1/dist/attribution.umd.js"></script>
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## Quick Start
|
|
36
|
+
|
|
37
|
+
```javascript
|
|
38
|
+
import { init, track, trackRevenue } from '@attributehq/web-sdk';
|
|
39
|
+
|
|
40
|
+
// Initialize (do this once, as early as possible)
|
|
41
|
+
init({
|
|
42
|
+
apiKey: 'ak_your_api_key',
|
|
43
|
+
appId: 'your-app-uuid',
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
// Track custom events
|
|
47
|
+
track('signup_completed', { method: 'email' });
|
|
48
|
+
|
|
49
|
+
// Track revenue
|
|
50
|
+
trackRevenue(2500, 'NGN', { plan: 'premium' });
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
### CDN / UMD usage
|
|
54
|
+
|
|
55
|
+
```html
|
|
56
|
+
<script src="https://unpkg.com/@attributehq/web-sdk@1/dist/attribution.umd.js"></script>
|
|
57
|
+
<script>
|
|
58
|
+
AttributionSDK.init({
|
|
59
|
+
apiKey: 'ak_your_api_key',
|
|
60
|
+
appId: 'your-app-uuid',
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
AttributionSDK.track('button_click', { button: 'cta' });
|
|
64
|
+
</script>
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
## API Reference
|
|
68
|
+
|
|
69
|
+
### `init(config)`
|
|
70
|
+
|
|
71
|
+
Initialize the SDK. Must be called before any other method. Automatically tracks the first visit as an install and begins page view tracking.
|
|
72
|
+
|
|
73
|
+
```typescript
|
|
74
|
+
init({
|
|
75
|
+
apiKey: string; // Required — your API key (format: ak_xxx)
|
|
76
|
+
appId: string; // Required — your app UUID
|
|
77
|
+
baseUrl?: string; // API base URL (default: https://attributehq.com)
|
|
78
|
+
batchSize?: number; // Events per batch before auto-flush (default: 10)
|
|
79
|
+
flushInterval?: number; // Auto-flush interval in ms (default: 5000)
|
|
80
|
+
maxQueueSize?: number; // Max events in offline queue (default: 100)
|
|
81
|
+
autoTrackPageViews?: boolean; // Track page views + SPA navigation (default: true)
|
|
82
|
+
debug?: boolean; // Enable console debug logging (default: false)
|
|
83
|
+
});
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
### `track(eventName, properties?)`
|
|
87
|
+
|
|
88
|
+
Track a custom event.
|
|
89
|
+
|
|
90
|
+
```javascript
|
|
91
|
+
track('level_completed', { level: 5, score: 1200 });
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
### `trackPageView(properties?)`
|
|
95
|
+
|
|
96
|
+
Manually track a page view. Called automatically if `autoTrackPageViews` is enabled.
|
|
97
|
+
|
|
98
|
+
```javascript
|
|
99
|
+
trackPageView({ section: 'pricing' });
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
### `trackRevenue(amount, currency?, properties?)`
|
|
103
|
+
|
|
104
|
+
Track a revenue event. Currency defaults to `'NGN'`.
|
|
105
|
+
|
|
106
|
+
```javascript
|
|
107
|
+
trackRevenue(5000, 'NGN', { product_id: 'plan_premium' });
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
### `identify(userId, properties?)`
|
|
111
|
+
|
|
112
|
+
Associate events with a known user (e.g. after login).
|
|
113
|
+
|
|
114
|
+
```javascript
|
|
115
|
+
identify('user_12345', { email: 'user@example.com', plan: 'premium' });
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
### `flush()`
|
|
119
|
+
|
|
120
|
+
Manually flush all queued events to the server.
|
|
121
|
+
|
|
122
|
+
```javascript
|
|
123
|
+
flush();
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
### `getAttribution()`
|
|
127
|
+
|
|
128
|
+
Get the cached attribution result from the initial install tracking. Returns `null` if not yet available.
|
|
129
|
+
|
|
130
|
+
```typescript
|
|
131
|
+
const result = getAttribution();
|
|
132
|
+
// {
|
|
133
|
+
// matchType: 'fingerprint' | 'device_id' | 'organic',
|
|
134
|
+
// confidence: 85,
|
|
135
|
+
// mediaSource: 'facebook',
|
|
136
|
+
// campaignId: 'summer_promo',
|
|
137
|
+
// isOrganic: false,
|
|
138
|
+
// attributedTouchTime: 1706745600000
|
|
139
|
+
// }
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
## Configuration Options
|
|
143
|
+
|
|
144
|
+
| Option | Type | Default | Description |
|
|
145
|
+
|--------|------|---------|-------------|
|
|
146
|
+
| `apiKey` | `string` | — | **Required.** API key from your dashboard |
|
|
147
|
+
| `appId` | `string` | — | **Required.** App UUID from your dashboard |
|
|
148
|
+
| `baseUrl` | `string` | `https://attributehq.com` | API base URL |
|
|
149
|
+
| `batchSize` | `number` | `10` | Events per batch before auto-flush |
|
|
150
|
+
| `flushInterval` | `number` | `5000` | Auto-flush interval in milliseconds |
|
|
151
|
+
| `maxQueueSize` | `number` | `100` | Max events stored offline |
|
|
152
|
+
| `autoTrackPageViews` | `boolean` | `true` | Auto-track page views and SPA navigation |
|
|
153
|
+
| `debug` | `boolean` | `false` | Log debug info to console |
|
|
154
|
+
|
|
155
|
+
## Framework Examples
|
|
156
|
+
|
|
157
|
+
### React
|
|
158
|
+
|
|
159
|
+
```jsx
|
|
160
|
+
// app/layout.tsx or _app.tsx
|
|
161
|
+
import { init } from '@attributehq/web-sdk';
|
|
162
|
+
|
|
163
|
+
if (typeof window !== 'undefined') {
|
|
164
|
+
init({
|
|
165
|
+
apiKey: process.env.NEXT_PUBLIC_ATTRIBUTION_KEY,
|
|
166
|
+
appId: process.env.NEXT_PUBLIC_ATTRIBUTION_APP_ID,
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
```jsx
|
|
172
|
+
// In any component
|
|
173
|
+
import { track, trackRevenue } from '@attributehq/web-sdk';
|
|
174
|
+
|
|
175
|
+
function CheckoutButton({ amount }) {
|
|
176
|
+
const handleClick = () => {
|
|
177
|
+
trackRevenue(amount, 'NGN', { source: 'checkout' });
|
|
178
|
+
};
|
|
179
|
+
return <button onClick={handleClick}>Pay</button>;
|
|
180
|
+
}
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
### Next.js (App Router)
|
|
184
|
+
|
|
185
|
+
```tsx
|
|
186
|
+
// app/providers.tsx
|
|
187
|
+
'use client';
|
|
188
|
+
|
|
189
|
+
import { useEffect } from 'react';
|
|
190
|
+
import { init } from '@attributehq/web-sdk';
|
|
191
|
+
|
|
192
|
+
export function AttributionProvider({ children }) {
|
|
193
|
+
useEffect(() => {
|
|
194
|
+
init({
|
|
195
|
+
apiKey: process.env.NEXT_PUBLIC_ATTRIBUTION_KEY!,
|
|
196
|
+
appId: process.env.NEXT_PUBLIC_ATTRIBUTION_APP_ID!,
|
|
197
|
+
});
|
|
198
|
+
}, []);
|
|
199
|
+
|
|
200
|
+
return <>{children}</>;
|
|
201
|
+
}
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
### Vanilla JavaScript
|
|
205
|
+
|
|
206
|
+
```html
|
|
207
|
+
<script src="https://unpkg.com/@attributehq/web-sdk@1/dist/attribution.umd.js"></script>
|
|
208
|
+
<script>
|
|
209
|
+
AttributionSDK.init({
|
|
210
|
+
apiKey: 'ak_your_api_key',
|
|
211
|
+
appId: 'your-app-uuid',
|
|
212
|
+
});
|
|
213
|
+
|
|
214
|
+
document.getElementById('signup-btn').addEventListener('click', function () {
|
|
215
|
+
AttributionSDK.track('signup_click');
|
|
216
|
+
});
|
|
217
|
+
</script>
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
## TypeScript
|
|
221
|
+
|
|
222
|
+
Full type definitions are included. Import types directly:
|
|
223
|
+
|
|
224
|
+
```typescript
|
|
225
|
+
import type { SDKConfig, AttributionResult, DeviceInfo, QueuedEvent } from '@attributehq/web-sdk';
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
## How It Works
|
|
229
|
+
|
|
230
|
+
1. **Install detection** — On first page load, the SDK sends device info to the attribution API, which matches it against stored ad clicks using fingerprinting or device ID. The result is cached in localStorage.
|
|
231
|
+
|
|
232
|
+
2. **Event batching** — Events are queued in localStorage and flushed in batches (default: every 10 events or 5 seconds). If the network is unavailable, events are stored offline and sent when connectivity returns.
|
|
233
|
+
|
|
234
|
+
3. **Page unload** — On page close, remaining events are sent via `navigator.sendBeacon` to ensure delivery.
|
|
235
|
+
|
|
236
|
+
4. **SPA support** — The SDK patches `history.pushState` and `history.replaceState` to automatically track page views in single-page applications.
|
|
237
|
+
|
|
238
|
+
## License
|
|
239
|
+
|
|
240
|
+
[MIT](./LICENSE)
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});const t='"1.0.0"',e=10,i=5e3,s=100,n=!0,r=!1;const a="[AttributionSDK]";let o=!1;function u(...t){o&&console.log(a,...t)}function h(...t){console.warn(a,...t)}function c(...t){console.error(a,...t)}const l="__ahq_";let d=null;function p(){return d||("undefined"!=typeof localStorage&&function(){try{const t=l+"test";return localStorage.setItem(t,"1"),localStorage.removeItem(t),!0}catch{return!1}}()?localStorage:(d=new Map,d))}const f={get(t){const e=p(),i=l+t;return e instanceof Map?e.get(i)??null:e.getItem(i)},set(t,e){const i=p(),s=l+t;i instanceof Map?i.set(s,e):i.setItem(s,e)},remove(t){const e=p(),i=l+t;e instanceof Map?e.delete(i):e.removeItem(i)}};let g=null;async function y(t,e){if(!g)return h("Network not configured"),null;const i=`${g.baseUrl}${t}`;try{const s=await fetch(i,{method:"POST",headers:{"Content-Type":"application/json","X-API-Key":g.apiKey},body:JSON.stringify(e)});return s.ok?await s.json():(h(`POST ${t} failed: ${s.status}`),null)}catch(e){return c(`POST ${t} error:`,e),null}}function v(){try{return`${screen.width}x${screen.height}`}catch{return""}}function m(){try{return Intl.DateTimeFormat().resolvedOptions().timeZone}catch{return""}}function w(){try{return navigator.language||""}catch{return""}}function I(){try{const t=navigator;return t.userAgentData?.platform?t.userAgentData.platform:navigator.platform||""}catch{return""}}const x=18e5;function b(){try{return crypto.randomUUID()}catch{return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,t=>{const e=16*Math.random()|0;return("x"===t?e:3&e|8).toString(16)})}}class S{constructor(){const t=f.get("session_id"),e=f.get("session_start");if(t&&e){if(Date.now()-Number(e)<x)return this.sessionId=t,this.lastActivity=Number(e),void(this.pageViews=Number(f.get("session_pvs")||"0"))}this.sessionId=b(),this.lastActivity=Date.now(),this.pageViews=0,this.persist(),u("New session started",this.sessionId)}getSessionId(){return Date.now()-this.lastActivity>x&&(this.sessionId=b(),this.pageViews=0,u("Session rotated (timeout)",this.sessionId)),this.lastActivity=Date.now(),this.persist(),this.sessionId}incrementPageViews(){return this.pageViews++,f.set("session_pvs",String(this.pageViews)),this.pageViews}persist(){f.set("session_id",this.sessionId),f.set("session_start",String(this.lastActivity))}}const k="queue";class q{constructor(t){this.queue=[],this.timer=null,this.flushing=!1,this.config=t,this.restore(),this.startFlushTimer(),this.setupUnloadHandlers()}enqueue(t){for(this.queue.push(t);this.queue.length>this.config.maxQueueSize;)this.queue.shift();this.persist(),u("Event queued:",t.event_name,`(${this.queue.length} pending)`),this.queue.length>=this.config.batchSize&&this.flush()}async flush(){if(this.flushing||0===this.queue.length)return;this.flushing=!0;const e=this.queue.splice(0,this.config.batchSize);this.persist();const i={app_id:this.config.appId,events:e,sdk_version:t};try{await y("/api/v1/events",i)?u(`Flushed ${e.length} events`):(this.queue.unshift(...e),this.persist(),h("Flush failed, events re-queued"))}catch(t){this.queue.unshift(...e),this.persist(),c("Flush error:",t)}finally{this.flushing=!1}}flushBeacon(){if(0===this.queue.length)return;!function(t,e){if(!g)return;const i=`${g.baseUrl}${t}`,s=JSON.stringify({...e,_api_key:g.apiKey});try{return void fetch(i,{method:"POST",headers:{"Content-Type":"application/json","X-API-Key":g.apiKey},body:s,keepalive:!0}).catch(()=>{})}catch{}try{navigator.sendBeacon(i,new Blob([s],{type:"application/json"}))}catch{h("Both keepalive and sendBeacon failed")}}("/api/v1/events",{app_id:this.config.appId,events:this.queue,sdk_version:t}),this.queue=[],this.persist(),u("Beacon flush sent")}destroy(){this.timer&&(clearInterval(this.timer),this.timer=null)}startFlushTimer(){this.timer=setInterval(()=>{this.flush()},this.config.flushInterval)}setupUnloadHandlers(){"undefined"!=typeof document&&(document.addEventListener("visibilitychange",()=>{"hidden"===document.visibilityState&&this.flushBeacon()}),window.addEventListener("beforeunload",()=>{this.flushBeacon()}))}persist(){try{f.set(k,JSON.stringify(this.queue))}catch{}}restore(){try{const t=f.get(k);t&&(this.queue=JSON.parse(t),u(`Restored ${this.queue.length} queued events`))}catch{this.queue=[]}}}const _=new class{constructor(){this.config=null,this.session=null,this.queue=null,this.initialized=!1,this.lastUrl=""}init(a){var c,l;this.initialized?h("SDK already initialized"):(this.config=function(t){if(!t.apiKey)throw new Error("[AttributionSDK] apiKey is required");if(!t.appId)throw new Error("[AttributionSDK] appId is required");const a=t.baseUrl||"https://attributehq.com";return{apiKey:t.apiKey,appId:t.appId,baseUrl:a.replace(/\/+$/,""),batchSize:t.batchSize??e,flushInterval:t.flushInterval??i,maxQueueSize:t.maxQueueSize??s,autoTrackPageViews:t.autoTrackPageViews??n,debug:t.debug??r}}(a),c=this.config.debug,o=c,l=this.config,g=l,u("Initializing",{appId:this.config.appId,version:t}),this.session=new S,this.queue=new q(this.config),this.trackInstallIfNew(),this.config.autoTrackPageViews&&this.setupPageViewTracking(),this.initialized=!0,u("SDK initialized"))}track(t,e={}){this.ensureInit()&&this.queue.enqueue({event_name:t,properties:e,timestamp:Date.now(),session_id:this.session.getSessionId()})}trackPageView(t={}){this.ensureInit()&&(this.session.incrementPageViews(),this.track("page_view",{url:location.href,path:location.pathname,title:document.title,referrer:document.referrer,...t}))}trackRevenue(t,e="NGN",i={}){this.ensureInit()&&this.track("revenue",{amount:t,currency:e,...i})}identify(t,e={}){this.ensureInit()&&(f.set("user_id",t),this.track("identify",{user_id:t,...e}),u("User identified:",t))}flush(){this.ensureInit()&&this.queue.flush()}getAttribution(){const t=f.get("attribution");if(!t)return null;try{return JSON.parse(t)}catch{return null}}ensureInit(){return!!this.initialized||(h("SDK not initialized. Call init() first."),!1)}async trackInstallIfNew(){if(f.get("installed"))return void u("Install already tracked");const e={screen_resolution:v(),timezone:m(),language:w(),platform:I()},i={app_id:this.config.appId,platform:"web",sdk_version:t,screen_resolution:e.screen_resolution||void 0,timezone:e.timezone||void 0,language:e.language||void 0};u("Tracking install...");const s=await y("/api/v1/installs",i);s?.data?(f.set("installed","1"),f.set("attribution",JSON.stringify(s.data)),u("Install tracked:",s.data.matchType,`(${s.data.confidence}%)`)):h("Install tracking failed, will retry")}setupPageViewTracking(){if("undefined"==typeof window)return;this.lastUrl=location.href,this.trackPageView();const t=history.pushState.bind(history),e=history.replaceState.bind(history);history.pushState=(...e)=>{t(...e),this.onUrlChange()},history.replaceState=(...t)=>{e(...t),this.onUrlChange()},window.addEventListener("popstate",()=>{this.onUrlChange()})}onUrlChange(){const t=location.href;t!==this.lastUrl&&(this.lastUrl=t,this.trackPageView())}},P=_.init.bind(_),V=_.track.bind(_),z=_.trackPageView.bind(_),U=_.trackRevenue.bind(_),A=_.identify.bind(_),T=_.flush.bind(_),D=_.getAttribution.bind(_);var K={init:P,track:V,trackPageView:z,trackRevenue:U,identify:A,flush:T,getAttribution:D};exports.default=K,exports.flush=T,exports.getAttribution=D,exports.identify=A,exports.init=P,exports.track=V,exports.trackPageView=z,exports.trackRevenue=U;
|
|
2
|
+
//# sourceMappingURL=attribution.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attribution.cjs.js","sources":["../src/config.ts","../src/logger.ts","../src/storage.ts","../src/network.ts","../src/device.ts","../src/session.ts","../src/queue.ts","../src/sdk.ts","../src/index.ts"],"sourcesContent":[null,null,null,null,null,null,null,null,null],"names":["SDK_VERSION","DEFAULT_CONFIG","PREFIX","debugEnabled","debug","args","console","log","warn","error","KEY_PREFIX","memoryFallback","getStore","localStorage","key","setItem","removeItem","isLocalStorageAvailable","Map","storage","get","store","prefixed","getItem","set","value","remove","delete","config","async","post","path","body","logger.warn","url","baseUrl","res","fetch","method","headers","apiKey","JSON","stringify","ok","json","status","err","logger.error","getScreenResolution","screen","width","height","getTimezone","Intl","DateTimeFormat","resolvedOptions","timeZone","getLanguage","navigator","language","getPlatform","nav","userAgentData","platform","SESSION_TIMEOUT","generateId","crypto","randomUUID","replace","c","r","Math","random","toString","SessionManager","constructor","stored","storedStart","Date","now","Number","this","sessionId","lastActivity","pageViews","persist","logger.debug","getSessionId","incrementPageViews","String","STORAGE_KEY","EventQueue","queue","timer","flushing","restore","startFlushTimer","setupUnloadHandlers","enqueue","event","push","length","maxQueueSize","shift","event_name","batchSize","flush","batch","splice","app_id","appId","events","sdk_version","unshift","flushBeacon","payload","_api_key","keepalive","catch","sendBeacon","Blob","type","beacon","destroy","clearInterval","setInterval","flushInterval","document","addEventListener","visibilityState","window","raw","parse","sdkInstance","session","initialized","lastUrl","init","userConfig","enabled","cfg","Error","autoTrackPageViews","resolveConfig","version","trackInstallIfNew","setupPageViewTracking","track","eventName","properties","ensureInit","timestamp","session_id","trackPageView","location","href","pathname","title","referrer","trackRevenue","amount","currency","identify","userId","user_id","getAttribution","device","screen_resolution","timezone","undefined","data","matchType","confidence","originalPushState","history","pushState","bind","originalReplaceState","replaceState","onUrlChange","newUrl","index"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const t='"1.0.0"',e=10,i=5e3,s=100,n=!0,r=!1;const a="[AttributionSDK]";let o=!1;function u(...t){o&&console.log(a,...t)}function h(...t){console.warn(a,...t)}function c(...t){console.error(a,...t)}const l="__ahq_";let d=null;function f(){return d||("undefined"!=typeof localStorage&&function(){try{const t=l+"test";return localStorage.setItem(t,"1"),localStorage.removeItem(t),!0}catch{return!1}}()?localStorage:(d=new Map,d))}const p={get(t){const e=f(),i=l+t;return e instanceof Map?e.get(i)??null:e.getItem(i)},set(t,e){const i=f(),s=l+t;i instanceof Map?i.set(s,e):i.setItem(s,e)},remove(t){const e=f(),i=l+t;e instanceof Map?e.delete(i):e.removeItem(i)}};let g=null;async function y(t,e){if(!g)return h("Network not configured"),null;const i=`${g.baseUrl}${t}`;try{const s=await fetch(i,{method:"POST",headers:{"Content-Type":"application/json","X-API-Key":g.apiKey},body:JSON.stringify(e)});return s.ok?await s.json():(h(`POST ${t} failed: ${s.status}`),null)}catch(e){return c(`POST ${t} error:`,e),null}}function v(){try{return`${screen.width}x${screen.height}`}catch{return""}}function m(){try{return Intl.DateTimeFormat().resolvedOptions().timeZone}catch{return""}}function w(){try{return navigator.language||""}catch{return""}}function I(){try{const t=navigator;return t.userAgentData?.platform?t.userAgentData.platform:navigator.platform||""}catch{return""}}const b=18e5;function S(){try{return crypto.randomUUID()}catch{return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,t=>{const e=16*Math.random()|0;return("x"===t?e:3&e|8).toString(16)})}}class x{constructor(){const t=p.get("session_id"),e=p.get("session_start");if(t&&e){if(Date.now()-Number(e)<b)return this.sessionId=t,this.lastActivity=Number(e),void(this.pageViews=Number(p.get("session_pvs")||"0"))}this.sessionId=S(),this.lastActivity=Date.now(),this.pageViews=0,this.persist(),u("New session started",this.sessionId)}getSessionId(){return Date.now()-this.lastActivity>b&&(this.sessionId=S(),this.pageViews=0,u("Session rotated (timeout)",this.sessionId)),this.lastActivity=Date.now(),this.persist(),this.sessionId}incrementPageViews(){return this.pageViews++,p.set("session_pvs",String(this.pageViews)),this.pageViews}persist(){p.set("session_id",this.sessionId),p.set("session_start",String(this.lastActivity))}}const k="queue";class q{constructor(t){this.queue=[],this.timer=null,this.flushing=!1,this.config=t,this.restore(),this.startFlushTimer(),this.setupUnloadHandlers()}enqueue(t){for(this.queue.push(t);this.queue.length>this.config.maxQueueSize;)this.queue.shift();this.persist(),u("Event queued:",t.event_name,`(${this.queue.length} pending)`),this.queue.length>=this.config.batchSize&&this.flush()}async flush(){if(this.flushing||0===this.queue.length)return;this.flushing=!0;const e=this.queue.splice(0,this.config.batchSize);this.persist();const i={app_id:this.config.appId,events:e,sdk_version:t};try{await y("/api/v1/events",i)?u(`Flushed ${e.length} events`):(this.queue.unshift(...e),this.persist(),h("Flush failed, events re-queued"))}catch(t){this.queue.unshift(...e),this.persist(),c("Flush error:",t)}finally{this.flushing=!1}}flushBeacon(){if(0===this.queue.length)return;!function(t,e){if(!g)return;const i=`${g.baseUrl}${t}`,s=JSON.stringify({...e,_api_key:g.apiKey});try{return void fetch(i,{method:"POST",headers:{"Content-Type":"application/json","X-API-Key":g.apiKey},body:s,keepalive:!0}).catch(()=>{})}catch{}try{navigator.sendBeacon(i,new Blob([s],{type:"application/json"}))}catch{h("Both keepalive and sendBeacon failed")}}("/api/v1/events",{app_id:this.config.appId,events:this.queue,sdk_version:t}),this.queue=[],this.persist(),u("Beacon flush sent")}destroy(){this.timer&&(clearInterval(this.timer),this.timer=null)}startFlushTimer(){this.timer=setInterval(()=>{this.flush()},this.config.flushInterval)}setupUnloadHandlers(){"undefined"!=typeof document&&(document.addEventListener("visibilitychange",()=>{"hidden"===document.visibilityState&&this.flushBeacon()}),window.addEventListener("beforeunload",()=>{this.flushBeacon()}))}persist(){try{p.set(k,JSON.stringify(this.queue))}catch{}}restore(){try{const t=p.get(k);t&&(this.queue=JSON.parse(t),u(`Restored ${this.queue.length} queued events`))}catch{this.queue=[]}}}const _=new class{constructor(){this.config=null,this.session=null,this.queue=null,this.initialized=!1,this.lastUrl=""}init(a){var c,l;this.initialized?h("SDK already initialized"):(this.config=function(t){if(!t.apiKey)throw new Error("[AttributionSDK] apiKey is required");if(!t.appId)throw new Error("[AttributionSDK] appId is required");const a=t.baseUrl||"https://attributehq.com";return{apiKey:t.apiKey,appId:t.appId,baseUrl:a.replace(/\/+$/,""),batchSize:t.batchSize??e,flushInterval:t.flushInterval??i,maxQueueSize:t.maxQueueSize??s,autoTrackPageViews:t.autoTrackPageViews??n,debug:t.debug??r}}(a),c=this.config.debug,o=c,l=this.config,g=l,u("Initializing",{appId:this.config.appId,version:t}),this.session=new x,this.queue=new q(this.config),this.trackInstallIfNew(),this.config.autoTrackPageViews&&this.setupPageViewTracking(),this.initialized=!0,u("SDK initialized"))}track(t,e={}){this.ensureInit()&&this.queue.enqueue({event_name:t,properties:e,timestamp:Date.now(),session_id:this.session.getSessionId()})}trackPageView(t={}){this.ensureInit()&&(this.session.incrementPageViews(),this.track("page_view",{url:location.href,path:location.pathname,title:document.title,referrer:document.referrer,...t}))}trackRevenue(t,e="NGN",i={}){this.ensureInit()&&this.track("revenue",{amount:t,currency:e,...i})}identify(t,e={}){this.ensureInit()&&(p.set("user_id",t),this.track("identify",{user_id:t,...e}),u("User identified:",t))}flush(){this.ensureInit()&&this.queue.flush()}getAttribution(){const t=p.get("attribution");if(!t)return null;try{return JSON.parse(t)}catch{return null}}ensureInit(){return!!this.initialized||(h("SDK not initialized. Call init() first."),!1)}async trackInstallIfNew(){if(p.get("installed"))return void u("Install already tracked");const e={screen_resolution:v(),timezone:m(),language:w(),platform:I()},i={app_id:this.config.appId,platform:"web",sdk_version:t,screen_resolution:e.screen_resolution||void 0,timezone:e.timezone||void 0,language:e.language||void 0};u("Tracking install...");const s=await y("/api/v1/installs",i);s?.data?(p.set("installed","1"),p.set("attribution",JSON.stringify(s.data)),u("Install tracked:",s.data.matchType,`(${s.data.confidence}%)`)):h("Install tracking failed, will retry")}setupPageViewTracking(){if("undefined"==typeof window)return;this.lastUrl=location.href,this.trackPageView();const t=history.pushState.bind(history),e=history.replaceState.bind(history);history.pushState=(...e)=>{t(...e),this.onUrlChange()},history.replaceState=(...t)=>{e(...t),this.onUrlChange()},window.addEventListener("popstate",()=>{this.onUrlChange()})}onUrlChange(){const t=location.href;t!==this.lastUrl&&(this.lastUrl=t,this.trackPageView())}},z=_.init.bind(_),P=_.track.bind(_),V=_.trackPageView.bind(_),U=_.trackRevenue.bind(_),T=_.identify.bind(_),A=_.flush.bind(_),D=_.getAttribution.bind(_);var K={init:z,track:P,trackPageView:V,trackRevenue:U,identify:T,flush:A,getAttribution:D};export{K as default,A as flush,D as getAttribution,T as identify,z as init,P as track,V as trackPageView,U as trackRevenue};
|
|
2
|
+
//# sourceMappingURL=attribution.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attribution.esm.js","sources":["../src/config.ts","../src/logger.ts","../src/storage.ts","../src/network.ts","../src/device.ts","../src/session.ts","../src/queue.ts","../src/sdk.ts","../src/index.ts"],"sourcesContent":[null,null,null,null,null,null,null,null,null],"names":["SDK_VERSION","DEFAULT_CONFIG","PREFIX","debugEnabled","debug","args","console","log","warn","error","KEY_PREFIX","memoryFallback","getStore","localStorage","key","setItem","removeItem","isLocalStorageAvailable","Map","storage","get","store","prefixed","getItem","set","value","remove","delete","config","async","post","path","body","logger.warn","url","baseUrl","res","fetch","method","headers","apiKey","JSON","stringify","ok","json","status","err","logger.error","getScreenResolution","screen","width","height","getTimezone","Intl","DateTimeFormat","resolvedOptions","timeZone","getLanguage","navigator","language","getPlatform","nav","userAgentData","platform","SESSION_TIMEOUT","generateId","crypto","randomUUID","replace","c","r","Math","random","toString","SessionManager","constructor","stored","storedStart","Date","now","Number","this","sessionId","lastActivity","pageViews","persist","logger.debug","getSessionId","incrementPageViews","String","STORAGE_KEY","EventQueue","queue","timer","flushing","restore","startFlushTimer","setupUnloadHandlers","enqueue","event","push","length","maxQueueSize","shift","event_name","batchSize","flush","batch","splice","app_id","appId","events","sdk_version","unshift","flushBeacon","payload","_api_key","keepalive","catch","sendBeacon","Blob","type","beacon","destroy","clearInterval","setInterval","flushInterval","document","addEventListener","visibilityState","window","raw","parse","sdkInstance","session","initialized","lastUrl","init","userConfig","enabled","cfg","Error","autoTrackPageViews","resolveConfig","version","trackInstallIfNew","setupPageViewTracking","track","eventName","properties","ensureInit","timestamp","session_id","trackPageView","location","href","pathname","title","referrer","trackRevenue","amount","currency","identify","userId","user_id","getAttribution","device","screen_resolution","timezone","undefined","data","matchType","confidence","originalPushState","history","pushState","bind","originalReplaceState","replaceState","onUrlChange","newUrl","index"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((t="undefined"!=typeof globalThis?globalThis:t||self).AttributionSDK={})}(this,function(t){"use strict";const e='"1.0.0"',i=10,s=5e3,n=100,r=!0,a=!1;const o="[AttributionSDK]";let u=!1;function h(...t){u&&console.log(o,...t)}function c(...t){console.warn(o,...t)}function l(...t){console.error(o,...t)}const d="__ahq_";let f=null;function p(){return f||("undefined"!=typeof localStorage&&function(){try{const t=d+"test";return localStorage.setItem(t,"1"),localStorage.removeItem(t),!0}catch{return!1}}()?localStorage:(f=new Map,f))}const g={get(t){const e=p(),i=d+t;return e instanceof Map?e.get(i)??null:e.getItem(i)},set(t,e){const i=p(),s=d+t;i instanceof Map?i.set(s,e):i.setItem(s,e)},remove(t){const e=p(),i=d+t;e instanceof Map?e.delete(i):e.removeItem(i)}};let y=null;async function v(t,e){if(!y)return c("Network not configured"),null;const i=`${y.baseUrl}${t}`;try{const s=await fetch(i,{method:"POST",headers:{"Content-Type":"application/json","X-API-Key":y.apiKey},body:JSON.stringify(e)});return s.ok?await s.json():(c(`POST ${t} failed: ${s.status}`),null)}catch(e){return l(`POST ${t} error:`,e),null}}function m(){try{return`${screen.width}x${screen.height}`}catch{return""}}function w(){try{return Intl.DateTimeFormat().resolvedOptions().timeZone}catch{return""}}function I(){try{return navigator.language||""}catch{return""}}function b(){try{const t=navigator;return t.userAgentData?.platform?t.userAgentData.platform:navigator.platform||""}catch{return""}}const x=18e5;function S(){try{return crypto.randomUUID()}catch{return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,t=>{const e=16*Math.random()|0;return("x"===t?e:3&e|8).toString(16)})}}class k{constructor(){const t=g.get("session_id"),e=g.get("session_start");if(t&&e){if(Date.now()-Number(e)<x)return this.sessionId=t,this.lastActivity=Number(e),void(this.pageViews=Number(g.get("session_pvs")||"0"))}this.sessionId=S(),this.lastActivity=Date.now(),this.pageViews=0,this.persist(),h("New session started",this.sessionId)}getSessionId(){return Date.now()-this.lastActivity>x&&(this.sessionId=S(),this.pageViews=0,h("Session rotated (timeout)",this.sessionId)),this.lastActivity=Date.now(),this.persist(),this.sessionId}incrementPageViews(){return this.pageViews++,g.set("session_pvs",String(this.pageViews)),this.pageViews}persist(){g.set("session_id",this.sessionId),g.set("session_start",String(this.lastActivity))}}const q="queue";class _{constructor(t){this.queue=[],this.timer=null,this.flushing=!1,this.config=t,this.restore(),this.startFlushTimer(),this.setupUnloadHandlers()}enqueue(t){for(this.queue.push(t);this.queue.length>this.config.maxQueueSize;)this.queue.shift();this.persist(),h("Event queued:",t.event_name,`(${this.queue.length} pending)`),this.queue.length>=this.config.batchSize&&this.flush()}async flush(){if(this.flushing||0===this.queue.length)return;this.flushing=!0;const t=this.queue.splice(0,this.config.batchSize);this.persist();const i={app_id:this.config.appId,events:t,sdk_version:e};try{await v("/api/v1/events",i)?h(`Flushed ${t.length} events`):(this.queue.unshift(...t),this.persist(),c("Flush failed, events re-queued"))}catch(e){this.queue.unshift(...t),this.persist(),l("Flush error:",e)}finally{this.flushing=!1}}flushBeacon(){if(0===this.queue.length)return;!function(t,e){if(!y)return;const i=`${y.baseUrl}${t}`,s=JSON.stringify({...e,_api_key:y.apiKey});try{return void fetch(i,{method:"POST",headers:{"Content-Type":"application/json","X-API-Key":y.apiKey},body:s,keepalive:!0}).catch(()=>{})}catch{}try{navigator.sendBeacon(i,new Blob([s],{type:"application/json"}))}catch{c("Both keepalive and sendBeacon failed")}}("/api/v1/events",{app_id:this.config.appId,events:this.queue,sdk_version:e}),this.queue=[],this.persist(),h("Beacon flush sent")}destroy(){this.timer&&(clearInterval(this.timer),this.timer=null)}startFlushTimer(){this.timer=setInterval(()=>{this.flush()},this.config.flushInterval)}setupUnloadHandlers(){"undefined"!=typeof document&&(document.addEventListener("visibilitychange",()=>{"hidden"===document.visibilityState&&this.flushBeacon()}),window.addEventListener("beforeunload",()=>{this.flushBeacon()}))}persist(){try{g.set(q,JSON.stringify(this.queue))}catch{}}restore(){try{const t=g.get(q);t&&(this.queue=JSON.parse(t),h(`Restored ${this.queue.length} queued events`))}catch{this.queue=[]}}}const P=new class{constructor(){this.config=null,this.session=null,this.queue=null,this.initialized=!1,this.lastUrl=""}init(t){var o,l;this.initialized?c("SDK already initialized"):(this.config=function(t){if(!t.apiKey)throw new Error("[AttributionSDK] apiKey is required");if(!t.appId)throw new Error("[AttributionSDK] appId is required");const e=t.baseUrl||"https://attributehq.com";return{apiKey:t.apiKey,appId:t.appId,baseUrl:e.replace(/\/+$/,""),batchSize:t.batchSize??i,flushInterval:t.flushInterval??s,maxQueueSize:t.maxQueueSize??n,autoTrackPageViews:t.autoTrackPageViews??r,debug:t.debug??a}}(t),o=this.config.debug,u=o,l=this.config,y=l,h("Initializing",{appId:this.config.appId,version:e}),this.session=new k,this.queue=new _(this.config),this.trackInstallIfNew(),this.config.autoTrackPageViews&&this.setupPageViewTracking(),this.initialized=!0,h("SDK initialized"))}track(t,e={}){this.ensureInit()&&this.queue.enqueue({event_name:t,properties:e,timestamp:Date.now(),session_id:this.session.getSessionId()})}trackPageView(t={}){this.ensureInit()&&(this.session.incrementPageViews(),this.track("page_view",{url:location.href,path:location.pathname,title:document.title,referrer:document.referrer,...t}))}trackRevenue(t,e="NGN",i={}){this.ensureInit()&&this.track("revenue",{amount:t,currency:e,...i})}identify(t,e={}){this.ensureInit()&&(g.set("user_id",t),this.track("identify",{user_id:t,...e}),h("User identified:",t))}flush(){this.ensureInit()&&this.queue.flush()}getAttribution(){const t=g.get("attribution");if(!t)return null;try{return JSON.parse(t)}catch{return null}}ensureInit(){return!!this.initialized||(c("SDK not initialized. Call init() first."),!1)}async trackInstallIfNew(){if(g.get("installed"))return void h("Install already tracked");const t={screen_resolution:m(),timezone:w(),language:I(),platform:b()},i={app_id:this.config.appId,platform:"web",sdk_version:e,screen_resolution:t.screen_resolution||void 0,timezone:t.timezone||void 0,language:t.language||void 0};h("Tracking install...");const s=await v("/api/v1/installs",i);s?.data?(g.set("installed","1"),g.set("attribution",JSON.stringify(s.data)),h("Install tracked:",s.data.matchType,`(${s.data.confidence}%)`)):c("Install tracking failed, will retry")}setupPageViewTracking(){if("undefined"==typeof window)return;this.lastUrl=location.href,this.trackPageView();const t=history.pushState.bind(history),e=history.replaceState.bind(history);history.pushState=(...e)=>{t(...e),this.onUrlChange()},history.replaceState=(...t)=>{e(...t),this.onUrlChange()},window.addEventListener("popstate",()=>{this.onUrlChange()})}onUrlChange(){const t=location.href;t!==this.lastUrl&&(this.lastUrl=t,this.trackPageView())}},V=P.init.bind(P),z=P.track.bind(P),T=P.trackPageView.bind(P),A=P.trackRevenue.bind(P),U=P.identify.bind(P),D=P.flush.bind(P),K=P.getAttribution.bind(P);var N={init:V,track:z,trackPageView:T,trackRevenue:A,identify:U,flush:D,getAttribution:K};t.default=N,t.flush=D,t.getAttribution=K,t.identify=U,t.init=V,t.track=z,t.trackPageView=T,t.trackRevenue=A,Object.defineProperty(t,"__esModule",{value:!0})});
|
|
2
|
+
//# sourceMappingURL=attribution.umd.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attribution.umd.js","sources":["../src/config.ts","../src/logger.ts","../src/storage.ts","../src/network.ts","../src/device.ts","../src/session.ts","../src/queue.ts","../src/sdk.ts","../src/index.ts"],"sourcesContent":[null,null,null,null,null,null,null,null,null],"names":["SDK_VERSION","DEFAULT_CONFIG","PREFIX","debugEnabled","debug","args","console","log","warn","error","KEY_PREFIX","memoryFallback","getStore","localStorage","key","setItem","removeItem","isLocalStorageAvailable","Map","storage","get","store","prefixed","getItem","set","value","remove","delete","config","async","post","path","body","logger.warn","url","baseUrl","res","fetch","method","headers","apiKey","JSON","stringify","ok","json","status","err","logger.error","getScreenResolution","screen","width","height","getTimezone","Intl","DateTimeFormat","resolvedOptions","timeZone","getLanguage","navigator","language","getPlatform","nav","userAgentData","platform","SESSION_TIMEOUT","generateId","crypto","randomUUID","replace","c","r","Math","random","toString","SessionManager","constructor","stored","storedStart","Date","now","Number","this","sessionId","lastActivity","pageViews","persist","logger.debug","getSessionId","incrementPageViews","String","STORAGE_KEY","EventQueue","queue","timer","flushing","restore","startFlushTimer","setupUnloadHandlers","enqueue","event","push","length","maxQueueSize","shift","event_name","batchSize","flush","batch","splice","app_id","appId","events","sdk_version","unshift","flushBeacon","payload","_api_key","keepalive","catch","sendBeacon","Blob","type","beacon","destroy","clearInterval","setInterval","flushInterval","document","addEventListener","visibilityState","window","raw","parse","sdkInstance","session","initialized","lastUrl","init","userConfig","enabled","cfg","Error","autoTrackPageViews","resolveConfig","version","trackInstallIfNew","setupPageViewTracking","track","eventName","properties","ensureInit","timestamp","session_id","trackPageView","location","href","pathname","title","referrer","trackRevenue","amount","currency","identify","userId","user_id","getAttribution","device","screen_resolution","timezone","undefined","data","matchType","confidence","originalPushState","history","pushState","bind","originalReplaceState","replaceState","onUrlChange","newUrl","index"],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* User-facing SDK configuration
|
|
3
|
+
*/
|
|
4
|
+
interface SDKConfig {
|
|
5
|
+
/** API key (format: ak_xxx) */
|
|
6
|
+
apiKey: string;
|
|
7
|
+
/** App UUID */
|
|
8
|
+
appId: string;
|
|
9
|
+
/** Override API base URL (default: https://attributehq.com) */
|
|
10
|
+
baseUrl?: string;
|
|
11
|
+
/** Events per batch before auto-flush (default: 10) */
|
|
12
|
+
batchSize?: number;
|
|
13
|
+
/** Auto-flush interval in ms (default: 5000) */
|
|
14
|
+
flushInterval?: number;
|
|
15
|
+
/** Max events in offline queue (default: 100) */
|
|
16
|
+
maxQueueSize?: number;
|
|
17
|
+
/** Auto-track page views including SPA navigation (default: true) */
|
|
18
|
+
autoTrackPageViews?: boolean;
|
|
19
|
+
/** Enable debug logging (default: false) */
|
|
20
|
+
debug?: boolean;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Attribution result returned from the server
|
|
24
|
+
*/
|
|
25
|
+
interface AttributionResult {
|
|
26
|
+
matchType: 'device_id' | 'fingerprint' | 'organic';
|
|
27
|
+
confidence: number;
|
|
28
|
+
mediaSource: string | null;
|
|
29
|
+
campaignId: string | null;
|
|
30
|
+
isOrganic: boolean;
|
|
31
|
+
attributedTouchTime: number | null;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Browser-collected device info for enhanced fingerprinting
|
|
35
|
+
*/
|
|
36
|
+
interface DeviceInfo {
|
|
37
|
+
screen_resolution: string;
|
|
38
|
+
timezone: string;
|
|
39
|
+
language: string;
|
|
40
|
+
platform: string;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Event stored in the offline queue
|
|
44
|
+
*/
|
|
45
|
+
interface QueuedEvent {
|
|
46
|
+
event_name: string;
|
|
47
|
+
properties: Record<string, unknown>;
|
|
48
|
+
timestamp: number;
|
|
49
|
+
session_id: string;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
declare const init: (userConfig: SDKConfig) => void;
|
|
53
|
+
declare const track: (eventName: string, properties?: Record<string, unknown>) => void;
|
|
54
|
+
declare const trackPageView: (properties?: Record<string, unknown>) => void;
|
|
55
|
+
declare const trackRevenue: (amount: number, currency?: string, properties?: Record<string, unknown>) => void;
|
|
56
|
+
declare const identify: (userId: string, properties?: Record<string, unknown>) => void;
|
|
57
|
+
declare const flush: () => void;
|
|
58
|
+
declare const getAttribution: () => AttributionResult | null;
|
|
59
|
+
declare const _default: {
|
|
60
|
+
init: (userConfig: SDKConfig) => void;
|
|
61
|
+
track: (eventName: string, properties?: Record<string, unknown>) => void;
|
|
62
|
+
trackPageView: (properties?: Record<string, unknown>) => void;
|
|
63
|
+
trackRevenue: (amount: number, currency?: string, properties?: Record<string, unknown>) => void;
|
|
64
|
+
identify: (userId: string, properties?: Record<string, unknown>) => void;
|
|
65
|
+
flush: () => void;
|
|
66
|
+
getAttribution: () => AttributionResult | null;
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
export { _default as default, flush, getAttribution, identify, init, track, trackPageView, trackRevenue };
|
|
70
|
+
export type { AttributionResult, DeviceInfo, QueuedEvent, SDKConfig };
|
package/package.json
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@attributehq/web-sdk",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Lightweight web attribution SDK for AttributeHQ — track installs, events, and revenue",
|
|
5
|
+
"author": "AttributeHQ <dev@attributehq.com>",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"homepage": "https://attributehq.com",
|
|
8
|
+
"repository": {
|
|
9
|
+
"type": "git",
|
|
10
|
+
"url": "https://github.com/attributehq/attributehq.git",
|
|
11
|
+
"directory": "sdk/web"
|
|
12
|
+
},
|
|
13
|
+
"bugs": {
|
|
14
|
+
"url": "https://github.com/attributehq/attributehq/issues"
|
|
15
|
+
},
|
|
16
|
+
"keywords": [
|
|
17
|
+
"attribution",
|
|
18
|
+
"analytics",
|
|
19
|
+
"tracking",
|
|
20
|
+
"mobile-attribution",
|
|
21
|
+
"install-tracking",
|
|
22
|
+
"marketing",
|
|
23
|
+
"fintech",
|
|
24
|
+
"sdk"
|
|
25
|
+
],
|
|
26
|
+
"main": "dist/attribution.cjs.js",
|
|
27
|
+
"module": "dist/attribution.esm.js",
|
|
28
|
+
"browser": "dist/attribution.umd.js",
|
|
29
|
+
"types": "dist/index.d.ts",
|
|
30
|
+
"exports": {
|
|
31
|
+
".": {
|
|
32
|
+
"import": "./dist/attribution.esm.js",
|
|
33
|
+
"require": "./dist/attribution.cjs.js",
|
|
34
|
+
"types": "./dist/index.d.ts",
|
|
35
|
+
"default": "./dist/attribution.umd.js"
|
|
36
|
+
}
|
|
37
|
+
},
|
|
38
|
+
"files": [
|
|
39
|
+
"dist"
|
|
40
|
+
],
|
|
41
|
+
"scripts": {
|
|
42
|
+
"build": "rollup -c rollup.config.mjs",
|
|
43
|
+
"dev": "rollup -c rollup.config.mjs --watch",
|
|
44
|
+
"typecheck": "tsc --noEmit",
|
|
45
|
+
"prepublishOnly": "bun run build"
|
|
46
|
+
},
|
|
47
|
+
"devDependencies": {
|
|
48
|
+
"typescript": "^5.3.3",
|
|
49
|
+
"rollup": "^4.9.0",
|
|
50
|
+
"@rollup/plugin-typescript": "^11.1.0",
|
|
51
|
+
"@rollup/plugin-node-resolve": "^15.2.0",
|
|
52
|
+
"@rollup/plugin-terser": "^0.4.0",
|
|
53
|
+
"@rollup/plugin-replace": "^6.0.0",
|
|
54
|
+
"rollup-plugin-dts": "^6.1.0",
|
|
55
|
+
"tslib": "^2.6.0"
|
|
56
|
+
},
|
|
57
|
+
"publishConfig": {
|
|
58
|
+
"access": "public"
|
|
59
|
+
},
|
|
60
|
+
"sideEffects": false
|
|
61
|
+
}
|