@thred-apps/thred-track 1.0.3
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 +18 -0
- package/README.md +349 -0
- package/dist/core/api.d.ts +21 -0
- package/dist/core/api.d.ts.map +1 -0
- package/dist/core/fingerprint.d.ts +21 -0
- package/dist/core/fingerprint.d.ts.map +1 -0
- package/dist/core/tracker.d.ts +37 -0
- package/dist/core/tracker.d.ts.map +1 -0
- package/dist/index.d.ts +44 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.esm.js +531 -0
- package/dist/index.esm.js.map +1 -0
- package/dist/index.js +536 -0
- package/dist/index.js.map +1 -0
- package/dist/thred.umd.js +2 -0
- package/dist/thred.umd.js.map +1 -0
- package/dist/types/index.d.ts +48 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/utils/detector.d.ts +9 -0
- package/dist/utils/detector.d.ts.map +1 -0
- package/dist/utils/logger.d.ts +12 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/package.json +61 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1,536 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
+
|
|
5
|
+
/******************************************************************************
|
|
6
|
+
Copyright (c) Microsoft Corporation.
|
|
7
|
+
|
|
8
|
+
Permission to use, copy, modify, and/or distribute this software for any
|
|
9
|
+
purpose with or without fee is hereby granted.
|
|
10
|
+
|
|
11
|
+
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
|
|
12
|
+
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
|
13
|
+
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
|
|
14
|
+
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
|
|
15
|
+
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
|
|
16
|
+
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
|
17
|
+
PERFORMANCE OF THIS SOFTWARE.
|
|
18
|
+
***************************************************************************** */
|
|
19
|
+
/* global Reflect, Promise, SuppressedError, Symbol, Iterator */
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
function __awaiter(thisArg, _arguments, P, generator) {
|
|
23
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
24
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
25
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
26
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
27
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
28
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
|
|
33
|
+
var e = new Error(message);
|
|
34
|
+
return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Simple logger utility
|
|
39
|
+
*/
|
|
40
|
+
class Logger {
|
|
41
|
+
constructor(debug = false, prefix = '[Thred]') {
|
|
42
|
+
this.debug = debug;
|
|
43
|
+
this.prefix = prefix;
|
|
44
|
+
}
|
|
45
|
+
log(...args) {
|
|
46
|
+
if (this.debug) {
|
|
47
|
+
console.log(this.prefix, ...args);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
warn(...args) {
|
|
51
|
+
if (this.debug) {
|
|
52
|
+
console.warn(this.prefix, ...args);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
error(...args) {
|
|
56
|
+
console.error(this.prefix, ...args);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Detects if the visitor came from ChatGPT
|
|
62
|
+
*/
|
|
63
|
+
function isFromChatGPT() {
|
|
64
|
+
var _a;
|
|
65
|
+
if (typeof window === 'undefined')
|
|
66
|
+
return false;
|
|
67
|
+
const params = new URLSearchParams(window.location.search);
|
|
68
|
+
const utmSource = ((_a = params.get('utm_source')) === null || _a === void 0 ? void 0 : _a.toLowerCase()) || '';
|
|
69
|
+
const referrer = document.referrer.toLowerCase();
|
|
70
|
+
const isChatGPTRef = referrer.includes('chat.openai.com') || referrer.includes('chatgpt.com');
|
|
71
|
+
const isChatGPTUtm = utmSource === 'chatgpt' ||
|
|
72
|
+
utmSource.includes('chatgpt') ||
|
|
73
|
+
utmSource === 'chat.openai' ||
|
|
74
|
+
utmSource === 'openai';
|
|
75
|
+
return isChatGPTUtm || isChatGPTRef;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Gets the browser key from script tag if present
|
|
79
|
+
*/
|
|
80
|
+
function getBrowserKeyFromScript() {
|
|
81
|
+
if (typeof window === 'undefined' || typeof document === 'undefined') {
|
|
82
|
+
return null;
|
|
83
|
+
}
|
|
84
|
+
const scripts = document.getElementsByTagName('script');
|
|
85
|
+
for (const script of Array.from(scripts)) {
|
|
86
|
+
if (script.src.includes('thred')) {
|
|
87
|
+
try {
|
|
88
|
+
const url = new URL(script.src);
|
|
89
|
+
return url.searchParams.get('browserKey');
|
|
90
|
+
}
|
|
91
|
+
catch (_a) {
|
|
92
|
+
// Invalid URL
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
return null;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
const FP_PROXY_URL = 'https://thredproxy.com/35ZCuyzokuT1YGd8/Hm7KPMHUZ4duyPRj?apiKey=iyqKVLQt2560EQUyjfxa';
|
|
100
|
+
const FP_PROXY_ENDPOINT = 'https://thredproxy.com/35ZCuyzokuT1YGd8/qbWl4nqUSCIDTor4';
|
|
101
|
+
class FingerprintManager {
|
|
102
|
+
constructor(logger) {
|
|
103
|
+
this.fingerprint = null;
|
|
104
|
+
this.promise = null;
|
|
105
|
+
this.logger = logger;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Get or generate fingerprint
|
|
109
|
+
*/
|
|
110
|
+
getFingerprint() {
|
|
111
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
112
|
+
// Return cached fingerprint
|
|
113
|
+
if (this.fingerprint) {
|
|
114
|
+
this.logger.log('Using cached fingerprint:', this.fingerprint);
|
|
115
|
+
return this.fingerprint;
|
|
116
|
+
}
|
|
117
|
+
// Return existing promise if already loading
|
|
118
|
+
if (this.promise) {
|
|
119
|
+
return this.promise;
|
|
120
|
+
}
|
|
121
|
+
// Check global window cache
|
|
122
|
+
if (typeof window !== 'undefined' &&
|
|
123
|
+
window.thredFingerprint) {
|
|
124
|
+
this.fingerprint = window.thredFingerprint;
|
|
125
|
+
this.logger.log('Using global fingerprint:', this.fingerprint);
|
|
126
|
+
return this.fingerprint;
|
|
127
|
+
}
|
|
128
|
+
// Generate new fingerprint
|
|
129
|
+
this.promise = this.generateFingerprint();
|
|
130
|
+
return this.promise;
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
generateFingerprint() {
|
|
134
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
135
|
+
try {
|
|
136
|
+
this.logger.log('Loading FingerprintJS...');
|
|
137
|
+
const FingerprintJS = yield import(FP_PROXY_URL);
|
|
138
|
+
const fp = yield FingerprintJS.load({
|
|
139
|
+
endpoint: [FP_PROXY_ENDPOINT, FingerprintJS.defaultEndpoint],
|
|
140
|
+
});
|
|
141
|
+
const result = yield fp.get();
|
|
142
|
+
this.fingerprint = result.visitorId;
|
|
143
|
+
// Cache globally
|
|
144
|
+
if (typeof window !== 'undefined') {
|
|
145
|
+
window.thredFingerprint = this.fingerprint;
|
|
146
|
+
}
|
|
147
|
+
this.logger.log('Fingerprint generated:', this.fingerprint);
|
|
148
|
+
return this.fingerprint;
|
|
149
|
+
}
|
|
150
|
+
catch (error) {
|
|
151
|
+
this.logger.warn('Fingerprint generation failed:', error);
|
|
152
|
+
return null;
|
|
153
|
+
}
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Get cached fingerprint (synchronous)
|
|
158
|
+
*/
|
|
159
|
+
getCachedFingerprint() {
|
|
160
|
+
return this.fingerprint;
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Clear fingerprint cache
|
|
164
|
+
*/
|
|
165
|
+
clear() {
|
|
166
|
+
this.fingerprint = null;
|
|
167
|
+
this.promise = null;
|
|
168
|
+
if (typeof window !== 'undefined') {
|
|
169
|
+
delete window.thredFingerprint;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
class ThredAPI {
|
|
175
|
+
constructor(baseUrl, browserKey, logger) {
|
|
176
|
+
this.baseUrl = baseUrl;
|
|
177
|
+
this.browserKey = browserKey;
|
|
178
|
+
this.logger = logger;
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Fetch configuration from API
|
|
182
|
+
*/
|
|
183
|
+
fetchConfig() {
|
|
184
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
185
|
+
try {
|
|
186
|
+
const url = `${this.baseUrl}/config?browserKey=${encodeURIComponent(this.browserKey)}`;
|
|
187
|
+
this.logger.log('Fetching config from:', url);
|
|
188
|
+
const response = yield fetch(url, {
|
|
189
|
+
method: 'GET',
|
|
190
|
+
headers: {
|
|
191
|
+
Accept: 'application/json',
|
|
192
|
+
},
|
|
193
|
+
});
|
|
194
|
+
if (!response.ok) {
|
|
195
|
+
throw new Error(`Config request failed: ${response.status}`);
|
|
196
|
+
}
|
|
197
|
+
const config = yield response.json();
|
|
198
|
+
this.logger.log('Config received:', config);
|
|
199
|
+
return config;
|
|
200
|
+
}
|
|
201
|
+
catch (error) {
|
|
202
|
+
this.logger.warn('Failed to fetch config:', error);
|
|
203
|
+
return null;
|
|
204
|
+
}
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Send page view event
|
|
209
|
+
*/
|
|
210
|
+
trackPageView(payload) {
|
|
211
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
212
|
+
try {
|
|
213
|
+
const url = `${this.baseUrl}/events/page-view?browserKey=${encodeURIComponent(this.browserKey)}`;
|
|
214
|
+
this.logger.log('Tracking page view:', url);
|
|
215
|
+
const response = yield fetch(url, {
|
|
216
|
+
method: 'POST',
|
|
217
|
+
headers: {
|
|
218
|
+
'Content-Type': 'application/json',
|
|
219
|
+
},
|
|
220
|
+
body: JSON.stringify(payload),
|
|
221
|
+
keepalive: true,
|
|
222
|
+
});
|
|
223
|
+
if (!response.ok) {
|
|
224
|
+
throw new Error(`Page view request failed: ${response.status}`);
|
|
225
|
+
}
|
|
226
|
+
this.logger.log('Page view tracked successfully');
|
|
227
|
+
}
|
|
228
|
+
catch (error) {
|
|
229
|
+
this.logger.warn('Failed to track page view:', error);
|
|
230
|
+
}
|
|
231
|
+
});
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* Send lead enrichment data
|
|
235
|
+
*/
|
|
236
|
+
enrichLead(payload) {
|
|
237
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
238
|
+
try {
|
|
239
|
+
const url = `${this.baseUrl}/customers/enrich?browserKey=${encodeURIComponent(this.browserKey)}`;
|
|
240
|
+
this.logger.log('Enriching lead:', url);
|
|
241
|
+
const response = yield fetch(url, {
|
|
242
|
+
method: 'POST',
|
|
243
|
+
headers: {
|
|
244
|
+
'Content-Type': 'application/json',
|
|
245
|
+
},
|
|
246
|
+
body: JSON.stringify(payload),
|
|
247
|
+
keepalive: true,
|
|
248
|
+
});
|
|
249
|
+
if (!response.ok) {
|
|
250
|
+
throw new Error(`Enrich request failed: ${response.status}`);
|
|
251
|
+
}
|
|
252
|
+
this.logger.log('Lead enriched successfully');
|
|
253
|
+
}
|
|
254
|
+
catch (error) {
|
|
255
|
+
this.logger.warn('Failed to enrich lead:', error);
|
|
256
|
+
}
|
|
257
|
+
});
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
class Tracker {
|
|
262
|
+
constructor(api, fingerprint, logger) {
|
|
263
|
+
this.config = null;
|
|
264
|
+
this.formObserver = null;
|
|
265
|
+
this.api = api;
|
|
266
|
+
this.fingerprint = fingerprint;
|
|
267
|
+
this.logger = logger;
|
|
268
|
+
}
|
|
269
|
+
/**
|
|
270
|
+
* Initialize tracker with config
|
|
271
|
+
*/
|
|
272
|
+
init() {
|
|
273
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
274
|
+
var _a;
|
|
275
|
+
this.config = yield this.api.fetchConfig();
|
|
276
|
+
if (!((_a = this.config) === null || _a === void 0 ? void 0 : _a.enabled)) {
|
|
277
|
+
this.logger.log('Tracking disabled by config');
|
|
278
|
+
return;
|
|
279
|
+
}
|
|
280
|
+
// Track page view
|
|
281
|
+
yield this.trackPageView();
|
|
282
|
+
// Setup form tracking
|
|
283
|
+
this.setupFormTracking();
|
|
284
|
+
});
|
|
285
|
+
}
|
|
286
|
+
/**
|
|
287
|
+
* Track page view event
|
|
288
|
+
*/
|
|
289
|
+
trackPageView() {
|
|
290
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
291
|
+
const fp = yield this.fingerprint.getFingerprint();
|
|
292
|
+
if (!fp) {
|
|
293
|
+
this.logger.warn('Cannot track page view without fingerprint');
|
|
294
|
+
return;
|
|
295
|
+
}
|
|
296
|
+
yield this.api.trackPageView({
|
|
297
|
+
event: 'page_view',
|
|
298
|
+
data: {
|
|
299
|
+
url: window.location.href,
|
|
300
|
+
},
|
|
301
|
+
fingerprint: fp,
|
|
302
|
+
});
|
|
303
|
+
});
|
|
304
|
+
}
|
|
305
|
+
/**
|
|
306
|
+
* Track form submission and enrich lead
|
|
307
|
+
*/
|
|
308
|
+
trackFormSubmit(formData) {
|
|
309
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
310
|
+
var _a, _b, _c;
|
|
311
|
+
if (!this.config || !this.config.emailId || !this.config.nameId) {
|
|
312
|
+
this.logger.warn('Cannot track form - no config loaded');
|
|
313
|
+
return;
|
|
314
|
+
}
|
|
315
|
+
const email = (_a = formData.get(this.config.emailId)) === null || _a === void 0 ? void 0 : _a.toString().trim();
|
|
316
|
+
const name = (_b = formData.get(this.config.nameId)) === null || _b === void 0 ? void 0 : _b.toString().trim();
|
|
317
|
+
let company = undefined;
|
|
318
|
+
if (this.config.companyId) {
|
|
319
|
+
company = (_c = formData.get(this.config.companyId)) === null || _c === void 0 ? void 0 : _c.toString().trim();
|
|
320
|
+
}
|
|
321
|
+
this.logger.log('Form data extracted:', { email, name, company });
|
|
322
|
+
if (!email || !name) {
|
|
323
|
+
this.logger.warn('Missing required fields (email, name)');
|
|
324
|
+
return;
|
|
325
|
+
}
|
|
326
|
+
yield this.identify({
|
|
327
|
+
name,
|
|
328
|
+
email,
|
|
329
|
+
company: company,
|
|
330
|
+
discovery: true,
|
|
331
|
+
});
|
|
332
|
+
});
|
|
333
|
+
}
|
|
334
|
+
/**
|
|
335
|
+
* Identify user and enrich lead data
|
|
336
|
+
*/
|
|
337
|
+
identify(leadData) {
|
|
338
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
339
|
+
const fp = yield this.fingerprint.getFingerprint();
|
|
340
|
+
if (!fp) {
|
|
341
|
+
this.logger.warn('Cannot identify without fingerprint');
|
|
342
|
+
return;
|
|
343
|
+
}
|
|
344
|
+
yield this.api.enrichLead({
|
|
345
|
+
fingerprint: fp,
|
|
346
|
+
leadData,
|
|
347
|
+
});
|
|
348
|
+
});
|
|
349
|
+
}
|
|
350
|
+
/**
|
|
351
|
+
* Setup automatic form tracking
|
|
352
|
+
*/
|
|
353
|
+
setupFormTracking() {
|
|
354
|
+
if (!this.config || typeof document === 'undefined') {
|
|
355
|
+
this.logger.warn('Cannot track form - no config or document');
|
|
356
|
+
return;
|
|
357
|
+
}
|
|
358
|
+
if (this.config.type === 'hosted') {
|
|
359
|
+
let hostedUrlBase = this.config.hostedUrlBase;
|
|
360
|
+
if (!hostedUrlBase) {
|
|
361
|
+
this.logger.warn('Cannot track form - no hosted URL base');
|
|
362
|
+
return;
|
|
363
|
+
}
|
|
364
|
+
// Attach UTM parameter to links containing hostedUrlBase
|
|
365
|
+
document.addEventListener('click', (e) => __awaiter(this, void 0, void 0, function* () {
|
|
366
|
+
const target = e.target.closest('a');
|
|
367
|
+
if (!target)
|
|
368
|
+
return;
|
|
369
|
+
const href = target.getAttribute('href');
|
|
370
|
+
if (!href || !href.includes(hostedUrlBase))
|
|
371
|
+
return;
|
|
372
|
+
// Get fingerprint
|
|
373
|
+
const fp = yield this.fingerprint.getFingerprint();
|
|
374
|
+
if (!fp) {
|
|
375
|
+
this.logger.warn('Cannot add UTM parameter - no fingerprint');
|
|
376
|
+
return;
|
|
377
|
+
}
|
|
378
|
+
// Parse URL and add utm_fp parameter
|
|
379
|
+
try {
|
|
380
|
+
const url = new URL(href, window.location.origin);
|
|
381
|
+
url.searchParams.set('utm_fp', fp);
|
|
382
|
+
// Update the href with the new URL
|
|
383
|
+
target.setAttribute('href', url.toString());
|
|
384
|
+
this.logger.log('Added utm_fp to link:', url.toString());
|
|
385
|
+
}
|
|
386
|
+
catch (err) {
|
|
387
|
+
this.logger.warn('Failed to parse URL:', href, err);
|
|
388
|
+
}
|
|
389
|
+
}), { capture: true });
|
|
390
|
+
return;
|
|
391
|
+
}
|
|
392
|
+
else if (this.config.type === 'custom') {
|
|
393
|
+
const attachFormListener = () => {
|
|
394
|
+
if (!this.config || !this.config.formId) {
|
|
395
|
+
this.logger.warn('Cannot track form - no form ID');
|
|
396
|
+
return;
|
|
397
|
+
}
|
|
398
|
+
const form = document.getElementById(this.config.formId);
|
|
399
|
+
if (!form) {
|
|
400
|
+
this.logger.log('Form not found:', this.config.formId);
|
|
401
|
+
return;
|
|
402
|
+
}
|
|
403
|
+
const formElement = form;
|
|
404
|
+
// Check if already tracked
|
|
405
|
+
if (formElement.dataset.thredTracked) {
|
|
406
|
+
return;
|
|
407
|
+
}
|
|
408
|
+
this.logger.log('Attaching listener to form:', this.config.formId);
|
|
409
|
+
formElement.addEventListener('submit', () => {
|
|
410
|
+
const formData = new FormData(formElement);
|
|
411
|
+
this.trackFormSubmit(formData);
|
|
412
|
+
}, { capture: true });
|
|
413
|
+
formElement.dataset.thredTracked = 'true';
|
|
414
|
+
};
|
|
415
|
+
// Attach immediately if form exists
|
|
416
|
+
attachFormListener();
|
|
417
|
+
// Watch for dynamic forms
|
|
418
|
+
this.formObserver = new MutationObserver(() => {
|
|
419
|
+
attachFormListener();
|
|
420
|
+
});
|
|
421
|
+
this.formObserver.observe(document.body, {
|
|
422
|
+
childList: true,
|
|
423
|
+
subtree: true,
|
|
424
|
+
});
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
/**
|
|
428
|
+
* Cleanup tracker
|
|
429
|
+
*/
|
|
430
|
+
destroy() {
|
|
431
|
+
if (this.formObserver) {
|
|
432
|
+
this.formObserver.disconnect();
|
|
433
|
+
this.formObserver = null;
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
/**
|
|
439
|
+
* Thred SDK - Browser tracking and lead enrichment
|
|
440
|
+
*/
|
|
441
|
+
const DEFAULT_BASE_URL = 'https://api.thred.dev/v1';
|
|
442
|
+
class ThredSDK {
|
|
443
|
+
constructor(options) {
|
|
444
|
+
this.initialized = false;
|
|
445
|
+
this.options = Object.assign({ baseUrl: DEFAULT_BASE_URL, debug: false, autoInit: true }, options);
|
|
446
|
+
this.logger = new Logger(this.options.debug);
|
|
447
|
+
this.fingerprint = new FingerprintManager(this.logger);
|
|
448
|
+
this.api = new ThredAPI(this.options.baseUrl, this.options.browserKey, this.logger);
|
|
449
|
+
this.tracker = new Tracker(this.api, this.fingerprint, this.logger);
|
|
450
|
+
if (this.options.autoInit) {
|
|
451
|
+
this.init();
|
|
452
|
+
}
|
|
453
|
+
}
|
|
454
|
+
/**
|
|
455
|
+
* Initialize the SDK
|
|
456
|
+
*/
|
|
457
|
+
init() {
|
|
458
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
459
|
+
if (this.initialized) {
|
|
460
|
+
this.logger.warn('SDK already initialized');
|
|
461
|
+
return;
|
|
462
|
+
}
|
|
463
|
+
this.logger.log('Initializing Thred SDK...');
|
|
464
|
+
// Check if from ChatGPT
|
|
465
|
+
if (!this.isFromChatGPT()) {
|
|
466
|
+
this.logger.log('Not from ChatGPT - skipping initialization');
|
|
467
|
+
return;
|
|
468
|
+
}
|
|
469
|
+
// Generate fingerprint
|
|
470
|
+
yield this.fingerprint.getFingerprint();
|
|
471
|
+
// Initialize tracker
|
|
472
|
+
yield this.tracker.init();
|
|
473
|
+
this.initialized = true;
|
|
474
|
+
this.logger.log('SDK initialized successfully');
|
|
475
|
+
});
|
|
476
|
+
}
|
|
477
|
+
/**
|
|
478
|
+
* Check if visitor is from ChatGPT
|
|
479
|
+
*/
|
|
480
|
+
isFromChatGPT() {
|
|
481
|
+
return isFromChatGPT();
|
|
482
|
+
}
|
|
483
|
+
/**
|
|
484
|
+
* Track page view
|
|
485
|
+
*/
|
|
486
|
+
trackPageView() {
|
|
487
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
488
|
+
yield this.tracker.trackPageView();
|
|
489
|
+
});
|
|
490
|
+
}
|
|
491
|
+
/**
|
|
492
|
+
* Track form submission
|
|
493
|
+
*/
|
|
494
|
+
trackFormSubmit(formData) {
|
|
495
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
496
|
+
yield this.tracker.trackFormSubmit(formData);
|
|
497
|
+
});
|
|
498
|
+
}
|
|
499
|
+
/**
|
|
500
|
+
* Identify user with lead data
|
|
501
|
+
*/
|
|
502
|
+
identify(leadData) {
|
|
503
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
504
|
+
yield this.tracker.identify(leadData);
|
|
505
|
+
});
|
|
506
|
+
}
|
|
507
|
+
/**
|
|
508
|
+
* Get current fingerprint
|
|
509
|
+
*/
|
|
510
|
+
getFingerprint() {
|
|
511
|
+
return this.fingerprint.getCachedFingerprint();
|
|
512
|
+
}
|
|
513
|
+
/**
|
|
514
|
+
* Destroy SDK instance and cleanup
|
|
515
|
+
*/
|
|
516
|
+
destroy() {
|
|
517
|
+
this.tracker.destroy();
|
|
518
|
+
this.fingerprint.clear();
|
|
519
|
+
this.initialized = false;
|
|
520
|
+
this.logger.log('SDK destroyed');
|
|
521
|
+
}
|
|
522
|
+
}
|
|
523
|
+
/**
|
|
524
|
+
* Auto-initialize if loaded as script tag with browserKey
|
|
525
|
+
*/
|
|
526
|
+
if (typeof window !== 'undefined') {
|
|
527
|
+
const browserKey = getBrowserKeyFromScript();
|
|
528
|
+
if (browserKey) {
|
|
529
|
+
const sdk = new ThredSDK({ browserKey });
|
|
530
|
+
window.Thred = sdk;
|
|
531
|
+
}
|
|
532
|
+
}
|
|
533
|
+
|
|
534
|
+
exports.ThredSDK = ThredSDK;
|
|
535
|
+
exports.default = ThredSDK;
|
|
536
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../node_modules/tslib/tslib.es6.js","../src/utils/logger.ts","../src/utils/detector.ts","../src/core/fingerprint.ts","../src/core/api.ts","../src/core/tracker.ts","../src/index.ts"],"sourcesContent":["/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise, SuppressedError, Symbol, Iterator */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\r\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\r\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\r\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\r\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\r\n var _, done = false;\r\n for (var i = decorators.length - 1; i >= 0; i--) {\r\n var context = {};\r\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\r\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\r\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\r\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\r\n if (kind === \"accessor\") {\r\n if (result === void 0) continue;\r\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\r\n if (_ = accept(result.get)) descriptor.get = _;\r\n if (_ = accept(result.set)) descriptor.set = _;\r\n if (_ = accept(result.init)) initializers.unshift(_);\r\n }\r\n else if (_ = accept(result)) {\r\n if (kind === \"field\") initializers.unshift(_);\r\n else descriptor[key] = _;\r\n }\r\n }\r\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\r\n done = true;\r\n};\r\n\r\nexport function __runInitializers(thisArg, initializers, value) {\r\n var useValue = arguments.length > 2;\r\n for (var i = 0; i < initializers.length; i++) {\r\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\r\n }\r\n return useValue ? value : void 0;\r\n};\r\n\r\nexport function __propKey(x) {\r\n return typeof x === \"symbol\" ? x : \"\".concat(x);\r\n};\r\n\r\nexport function __setFunctionName(f, name, prefix) {\r\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\r\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\r\n};\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === \"function\" ? Iterator : Object).prototype);\r\n return g.next = verb(0), g[\"throw\"] = verb(1), g[\"return\"] = verb(2), typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n var desc = Object.getOwnPropertyDescriptor(m, k);\r\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\r\n desc = { enumerable: true, get: function() { return m[k]; } };\r\n }\r\n Object.defineProperty(o, k2, desc);\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = Object.create((typeof AsyncIterator === \"function\" ? AsyncIterator : Object).prototype), verb(\"next\"), verb(\"throw\"), verb(\"return\", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }\r\n function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nvar ownKeys = function(o) {\r\n ownKeys = Object.getOwnPropertyNames || function (o) {\r\n var ar = [];\r\n for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;\r\n return ar;\r\n };\r\n return ownKeys(o);\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== \"default\") __createBinding(result, mod, k[i]);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\nexport function __classPrivateFieldIn(state, receiver) {\r\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\r\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\r\n}\r\n\r\nexport function __addDisposableResource(env, value, async) {\r\n if (value !== null && value !== void 0) {\r\n if (typeof value !== \"object\" && typeof value !== \"function\") throw new TypeError(\"Object expected.\");\r\n var dispose, inner;\r\n if (async) {\r\n if (!Symbol.asyncDispose) throw new TypeError(\"Symbol.asyncDispose is not defined.\");\r\n dispose = value[Symbol.asyncDispose];\r\n }\r\n if (dispose === void 0) {\r\n if (!Symbol.dispose) throw new TypeError(\"Symbol.dispose is not defined.\");\r\n dispose = value[Symbol.dispose];\r\n if (async) inner = dispose;\r\n }\r\n if (typeof dispose !== \"function\") throw new TypeError(\"Object not disposable.\");\r\n if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };\r\n env.stack.push({ value: value, dispose: dispose, async: async });\r\n }\r\n else if (async) {\r\n env.stack.push({ async: true });\r\n }\r\n return value;\r\n\r\n}\r\n\r\nvar _SuppressedError = typeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\r\n var e = new Error(message);\r\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\r\n};\r\n\r\nexport function __disposeResources(env) {\r\n function fail(e) {\r\n env.error = env.hasError ? new _SuppressedError(e, env.error, \"An error was suppressed during disposal.\") : e;\r\n env.hasError = true;\r\n }\r\n var r, s = 0;\r\n function next() {\r\n while (r = env.stack.pop()) {\r\n try {\r\n if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);\r\n if (r.dispose) {\r\n var result = r.dispose.call(r.value);\r\n if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });\r\n }\r\n else s |= 1;\r\n }\r\n catch (e) {\r\n fail(e);\r\n }\r\n }\r\n if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();\r\n if (env.hasError) throw env.error;\r\n }\r\n return next();\r\n}\r\n\r\nexport function __rewriteRelativeImportExtension(path, preserveJsx) {\r\n if (typeof path === \"string\" && /^\\.\\.?\\//.test(path)) {\r\n return path.replace(/\\.(tsx)$|((?:\\.d)?)((?:\\.[^./]+?)?)\\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {\r\n return tsx ? preserveJsx ? \".jsx\" : \".js\" : d && (!ext || !cm) ? m : (d + ext + \".\" + cm.toLowerCase() + \"js\");\r\n });\r\n }\r\n return path;\r\n}\r\n\r\nexport default {\r\n __extends: __extends,\r\n __assign: __assign,\r\n __rest: __rest,\r\n __decorate: __decorate,\r\n __param: __param,\r\n __esDecorate: __esDecorate,\r\n __runInitializers: __runInitializers,\r\n __propKey: __propKey,\r\n __setFunctionName: __setFunctionName,\r\n __metadata: __metadata,\r\n __awaiter: __awaiter,\r\n __generator: __generator,\r\n __createBinding: __createBinding,\r\n __exportStar: __exportStar,\r\n __values: __values,\r\n __read: __read,\r\n __spread: __spread,\r\n __spreadArrays: __spreadArrays,\r\n __spreadArray: __spreadArray,\r\n __await: __await,\r\n __asyncGenerator: __asyncGenerator,\r\n __asyncDelegator: __asyncDelegator,\r\n __asyncValues: __asyncValues,\r\n __makeTemplateObject: __makeTemplateObject,\r\n __importStar: __importStar,\r\n __importDefault: __importDefault,\r\n __classPrivateFieldGet: __classPrivateFieldGet,\r\n __classPrivateFieldSet: __classPrivateFieldSet,\r\n __classPrivateFieldIn: __classPrivateFieldIn,\r\n __addDisposableResource: __addDisposableResource,\r\n __disposeResources: __disposeResources,\r\n __rewriteRelativeImportExtension: __rewriteRelativeImportExtension,\r\n};\r\n","/**\n * Simple logger utility\n */\nexport class Logger {\n private debug: boolean;\n private prefix: string;\n\n constructor(debug = false, prefix = '[Thred]') {\n this.debug = debug;\n this.prefix = prefix;\n }\n\n log(...args: unknown[]) {\n if (this.debug) {\n console.log(this.prefix, ...args);\n }\n }\n\n warn(...args: unknown[]) {\n if (this.debug) {\n console.warn(this.prefix, ...args);\n }\n }\n\n error(...args: unknown[]) {\n console.error(this.prefix, ...args);\n }\n}\n","/**\n * Detects if the visitor came from ChatGPT\n */\nexport function isFromChatGPT(): boolean {\n if (typeof window === 'undefined') return false;\n\n const params = new URLSearchParams(window.location.search);\n const utmSource = params.get('utm_source')?.toLowerCase() || '';\n const referrer = document.referrer.toLowerCase();\n\n const isChatGPTRef =\n referrer.includes('chat.openai.com') || referrer.includes('chatgpt.com');\n const isChatGPTUtm =\n utmSource === 'chatgpt' ||\n utmSource.includes('chatgpt') ||\n utmSource === 'chat.openai' ||\n utmSource === 'openai';\n\n return isChatGPTUtm || isChatGPTRef;\n}\n\n/**\n * Gets the browser key from script tag if present\n */\nexport function getBrowserKeyFromScript(): string | null {\n if (typeof window === 'undefined' || typeof document === 'undefined') {\n return null;\n }\n\n const scripts = document.getElementsByTagName('script');\n\n for (const script of Array.from(scripts)) {\n if (script.src.includes('thred')) {\n try {\n const url = new URL(script.src);\n return url.searchParams.get('browserKey');\n } catch {\n // Invalid URL\n }\n }\n }\n\n return null;\n}\n","import type { FingerprintResult } from '../types';\nimport { Logger } from '../utils/logger';\n\nconst FP_PROXY_URL =\n 'https://thredproxy.com/35ZCuyzokuT1YGd8/Hm7KPMHUZ4duyPRj?apiKey=iyqKVLQt2560EQUyjfxa';\nconst FP_PROXY_ENDPOINT =\n 'https://thredproxy.com/35ZCuyzokuT1YGd8/qbWl4nqUSCIDTor4';\n\nexport class FingerprintManager {\n private fingerprint: string | null = null;\n private logger: Logger;\n private promise: Promise<string | null> | null = null;\n\n constructor(logger: Logger) {\n this.logger = logger;\n }\n\n /**\n * Get or generate fingerprint\n */\n async getFingerprint(): Promise<string | null> {\n // Return cached fingerprint\n if (this.fingerprint) {\n this.logger.log('Using cached fingerprint:', this.fingerprint);\n return this.fingerprint;\n }\n\n // Return existing promise if already loading\n if (this.promise) {\n return this.promise;\n }\n\n // Check global window cache\n if (\n typeof window !== 'undefined' &&\n (window as any).thredFingerprint\n ) {\n this.fingerprint = (window as any).thredFingerprint;\n this.logger.log('Using global fingerprint:', this.fingerprint);\n return this.fingerprint;\n }\n\n // Generate new fingerprint\n this.promise = this.generateFingerprint();\n return this.promise;\n }\n\n private async generateFingerprint(): Promise<string | null> {\n try {\n this.logger.log('Loading FingerprintJS...');\n\n const FingerprintJS = await import(FP_PROXY_URL);\n const fp = await FingerprintJS.load({\n endpoint: [FP_PROXY_ENDPOINT, FingerprintJS.defaultEndpoint],\n });\n\n const result: FingerprintResult = await fp.get();\n this.fingerprint = result.visitorId;\n\n // Cache globally\n if (typeof window !== 'undefined') {\n (window as any).thredFingerprint = this.fingerprint;\n }\n\n this.logger.log('Fingerprint generated:', this.fingerprint);\n return this.fingerprint;\n } catch (error) {\n this.logger.warn('Fingerprint generation failed:', error);\n return null;\n }\n }\n\n /**\n * Get cached fingerprint (synchronous)\n */\n getCachedFingerprint(): string | null {\n return this.fingerprint;\n }\n\n /**\n * Clear fingerprint cache\n */\n clear() {\n this.fingerprint = null;\n this.promise = null;\n if (typeof window !== 'undefined') {\n delete (window as any).thredFingerprint;\n }\n }\n}\n","import type {\n ThredConfig,\n PageViewPayload,\n EnrichPayload,\n} from '../types';\nimport { Logger } from '../utils/logger';\n\nexport class ThredAPI {\n private baseUrl: string;\n private browserKey: string;\n private logger: Logger;\n\n constructor(baseUrl: string, browserKey: string, logger: Logger) {\n this.baseUrl = baseUrl;\n this.browserKey = browserKey;\n this.logger = logger;\n }\n\n /**\n * Fetch configuration from API\n */\n async fetchConfig(): Promise<ThredConfig | null> {\n try {\n const url = `${this.baseUrl}/config?browserKey=${encodeURIComponent(this.browserKey)}`;\n this.logger.log('Fetching config from:', url);\n\n const response = await fetch(url, {\n method: 'GET',\n headers: {\n Accept: 'application/json',\n },\n });\n\n if (!response.ok) {\n throw new Error(`Config request failed: ${response.status}`);\n }\n\n const config = await response.json();\n this.logger.log('Config received:', config);\n\n return config;\n } catch (error) {\n this.logger.warn('Failed to fetch config:', error);\n return null;\n }\n }\n\n /**\n * Send page view event\n */\n async trackPageView(payload: PageViewPayload): Promise<void> {\n try {\n const url = `${this.baseUrl}/events/page-view?browserKey=${encodeURIComponent(this.browserKey)}`;\n this.logger.log('Tracking page view:', url);\n\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(payload),\n keepalive: true,\n });\n\n if (!response.ok) {\n throw new Error(`Page view request failed: ${response.status}`);\n }\n\n this.logger.log('Page view tracked successfully');\n } catch (error) {\n this.logger.warn('Failed to track page view:', error);\n }\n }\n\n /**\n * Send lead enrichment data\n */\n async enrichLead(payload: EnrichPayload): Promise<void> {\n try {\n const url = `${this.baseUrl}/customers/enrich?browserKey=${encodeURIComponent(this.browserKey)}`;\n this.logger.log('Enriching lead:', url);\n\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(payload),\n keepalive: true,\n });\n\n if (!response.ok) {\n throw new Error(`Enrich request failed: ${response.status}`);\n }\n\n this.logger.log('Lead enriched successfully');\n } catch (error) {\n this.logger.warn('Failed to enrich lead:', error);\n }\n }\n}\n","import type { ThredConfig, LeadData } from '../types';\nimport { Logger } from '../utils/logger';\nimport { ThredAPI } from './api';\nimport { FingerprintManager } from './fingerprint';\n\nexport class Tracker {\n private api: ThredAPI;\n private fingerprint: FingerprintManager;\n private logger: Logger;\n private config: ThredConfig | null = null;\n private formObserver: MutationObserver | null = null;\n\n constructor(\n api: ThredAPI,\n fingerprint: FingerprintManager,\n logger: Logger\n ) {\n this.api = api;\n this.fingerprint = fingerprint;\n this.logger = logger;\n }\n\n /**\n * Initialize tracker with config\n */\n async init(): Promise<void> {\n this.config = await this.api.fetchConfig();\n\n if (!this.config?.enabled) {\n this.logger.log('Tracking disabled by config');\n return;\n }\n\n // Track page view\n await this.trackPageView();\n\n // Setup form tracking\n this.setupFormTracking();\n }\n\n /**\n * Track page view event\n */\n async trackPageView(): Promise<void> {\n const fp = await this.fingerprint.getFingerprint();\n\n if (!fp) {\n this.logger.warn('Cannot track page view without fingerprint');\n return;\n }\n\n await this.api.trackPageView({\n event: 'page_view',\n data: {\n url: window.location.href,\n },\n fingerprint: fp,\n });\n }\n\n /**\n * Track form submission and enrich lead\n */\n async trackFormSubmit(formData: FormData): Promise<void> {\n if (!this.config || !this.config.emailId || !this.config.nameId) {\n this.logger.warn('Cannot track form - no config loaded');\n return;\n }\n\n const email = formData.get(this.config.emailId)?.toString().trim();\n const name = formData.get(this.config.nameId)?.toString().trim();\n\n let company: string | undefined = undefined;\n if (this.config.companyId) {\n company = formData.get(this.config.companyId)?.toString().trim();\n }\n\n this.logger.log('Form data extracted:', { email, name, company });\n\n if (!email || !name) {\n this.logger.warn('Missing required fields (email, name)');\n return;\n }\n\n await this.identify({\n name,\n email,\n company: company,\n discovery: true,\n });\n }\n\n /**\n * Identify user and enrich lead data\n */\n async identify(leadData: LeadData): Promise<void> {\n const fp = await this.fingerprint.getFingerprint();\n\n if (!fp) {\n this.logger.warn('Cannot identify without fingerprint');\n return;\n }\n\n await this.api.enrichLead({\n fingerprint: fp,\n leadData,\n });\n }\n\n /**\n * Setup automatic form tracking\n */\n private setupFormTracking(): void {\n if (!this.config || typeof document === 'undefined') {\n this.logger.warn('Cannot track form - no config or document');\n return;\n }\n\n if (this.config.type === 'hosted') {\n let hostedUrlBase = this.config.hostedUrlBase;\n if (!hostedUrlBase) {\n this.logger.warn('Cannot track form - no hosted URL base');\n return;\n }\n\n // Attach UTM parameter to links containing hostedUrlBase\n document.addEventListener('click', async (e) => {\n const target = (e.target as HTMLElement).closest('a');\n if (!target) return;\n\n const href = target.getAttribute('href');\n if (!href || !href.includes(hostedUrlBase!)) return;\n\n // Get fingerprint\n const fp = await this.fingerprint.getFingerprint();\n if (!fp) {\n this.logger.warn('Cannot add UTM parameter - no fingerprint');\n return;\n }\n\n // Parse URL and add utm_fp parameter\n try {\n const url = new URL(href, window.location.origin);\n url.searchParams.set('utm_fp', fp);\n \n // Update the href with the new URL\n target.setAttribute('href', url.toString());\n \n this.logger.log('Added utm_fp to link:', url.toString());\n } catch (err) {\n this.logger.warn('Failed to parse URL:', href, err);\n }\n }, { capture: true });\n \n return;\n }\n else if (this.config.type === 'custom') {\n const attachFormListener = () => {\n if (!this.config || !this.config.formId) {\n this.logger.warn('Cannot track form - no form ID');\n return;\n }\n const form = document.getElementById(this.config!.formId);\n if (!form) {\n this.logger.log('Form not found:', this.config!.formId);\n return;\n }\n\n const formElement = form as HTMLFormElement;\n\n // Check if already tracked\n if (formElement.dataset.thredTracked) {\n return;\n }\n\n this.logger.log('Attaching listener to form:', this.config!.formId);\n\n formElement.addEventListener(\n 'submit',\n () => {\n const formData = new FormData(formElement);\n this.trackFormSubmit(formData);\n },\n { capture: true }\n );\n\n formElement.dataset.thredTracked = 'true';\n };\n\n // Attach immediately if form exists\n attachFormListener();\n\n // Watch for dynamic forms\n this.formObserver = new MutationObserver(() => {\n attachFormListener();\n });\n\n this.formObserver.observe(document.body, {\n childList: true,\n subtree: true,\n });\n }\n }\n\n /**\n * Cleanup tracker\n */\n destroy(): void {\n if (this.formObserver) {\n this.formObserver.disconnect();\n this.formObserver = null;\n }\n }\n}\n","/**\n * Thred SDK - Browser tracking and lead enrichment\n */\n\nimport type { ThredOptions, ThredSDK as IThredSDK, LeadData } from './types';\nimport { Logger } from './utils/logger';\nimport { isFromChatGPT, getBrowserKeyFromScript } from './utils/detector';\nimport { FingerprintManager } from './core/fingerprint';\nimport { ThredAPI } from './core/api';\nimport { Tracker } from './core/tracker';\n\nexport * from './types';\n\nconst DEFAULT_BASE_URL = 'https://api.thred.dev/v1';\n\nexport class ThredSDK implements IThredSDK {\n private options: ThredOptions;\n private logger: Logger;\n private fingerprint: FingerprintManager;\n private api: ThredAPI;\n private tracker: Tracker;\n private initialized = false;\n\n constructor(options: ThredOptions) {\n this.options = {\n baseUrl: DEFAULT_BASE_URL,\n debug: false,\n autoInit: true,\n ...options,\n };\n\n this.logger = new Logger(this.options.debug);\n this.fingerprint = new FingerprintManager(this.logger);\n this.api = new ThredAPI(\n this.options.baseUrl!,\n this.options.browserKey,\n this.logger\n );\n this.tracker = new Tracker(this.api, this.fingerprint, this.logger);\n\n if (this.options.autoInit) {\n this.init();\n }\n }\n\n /**\n * Initialize the SDK\n */\n async init(): Promise<void> {\n if (this.initialized) {\n this.logger.warn('SDK already initialized');\n return;\n }\n\n this.logger.log('Initializing Thred SDK...');\n\n // Check if from ChatGPT\n if (!this.isFromChatGPT()) {\n this.logger.log('Not from ChatGPT - skipping initialization');\n return;\n }\n\n // Generate fingerprint\n await this.fingerprint.getFingerprint();\n\n // Initialize tracker\n await this.tracker.init();\n\n this.initialized = true;\n this.logger.log('SDK initialized successfully');\n }\n\n /**\n * Check if visitor is from ChatGPT\n */\n isFromChatGPT(): boolean {\n return isFromChatGPT();\n }\n\n /**\n * Track page view\n */\n async trackPageView(): Promise<void> {\n await this.tracker.trackPageView();\n }\n\n /**\n * Track form submission\n */\n async trackFormSubmit(formData: FormData): Promise<void> {\n await this.tracker.trackFormSubmit(formData);\n }\n\n /**\n * Identify user with lead data\n */\n async identify(leadData: LeadData): Promise<void> {\n await this.tracker.identify(leadData);\n }\n\n /**\n * Get current fingerprint\n */\n getFingerprint(): string | null {\n return this.fingerprint.getCachedFingerprint();\n }\n\n /**\n * Destroy SDK instance and cleanup\n */\n destroy(): void {\n this.tracker.destroy();\n this.fingerprint.clear();\n this.initialized = false;\n this.logger.log('SDK destroyed');\n }\n}\n\n/**\n * Auto-initialize if loaded as script tag with browserKey\n */\nif (typeof window !== 'undefined') {\n const browserKey = getBrowserKeyFromScript();\n if (browserKey) {\n const sdk = new ThredSDK({ browserKey });\n (window as any).Thred = sdk;\n }\n}\n\nexport default ThredSDK;\n"],"names":[],"mappings":"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","x_google_ignoreList":[0]}
|