@blossu/ui 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (69) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +460 -0
  3. package/dist/blossu.d.ts +34 -0
  4. package/dist/blossu.d.ts.map +1 -0
  5. package/dist/blossu.esm.js +2 -0
  6. package/dist/blossu.esm.js.map +1 -0
  7. package/dist/blossu.js +2 -0
  8. package/dist/blossu.js.map +1 -0
  9. package/dist/blossu.min.js +2 -0
  10. package/dist/blossu.min.js.map +1 -0
  11. package/dist/constants.d.ts +6 -0
  12. package/dist/constants.d.ts.map +1 -0
  13. package/dist/index.d.ts +8 -0
  14. package/dist/index.d.ts.map +1 -0
  15. package/dist/index.react.d.ts +4 -0
  16. package/dist/index.react.d.ts.map +1 -0
  17. package/dist/react/Analytics.d.ts +3 -0
  18. package/dist/react/Analytics.d.ts.map +1 -0
  19. package/dist/react/Loader.d.ts +8 -0
  20. package/dist/react/Loader.d.ts.map +1 -0
  21. package/dist/react/ReferralLink.d.ts +4 -0
  22. package/dist/react/ReferralLink.d.ts.map +1 -0
  23. package/dist/react/ReferralStats.d.ts +4 -0
  24. package/dist/react/ReferralStats.d.ts.map +1 -0
  25. package/dist/react/ReferralWidget.d.ts +4 -0
  26. package/dist/react/ReferralWidget.d.ts.map +1 -0
  27. package/dist/react/blossu.d.ts +34 -0
  28. package/dist/react/blossu.d.ts.map +1 -0
  29. package/dist/react/constants.d.ts +6 -0
  30. package/dist/react/constants.d.ts.map +1 -0
  31. package/dist/react/index.d.ts +8 -0
  32. package/dist/react/index.d.ts.map +1 -0
  33. package/dist/react/index.esm.js +2 -0
  34. package/dist/react/index.esm.js.map +1 -0
  35. package/dist/react/index.js +2 -0
  36. package/dist/react/index.js.map +1 -0
  37. package/dist/react/index.react.d.ts +4 -0
  38. package/dist/react/index.react.d.ts.map +1 -0
  39. package/dist/react/react/Analytics.d.ts +3 -0
  40. package/dist/react/react/Analytics.d.ts.map +1 -0
  41. package/dist/react/react/Loader.d.ts +8 -0
  42. package/dist/react/react/Loader.d.ts.map +1 -0
  43. package/dist/react/react/ReferralLink.d.ts +4 -0
  44. package/dist/react/react/ReferralLink.d.ts.map +1 -0
  45. package/dist/react/react/ReferralStats.d.ts +4 -0
  46. package/dist/react/react/ReferralStats.d.ts.map +1 -0
  47. package/dist/react/react/ReferralWidget.d.ts +4 -0
  48. package/dist/react/react/ReferralWidget.d.ts.map +1 -0
  49. package/dist/react/react/index.d.ts +9 -0
  50. package/dist/react/react/index.d.ts.map +1 -0
  51. package/dist/react/react/types.d.ts +76 -0
  52. package/dist/react/react/types.d.ts.map +1 -0
  53. package/dist/react/react/usePartner.d.ts +3 -0
  54. package/dist/react/react/usePartner.d.ts.map +1 -0
  55. package/dist/react/tracker.d.ts +53 -0
  56. package/dist/react/tracker.d.ts.map +1 -0
  57. package/dist/react/types.d.ts +51 -0
  58. package/dist/react/types.d.ts.map +1 -0
  59. package/dist/react/usePartner.d.ts +3 -0
  60. package/dist/react/usePartner.d.ts.map +1 -0
  61. package/dist/react/utils.d.ts +20 -0
  62. package/dist/react/utils.d.ts.map +1 -0
  63. package/dist/tracker.d.ts +53 -0
  64. package/dist/tracker.d.ts.map +1 -0
  65. package/dist/types.d.ts +51 -0
  66. package/dist/types.d.ts.map +1 -0
  67. package/dist/utils.d.ts +20 -0
  68. package/dist/utils.d.ts.map +1 -0
  69. package/package.json +97 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2023 SMASHSEND
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,460 @@
1
+ # @blossu/ui
2
+
3
+ Client-side tracking SDK for [Blossu](https://blossu.com) - the affiliate and referral tracking platform.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ npm install @blossu/ui
9
+ # or
10
+ yarn add @blossu/ui
11
+ # or
12
+ pnpm add @blossu/ui
13
+ ```
14
+
15
+ ## Quick Start
16
+
17
+ ```javascript
18
+ import { init } from "@blossu/ui";
19
+
20
+ // Initialize the SDK
21
+ const blossu = init({
22
+ apiKey: "your-api-key",
23
+ });
24
+
25
+ // The SDK automatically tracks referral codes from the URL (e.g., ?ref=PARTNER123)
26
+ // and stores them in a cookie for attribution
27
+ ```
28
+
29
+ ## Usage
30
+
31
+ ### Automatic Tracking
32
+
33
+ By default, the SDK automatically:
34
+
35
+ 1. Detects referral codes in the URL (e.g., `?ref=PARTNER123`)
36
+ 2. Saves the referral info in a cookie
37
+ 3. Tracks the click event
38
+
39
+ ```javascript
40
+ import { init } from "@blossu/ui";
41
+
42
+ init({
43
+ apiKey: "your-api-key",
44
+ trackingParam: "ref", // URL parameter to look for (default: 'ref')
45
+ autoTrack: true, // Enable automatic tracking (default: true)
46
+ });
47
+ ```
48
+
49
+ ### Track Signup
50
+
51
+ Track when a user signs up after being referred:
52
+
53
+ ```javascript
54
+ import { getClient } from "@blossu/ui";
55
+
56
+ const blossu = getClient();
57
+
58
+ // After user signs up
59
+ await blossu.signup({
60
+ email: "customer@example.com",
61
+ externalCustomerId: "user_123",
62
+ });
63
+ ```
64
+
65
+ ### Track Sale
66
+
67
+ Track a purchase/conversion:
68
+
69
+ ```javascript
70
+ await blossu.sale({
71
+ externalCustomerId: "user_123",
72
+ amount: 9900, // $99.00 in cents
73
+ currency: "USD",
74
+ provider: "stripe",
75
+ });
76
+ ```
77
+
78
+ ### Stripe Integration
79
+
80
+ Get the referral ID for Stripe Checkout:
81
+
82
+ ```javascript
83
+ import { getClient } from "@blossu/ui";
84
+
85
+ const blossu = getClient();
86
+
87
+ // For Stripe Checkout - pass as client_reference_id
88
+ const checkoutSession = await stripe.checkout.sessions.create({
89
+ // ... other options
90
+ client_reference_id: blossu.getStripeClientReferenceId(),
91
+ metadata: blossu.getStripeMetadata(),
92
+ });
93
+ ```
94
+
95
+ ### Access Referral Info
96
+
97
+ ```javascript
98
+ import { getClient } from "@blossu/ui";
99
+
100
+ const blossu = getClient();
101
+
102
+ // Check if user was referred
103
+ if (blossu.hasReferral()) {
104
+ console.log("Referral code:", blossu.getCode());
105
+ console.log("Referral ID:", blossu.getRefId());
106
+ }
107
+
108
+ // Get full referral info
109
+ const info = blossu.getReferralInfo();
110
+ // { code: 'partner123', refId: 'bls_abc123_xyz789', timestamp: 1704067200000 }
111
+
112
+ // Access globally
113
+ console.log(window.blossu_ref_id);
114
+ ```
115
+
116
+ ### Manual Click Tracking
117
+
118
+ If you need to manually track a click:
119
+
120
+ ```javascript
121
+ await blossu.trackClick("PARTNER123");
122
+ ```
123
+
124
+ ### Clear Referral
125
+
126
+ Clear the stored referral info:
127
+
128
+ ```javascript
129
+ blossu.clearReferral();
130
+ ```
131
+
132
+ ## Usage with React
133
+
134
+ ### Option 1: Pre-built Components (Recommended)
135
+
136
+ The easiest way to add referral functionality to your React app:
137
+
138
+ ```tsx
139
+ import { ReferralWidget } from "@blossu/ui/react";
140
+
141
+ function MyApp() {
142
+ const user = useUser(); // Your user hook
143
+
144
+ return (
145
+ <ReferralWidget
146
+ workspaceId="wks_xxx"
147
+ email={user.email}
148
+ signature={user.blossuSignature} // HMAC signature from your backend
149
+ theme="light"
150
+ primaryColor="#3b82f6"
151
+ />
152
+ );
153
+ }
154
+ ```
155
+
156
+ ### Option 2: Individual Components
157
+
158
+ Use individual components for more control:
159
+
160
+ ```tsx
161
+ import { ReferralLink, ReferralStats } from "@blossu/ui/react";
162
+
163
+ function MyReferralPage() {
164
+ return (
165
+ <div>
166
+ <h2>My Referral Program</h2>
167
+
168
+ <ReferralStats
169
+ clicks={120}
170
+ conversions={45}
171
+ revenue={450000} // in cents
172
+ />
173
+
174
+ <ReferralLink
175
+ code="FRIEND10"
176
+ destinationUrl="https://myapp.com"
177
+ label="Share your referral link"
178
+ showCopyButton={true}
179
+ />
180
+ </div>
181
+ );
182
+ }
183
+ ```
184
+
185
+ ### Option 3: Custom UI with Hook
186
+
187
+ Build completely custom UIs using the `usePartner` hook:
188
+
189
+ ```tsx
190
+ import { usePartner } from "@blossu/ui/react";
191
+
192
+ function CustomReferralUI() {
193
+ const {
194
+ partner,
195
+ codes,
196
+ stats,
197
+ isLoading,
198
+ error,
199
+ referralLink,
200
+ copyLink,
201
+ createCode,
202
+ } = usePartner({
203
+ workspaceId: "wks_xxx",
204
+ email: user.email,
205
+ signature: user.blossuSignature,
206
+ });
207
+
208
+ if (isLoading) return <div>Loading...</div>;
209
+ if (error) return <div>Error: {error}</div>;
210
+
211
+ return (
212
+ <div>
213
+ <h2>Welcome, {partner?.firstName}!</h2>
214
+ <p>You've earned: ${(partner?.totalEarned || 0) / 100}</p>
215
+
216
+ <div>
217
+ <h3>Stats</h3>
218
+ <p>Clicks: {stats?.clicks}</p>
219
+ <p>Conversions: {stats?.conversions}</p>
220
+ </div>
221
+
222
+ <div>
223
+ <h3>Your Codes</h3>
224
+ {codes.map((code) => (
225
+ <div key={code.id}>
226
+ <span>{code.code}</span>
227
+ <button onClick={() => copyLink(code.code)}>Copy Link</button>
228
+ </div>
229
+ ))}
230
+ </div>
231
+
232
+ <button onClick={() => createCode("newcode123", "My New Code")}>
233
+ Create New Code
234
+ </button>
235
+ </div>
236
+ );
237
+ }
238
+ ```
239
+
240
+ ### Option 4: Analytics Wrapper
241
+
242
+ For tracking only (no UI):
243
+
244
+ ```tsx
245
+ import { Analytics } from "@blossu/ui/react";
246
+
247
+ export default function RootLayout({ children }) {
248
+ return (
249
+ <html>
250
+ <body>
251
+ <Analytics publicKey={process.env.NEXT_PUBLIC_BLOSSU_KEY!}>
252
+ {children}
253
+ </Analytics>
254
+ </body>
255
+ </html>
256
+ );
257
+ }
258
+ ```
259
+
260
+ Then in your components:
261
+
262
+ ```tsx
263
+ import { getClient } from "@blossu/ui";
264
+
265
+ function SignupForm() {
266
+ const blossu = getClient();
267
+
268
+ const handleSignup = async (email: string) => {
269
+ // ... create user
270
+
271
+ // Track signup with Blossu
272
+ if (blossu?.hasReferral()) {
273
+ await blossu.signup({ email });
274
+ }
275
+ };
276
+
277
+ return <form>...</form>;
278
+ }
279
+ ```
280
+
281
+ ### Generating HMAC Signature (Backend)
282
+
283
+ For the widget and `usePartner` hook, you need to generate an HMAC signature on your backend:
284
+
285
+ ```typescript
286
+ // app/api/blossu-token/route.ts
287
+ import crypto from "crypto";
288
+ import { NextResponse } from "next/server";
289
+
290
+ export async function GET(req: Request) {
291
+ const user = await getCurrentUser(req); // Your auth logic
292
+
293
+ const signature = crypto
294
+ .createHmac("sha256", process.env.BLOSSU_SECRET_KEY!)
295
+ .update(user.email)
296
+ .digest("hex");
297
+
298
+ return NextResponse.json({
299
+ email: user.email,
300
+ signature,
301
+ });
302
+ }
303
+ ```
304
+
305
+ Then fetch it in your component:
306
+
307
+ ```tsx
308
+ function MyApp() {
309
+ const [auth, setAuth] = useState(null);
310
+
311
+ useEffect(() => {
312
+ fetch("/api/blossu-token")
313
+ .then((res) => res.json())
314
+ .then(setAuth);
315
+ }, []);
316
+
317
+ if (!auth) return <div>Loading...</div>;
318
+
319
+ return (
320
+ <ReferralWidget
321
+ workspaceId="wks_xxx"
322
+ email={auth.email}
323
+ signature={auth.signature}
324
+ />
325
+ );
326
+ }
327
+ ```
328
+
329
+ ## Usage with React (Manual Hook)
330
+
331
+ ```jsx
332
+ // hooks/useBlossu.ts
333
+ import { useEffect, useState } from 'react';
334
+ import { init, getClient, BlossuClient } from '@blossu/ui';
335
+
336
+ export function useBlossu() {
337
+ const [client, setClient] = useState<BlossuClient | null>(null);
338
+
339
+ useEffect(() => {
340
+ const blossu = init({
341
+ apiKey: process.env.NEXT_PUBLIC_BLOSSU_API_KEY!,
342
+ });
343
+ setClient(blossu);
344
+ }, []);
345
+
346
+ return client;
347
+ }
348
+
349
+ // Usage in component
350
+ function SignupForm() {
351
+ const blossu = useBlossu();
352
+
353
+ const handleSubmit = async (email: string) => {
354
+ // ... create user
355
+
356
+ // Track signup with Blossu
357
+ if (blossu?.hasReferral()) {
358
+ await blossu.signup({ email });
359
+ }
360
+ };
361
+
362
+ return <form>...</form>;
363
+ }
364
+ ```
365
+
366
+ ## Usage with Script Tag
367
+
368
+ You can also load the SDK via a script tag:
369
+
370
+ ```html
371
+ <script src="https://cdn.blossu.com/blossu.min.js"></script>
372
+ <script>
373
+ Blossu.init({
374
+ apiKey: "your-api-key",
375
+ });
376
+
377
+ // Later...
378
+ if (window.blossu.hasReferral()) {
379
+ console.log("Referred by:", window.blossu.getCode());
380
+ }
381
+ </script>
382
+ ```
383
+
384
+ ## Configuration Options
385
+
386
+ ```javascript
387
+ init({
388
+ // Required
389
+ apiKey: "your-api-key",
390
+
391
+ // Optional
392
+ apiUrl: "https://api.blossu.com", // API endpoint
393
+ trackingParam: "ref", // URL parameter for referral codes
394
+ cookieName: "blossu_ref", // Cookie name for storing referral info
395
+ cookieExpiryDays: 30, // How long to remember the referral
396
+ autoTrack: true, // Auto-track referral codes from URL
397
+ debug: false, // Enable debug logging
398
+ });
399
+ ```
400
+
401
+ ## API Reference
402
+
403
+ ### `init(config)`
404
+
405
+ Initialize the SDK and returns a `BlossuClient` instance.
406
+
407
+ ### `getClient()`
408
+
409
+ Get the current `BlossuClient` instance (after calling `init`).
410
+
411
+ ### `BlossuClient`
412
+
413
+ | Method | Description |
414
+ | ------------------------------ | ------------------------------- |
415
+ | `trackClick(code)` | Track a referral link click |
416
+ | `signup(data?)` | Track a signup/lead |
417
+ | `sale(data)` | Track a sale/conversion |
418
+ | `pageview()` | Track a page view |
419
+ | `hasReferral()` | Check if user has referral info |
420
+ | `getCode()` | Get the referral code |
421
+ | `getRefId()` | Get the unique referral ID |
422
+ | `getReferralInfo()` | Get full referral info object |
423
+ | `clearReferral()` | Clear stored referral info |
424
+ | `getStripeClientReferenceId()` | Get refId for Stripe checkout |
425
+ | `getStripeMetadata()` | Get metadata object for Stripe |
426
+
427
+ ## How It Works
428
+
429
+ 1. When a user visits your site with a referral link (e.g., `?ref=PARTNER123`), the SDK:
430
+
431
+ - Extracts the referral code
432
+ - Generates a unique `blossu_ref_id`
433
+ - Stores both in a cookie
434
+ - Sends a click event to Blossu
435
+
436
+ 2. When the user converts (signup, purchase):
437
+
438
+ - Use the SDK to track the event
439
+ - The `blossu_ref_id` links the conversion to the original click
440
+
441
+ 3. For Stripe payments:
442
+ - Pass `getStripeClientReferenceId()` as `client_reference_id` in Checkout
443
+ - Blossu's webhook handler will automatically attribute the payment
444
+
445
+ ## TypeScript Support
446
+
447
+ This SDK is written in TypeScript and provides full type definitions:
448
+
449
+ ```typescript
450
+ import type {
451
+ BlossuConfig,
452
+ ReferralInfo,
453
+ TrackSignupData,
454
+ TrackSaleData,
455
+ } from "@blossu/ui";
456
+ ```
457
+
458
+ ## License
459
+
460
+ MIT
@@ -0,0 +1,34 @@
1
+ import { BlossuConfig, ReferralInfo, TrackSignupData, TrackSaleData, PublicReferralInfo } from './types';
2
+ declare global {
3
+ interface Window {
4
+ blossu: BlossuClient;
5
+ blossu_ref_id?: string;
6
+ }
7
+ }
8
+ export declare class BlossuClient {
9
+ private config;
10
+ private tracker;
11
+ private initialized;
12
+ private referralInfo;
13
+ constructor(config: BlossuConfig);
14
+ private log;
15
+ private exposeToWindow;
16
+ private loadReferralInfo;
17
+ private autoTrackReferral;
18
+ getRefId(): string | null;
19
+ getCode(): string | null;
20
+ getReferralInfo(): ReferralInfo | null;
21
+ hasReferral(): boolean;
22
+ clearReferral(): void;
23
+ trackClick(code: string): Promise<boolean>;
24
+ signup(data?: TrackSignupData): Promise<boolean>;
25
+ sale(data: TrackSaleData): Promise<boolean>;
26
+ pageview(): Promise<boolean>;
27
+ getStripeClientReferenceId(): string | null;
28
+ getStripeMetadata(): Record<string, string>;
29
+ getPartnerInfo(code: string): Promise<PublicReferralInfo | null>;
30
+ getProgramSlug(): string;
31
+ }
32
+ export declare function init(config: BlossuConfig): BlossuClient;
33
+ export declare function getClient(): BlossuClient | null;
34
+ //# sourceMappingURL=blossu.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blossu.d.ts","sourceRoot":"","sources":["../src/blossu.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,YAAY,EACZ,eAAe,EACf,aAAa,EACb,kBAAkB,EACnB,MAAM,SAAS,CAAC;AAKjB,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,MAAM;QACd,MAAM,EAAE,YAAY,CAAC;QACrB,aAAa,CAAC,EAAE,MAAM,CAAC;KACxB;CACF;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAyB;IACvC,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,WAAW,CAAkB;IACrC,OAAO,CAAC,YAAY,CAA6B;gBAErC,MAAM,EAAE,YAAY;IA0BhC,OAAO,CAAC,GAAG;IAMX,OAAO,CAAC,cAAc;IAStB,OAAO,CAAC,gBAAgB;IAOxB,OAAO,CAAC,iBAAiB;IAUzB,QAAQ,IAAI,MAAM,GAAG,IAAI;IAIzB,OAAO,IAAI,MAAM,GAAG,IAAI;IAIxB,eAAe,IAAI,YAAY,GAAG,IAAI;IAItC,WAAW,IAAI,OAAO;IAItB,aAAa,IAAI,IAAI;IASf,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAmB1C,MAAM,CAAC,IAAI,GAAE,eAAoB,GAAG,OAAO,CAAC,OAAO,CAAC;IAiBpD,IAAI,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC;IAmB3C,QAAQ,IAAI,OAAO,CAAC,OAAO,CAAC;IAWlC,0BAA0B,IAAI,MAAM,GAAG,IAAI;IAI3C,iBAAiB,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAWrC,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC;IAuBtE,cAAc,IAAI,MAAM;CAGzB;AAID,wBAAgB,IAAI,CAAC,MAAM,EAAE,YAAY,GAAG,YAAY,CAGvD;AAED,wBAAgB,SAAS,IAAI,YAAY,GAAG,IAAI,CAE/C"}
@@ -0,0 +1,2 @@
1
+ const e="0.1.0",r="https://api.blossu.com",t="blossu_ref",n=30,o="ref";function i(){return`bls_${Date.now().toString(36)}_${Math.random().toString(36).substring(2,10)}`}function a(e,r,t){if("undefined"==typeof document)return;const n=new Date;n.setTime(n.getTime()+24*t*60*60*1e3);const o="https:"===window.location.protocol?"; Secure":"";document.cookie=`${e}=${encodeURIComponent(r)}; expires=${n.toUTCString()}; path=/; SameSite=Lax${o}`}function s(e){if("undefined"==typeof document)return null;const r=`${e}=`,t=document.cookie.split(";");for(let e=0;e<t.length;e++){let n=t[e];for(;" "===n.charAt(0);)n=n.substring(1,n.length);if(0===n.indexOf(r))return decodeURIComponent(n.substring(r.length,n.length))}return null}function f(e){"undefined"!=typeof document&&(document.cookie=`${e}=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;`)}function l(e){if("undefined"==typeof window)return null;return new URLSearchParams(window.location.search).get(e)}function c(e,r=t,n=30){const o=i(),s={code:e.toLowerCase(),refId:o,timestamp:Date.now()};return a(r,JSON.stringify(s),n),s}function u(e=t){const r=s(e);if(!r)return null;try{return JSON.parse(r)}catch{return null}}function d(e=t){f(e)}function g(){return"undefined"==typeof navigator?{userAgent:"",language:"",timezone:""}:{userAgent:navigator.userAgent||"",language:navigator.language||"",timezone:Intl?.DateTimeFormat?.()?.resolvedOptions?.()?.timeZone||""}}function h(){return"undefined"==typeof window||"undefined"==typeof document?{url:"",referrer:"",title:""}:{url:window.location.href,referrer:document.referrer||"",title:document.title||""}}class p{constructor(e){this.config={apiUrl:e.apiUrl||r,programSlug:e.programSlug,debug:e.debug||!1}}log(...e){this.config.debug&&console.log("[Blossu]",...e)}getEndpoint(e){return`${this.config.apiUrl}/v1/track/${e}`}getMeta(){const r="undefined"!=typeof window;return{url:r?window.location.href:"",referrer:r?document.referrer:"",userAgent:r?navigator.userAgent:"",language:r?navigator.language:"",timezone:r&&Intl?.DateTimeFormat?.()?.resolvedOptions?.()?.timeZone||"",timestamp:Date.now(),sdkVersion:e}}async send(e,r){const t={event:e,data:r,meta:this.getMeta()};this.log("Sending event:",e,t);const n=this.getEndpoint(e),o=JSON.stringify(t);if("undefined"!=typeof navigator&&navigator.sendBeacon){const e=new Blob([o],{type:"application/json"});try{const r=navigator.sendBeacon(n,e);return this.log("sendBeacon result:",r),r}catch(e){this.log("sendBeacon failed, falling back to fetch:",e)}}try{const e=await fetch(n,{method:"POST",headers:{"Content-Type":"application/json"},body:o,keepalive:!0});return this.log("fetch response:",e.status),e.ok}catch(e){return this.log("fetch error:",e),!1}}trackClick(e){return this.send("click",e)}trackSignup(e){return this.send("signup",e)}trackSale(e){return this.send("sale",e)}trackPageview(e){return this.send("pageview",e)}}class m{constructor(e){this.initialized=!1,this.referralInfo=null,this.config={programSlug:e.programSlug,apiUrl:e.apiUrl||r,trackingParam:e.trackingParam||"ref",cookieName:e.cookieName||t,cookieExpiryDays:e.cookieExpiryDays||30,debug:e.debug||!1,autoTrack:!1!==e.autoTrack},this.tracker=new p({apiUrl:this.config.apiUrl,programSlug:this.config.programSlug,debug:this.config.debug}),this.loadReferralInfo(),this.config.autoTrack&&this.autoTrackReferral(),this.exposeToWindow()}log(...e){this.config.debug&&console.log("[Blossu]",...e)}exposeToWindow(){"undefined"!=typeof window&&(window.blossu=this,this.referralInfo&&(window.blossu_ref_id=this.referralInfo.refId))}loadReferralInfo(){this.referralInfo=u(this.config.cookieName),this.referralInfo&&this.log("Loaded referral info from cookie:",this.referralInfo)}autoTrackReferral(){if("undefined"==typeof window)return;const e=l(this.config.trackingParam);e&&e!==this.referralInfo?.code&&(this.log("Detected referral code in URL:",e),this.trackClick(e))}getRefId(){return this.referralInfo?.refId||null}getCode(){return this.referralInfo?.code||null}getReferralInfo(){return this.referralInfo}hasReferral(){return null!==this.referralInfo}clearReferral(){d(this.config.cookieName),this.referralInfo=null,"undefined"!=typeof window&&delete window.blossu_ref_id,this.log("Cleared referral info")}async trackClick(e){return this.referralInfo=c(e,this.config.cookieName,this.config.cookieExpiryDays),"undefined"!=typeof window&&(window.blossu_ref_id=this.referralInfo.refId),this.log("Tracking click for code:",e,"refId:",this.referralInfo.refId),this.tracker.trackClick({code:this.referralInfo.code,refId:this.referralInfo.refId})}async signup(e={}){return this.referralInfo?(this.log("Tracking signup:",e),this.tracker.trackSignup({code:this.referralInfo.code,refId:this.referralInfo.refId,email:e.email,externalCustomerId:e.externalCustomerId,metadata:e.metadata})):(this.log("No referral info, skipping signup tracking"),!1)}async sale(e){return this.referralInfo?(this.log("Tracking sale:",e),this.tracker.trackSale({code:this.referralInfo.code,refId:this.referralInfo.refId,externalCustomerId:e.externalCustomerId,amount:e.amount,currency:e.currency,provider:e.provider||"custom",metadata:e.metadata})):(this.log("No referral info, skipping sale tracking"),!1)}async pageview(){return!!this.referralInfo&&this.tracker.trackPageview({code:this.referralInfo.code,refId:this.referralInfo.refId})}getStripeClientReferenceId(){return this.referralInfo?.refId||null}getStripeMetadata(){return this.referralInfo?{blossu_ref_id:this.referralInfo.refId,blossu_code:this.referralInfo.code}:{}}async getPartnerInfo(e){const r=`${this.config.apiUrl}/v1/public/programs/${this.config.programSlug}/referral/${encodeURIComponent(e)}`;try{const t=await fetch(r);if(!t.ok){if(404===t.status)return this.log("Partner info not found for code:",e),null;throw new Error(`HTTP error! status: ${t.status}`)}const n=await t.json();return this.log("Fetched partner info:",n),n}catch(e){return this.log("Error fetching partner info:",e),null}}getProgramSlug(){return this.config.programSlug}}let I=null;function k(e){return I=new m(e),I}function w(){return I}export{m as BlossuClient,n as COOKIE_EXPIRY_DAYS,t as COOKIE_NAME,r as DEFAULT_API_URL,o as TRACKING_PARAM,p as Tracker,e as VERSION,d as clearReferralInfo,m as default,f as deleteCookie,i as generateRefId,g as getBrowserInfo,w as getClient,s as getCookie,h as getPageInfo,u as getReferralInfo,l as getUrlParam,k as init,c as saveReferralInfo,a as setCookie};
2
+ //# sourceMappingURL=blossu.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blossu.esm.js","sources":["../src/constants.ts","../src/utils.ts","../src/tracker.ts","../src/blossu.ts"],"sourcesContent":[null,null,null,null],"names":["VERSION","DEFAULT_API_URL","COOKIE_NAME","COOKIE_EXPIRY_DAYS","TRACKING_PARAM","generateRefId","Date","now","toString","Math","random","substring","setCookie","name","value","days","document","expires","setTime","getTime","secure","window","location","protocol","cookie","encodeURIComponent","toUTCString","getCookie","nameEQ","cookies","split","i","length","charAt","indexOf","decodeURIComponent","deleteCookie","getUrlParam","param","URLSearchParams","search","get","saveReferralInfo","code","cookieName","expiryDays","refId","info","toLowerCase","timestamp","JSON","stringify","getReferralInfo","parse","clearReferralInfo","getBrowserInfo","navigator","userAgent","language","timezone","Intl","DateTimeFormat","resolvedOptions","timeZone","getPageInfo","url","referrer","title","href","Tracker","constructor","config","this","apiUrl","programSlug","debug","log","args","console","getEndpoint","event","getMeta","isBrowser","sdkVersion","send","data","payload","meta","endpoint","body","sendBeacon","blob","Blob","type","success","error","response","fetch","method","headers","keepalive","status","ok","trackClick","trackSignup","trackSale","trackPageview","BlossuClient","initialized","referralInfo","trackingParam","cookieExpiryDays","autoTrack","tracker","loadReferralInfo","autoTrackReferral","exposeToWindow","blossu","blossu_ref_id","getRefId","getCode","hasReferral","clearReferral","signup","email","externalCustomerId","metadata","sale","amount","currency","provider","pageview","getStripeClientReferenceId","getStripeMetadata","blossu_code","getPartnerInfo","Error","json","getProgramSlug","defaultClient","init","getClient"],"mappings":"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"}
package/dist/blossu.js ADDED
@@ -0,0 +1,2 @@
1
+ !function(e,r){"object"==typeof exports&&"undefined"!=typeof module?r(exports):"function"==typeof define&&define.amd?define(["exports"],r):r((e="undefined"!=typeof globalThis?globalThis:e||self).Blossu={})}(this,(function(e){"use strict";const r="0.1.0",t="https://api.blossu.com",n="blossu_ref";function o(){return`bls_${Date.now().toString(36)}_${Math.random().toString(36).substring(2,10)}`}function i(e,r,t){if("undefined"==typeof document)return;const n=new Date;n.setTime(n.getTime()+24*t*60*60*1e3);const o="https:"===window.location.protocol?"; Secure":"";document.cookie=`${e}=${encodeURIComponent(r)}; expires=${n.toUTCString()}; path=/; SameSite=Lax${o}`}function a(e){if("undefined"==typeof document)return null;const r=`${e}=`,t=document.cookie.split(";");for(let e=0;e<t.length;e++){let n=t[e];for(;" "===n.charAt(0);)n=n.substring(1,n.length);if(0===n.indexOf(r))return decodeURIComponent(n.substring(r.length,n.length))}return null}function s(e){"undefined"!=typeof document&&(document.cookie=`${e}=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;`)}function f(e){if("undefined"==typeof window)return null;return new URLSearchParams(window.location.search).get(e)}function l(e,r=n,t=30){const a=o(),s={code:e.toLowerCase(),refId:a,timestamp:Date.now()};return i(r,JSON.stringify(s),t),s}function c(e=n){const r=a(e);if(!r)return null;try{return JSON.parse(r)}catch{return null}}function u(e=n){s(e)}class d{constructor(e){this.config={apiUrl:e.apiUrl||t,programSlug:e.programSlug,debug:e.debug||!1}}log(...e){this.config.debug&&console.log("[Blossu]",...e)}getEndpoint(e){return`${this.config.apiUrl}/v1/track/${e}`}getMeta(){const e="undefined"!=typeof window;return{url:e?window.location.href:"",referrer:e?document.referrer:"",userAgent:e?navigator.userAgent:"",language:e?navigator.language:"",timezone:e&&Intl?.DateTimeFormat?.()?.resolvedOptions?.()?.timeZone||"",timestamp:Date.now(),sdkVersion:r}}async send(e,r){const t={event:e,data:r,meta:this.getMeta()};this.log("Sending event:",e,t);const n=this.getEndpoint(e),o=JSON.stringify(t);if("undefined"!=typeof navigator&&navigator.sendBeacon){const e=new Blob([o],{type:"application/json"});try{const r=navigator.sendBeacon(n,e);return this.log("sendBeacon result:",r),r}catch(e){this.log("sendBeacon failed, falling back to fetch:",e)}}try{const e=await fetch(n,{method:"POST",headers:{"Content-Type":"application/json"},body:o,keepalive:!0});return this.log("fetch response:",e.status),e.ok}catch(e){return this.log("fetch error:",e),!1}}trackClick(e){return this.send("click",e)}trackSignup(e){return this.send("signup",e)}trackSale(e){return this.send("sale",e)}trackPageview(e){return this.send("pageview",e)}}class g{constructor(e){this.initialized=!1,this.referralInfo=null,this.config={programSlug:e.programSlug,apiUrl:e.apiUrl||t,trackingParam:e.trackingParam||"ref",cookieName:e.cookieName||n,cookieExpiryDays:e.cookieExpiryDays||30,debug:e.debug||!1,autoTrack:!1!==e.autoTrack},this.tracker=new d({apiUrl:this.config.apiUrl,programSlug:this.config.programSlug,debug:this.config.debug}),this.loadReferralInfo(),this.config.autoTrack&&this.autoTrackReferral(),this.exposeToWindow()}log(...e){this.config.debug&&console.log("[Blossu]",...e)}exposeToWindow(){"undefined"!=typeof window&&(window.blossu=this,this.referralInfo&&(window.blossu_ref_id=this.referralInfo.refId))}loadReferralInfo(){this.referralInfo=c(this.config.cookieName),this.referralInfo&&this.log("Loaded referral info from cookie:",this.referralInfo)}autoTrackReferral(){if("undefined"==typeof window)return;const e=f(this.config.trackingParam);e&&e!==this.referralInfo?.code&&(this.log("Detected referral code in URL:",e),this.trackClick(e))}getRefId(){return this.referralInfo?.refId||null}getCode(){return this.referralInfo?.code||null}getReferralInfo(){return this.referralInfo}hasReferral(){return null!==this.referralInfo}clearReferral(){u(this.config.cookieName),this.referralInfo=null,"undefined"!=typeof window&&delete window.blossu_ref_id,this.log("Cleared referral info")}async trackClick(e){return this.referralInfo=l(e,this.config.cookieName,this.config.cookieExpiryDays),"undefined"!=typeof window&&(window.blossu_ref_id=this.referralInfo.refId),this.log("Tracking click for code:",e,"refId:",this.referralInfo.refId),this.tracker.trackClick({code:this.referralInfo.code,refId:this.referralInfo.refId})}async signup(e={}){return this.referralInfo?(this.log("Tracking signup:",e),this.tracker.trackSignup({code:this.referralInfo.code,refId:this.referralInfo.refId,email:e.email,externalCustomerId:e.externalCustomerId,metadata:e.metadata})):(this.log("No referral info, skipping signup tracking"),!1)}async sale(e){return this.referralInfo?(this.log("Tracking sale:",e),this.tracker.trackSale({code:this.referralInfo.code,refId:this.referralInfo.refId,externalCustomerId:e.externalCustomerId,amount:e.amount,currency:e.currency,provider:e.provider||"custom",metadata:e.metadata})):(this.log("No referral info, skipping sale tracking"),!1)}async pageview(){return!!this.referralInfo&&this.tracker.trackPageview({code:this.referralInfo.code,refId:this.referralInfo.refId})}getStripeClientReferenceId(){return this.referralInfo?.refId||null}getStripeMetadata(){return this.referralInfo?{blossu_ref_id:this.referralInfo.refId,blossu_code:this.referralInfo.code}:{}}async getPartnerInfo(e){const r=`${this.config.apiUrl}/v1/public/programs/${this.config.programSlug}/referral/${encodeURIComponent(e)}`;try{const t=await fetch(r);if(!t.ok){if(404===t.status)return this.log("Partner info not found for code:",e),null;throw new Error(`HTTP error! status: ${t.status}`)}const n=await t.json();return this.log("Fetched partner info:",n),n}catch(e){return this.log("Error fetching partner info:",e),null}}getProgramSlug(){return this.config.programSlug}}let h=null;e.BlossuClient=g,e.COOKIE_EXPIRY_DAYS=30,e.COOKIE_NAME=n,e.DEFAULT_API_URL=t,e.TRACKING_PARAM="ref",e.Tracker=d,e.VERSION=r,e.clearReferralInfo=u,e.default=g,e.deleteCookie=s,e.generateRefId=o,e.getBrowserInfo=function(){return"undefined"==typeof navigator?{userAgent:"",language:"",timezone:""}:{userAgent:navigator.userAgent||"",language:navigator.language||"",timezone:Intl?.DateTimeFormat?.()?.resolvedOptions?.()?.timeZone||""}},e.getClient=function(){return h},e.getCookie=a,e.getPageInfo=function(){return"undefined"==typeof window||"undefined"==typeof document?{url:"",referrer:"",title:""}:{url:window.location.href,referrer:document.referrer||"",title:document.title||""}},e.getReferralInfo=c,e.getUrlParam=f,e.init=function(e){return h=new g(e),h},e.saveReferralInfo=l,e.setCookie=i,Object.defineProperty(e,"__esModule",{value:!0})}));
2
+ //# sourceMappingURL=blossu.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blossu.js","sources":["../src/constants.ts","../src/utils.ts","../src/tracker.ts","../src/blossu.ts"],"sourcesContent":[null,null,null,null],"names":["VERSION","DEFAULT_API_URL","COOKIE_NAME","generateRefId","Date","now","toString","Math","random","substring","setCookie","name","value","days","document","expires","setTime","getTime","secure","window","location","protocol","cookie","encodeURIComponent","toUTCString","getCookie","nameEQ","cookies","split","i","length","charAt","indexOf","decodeURIComponent","deleteCookie","getUrlParam","param","URLSearchParams","search","get","saveReferralInfo","code","cookieName","expiryDays","refId","info","toLowerCase","timestamp","JSON","stringify","getReferralInfo","parse","clearReferralInfo","Tracker","constructor","config","this","apiUrl","programSlug","debug","log","args","console","getEndpoint","event","getMeta","isBrowser","url","href","referrer","userAgent","navigator","language","timezone","Intl","DateTimeFormat","resolvedOptions","timeZone","sdkVersion","send","data","payload","meta","endpoint","body","sendBeacon","blob","Blob","type","success","error","response","fetch","method","headers","keepalive","status","ok","trackClick","trackSignup","trackSale","trackPageview","BlossuClient","initialized","referralInfo","trackingParam","cookieExpiryDays","autoTrack","tracker","loadReferralInfo","autoTrackReferral","exposeToWindow","blossu","blossu_ref_id","getRefId","getCode","hasReferral","clearReferral","signup","email","externalCustomerId","metadata","sale","amount","currency","provider","pageview","getStripeClientReferenceId","getStripeMetadata","blossu_code","getPartnerInfo","Error","json","getProgramSlug","defaultClient","title"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ var Blossu=function(e){"use strict";const r="0.1.0",t="https://api.blossu.com",n="blossu_ref";function o(){return`bls_${Date.now().toString(36)}_${Math.random().toString(36).substring(2,10)}`}function i(e,r,t){if("undefined"==typeof document)return;const n=new Date;n.setTime(n.getTime()+24*t*60*60*1e3);const o="https:"===window.location.protocol?"; Secure":"";document.cookie=`${e}=${encodeURIComponent(r)}; expires=${n.toUTCString()}; path=/; SameSite=Lax${o}`}function a(e){if("undefined"==typeof document)return null;const r=`${e}=`,t=document.cookie.split(";");for(let e=0;e<t.length;e++){let n=t[e];for(;" "===n.charAt(0);)n=n.substring(1,n.length);if(0===n.indexOf(r))return decodeURIComponent(n.substring(r.length,n.length))}return null}function s(e){"undefined"!=typeof document&&(document.cookie=`${e}=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;`)}function f(e){if("undefined"==typeof window)return null;return new URLSearchParams(window.location.search).get(e)}function l(e,r=n,t=30){const a=o(),s={code:e.toLowerCase(),refId:a,timestamp:Date.now()};return i(r,JSON.stringify(s),t),s}function c(e=n){const r=a(e);if(!r)return null;try{return JSON.parse(r)}catch{return null}}function u(e=n){s(e)}class d{constructor(e){this.config={apiUrl:e.apiUrl||t,programSlug:e.programSlug,debug:e.debug||!1}}log(...e){this.config.debug&&console.log("[Blossu]",...e)}getEndpoint(e){return`${this.config.apiUrl}/v1/track/${e}`}getMeta(){const e="undefined"!=typeof window;return{url:e?window.location.href:"",referrer:e?document.referrer:"",userAgent:e?navigator.userAgent:"",language:e?navigator.language:"",timezone:e&&Intl?.DateTimeFormat?.()?.resolvedOptions?.()?.timeZone||"",timestamp:Date.now(),sdkVersion:r}}async send(e,r){const t={event:e,data:r,meta:this.getMeta()};this.log("Sending event:",e,t);const n=this.getEndpoint(e),o=JSON.stringify(t);if("undefined"!=typeof navigator&&navigator.sendBeacon){const e=new Blob([o],{type:"application/json"});try{const r=navigator.sendBeacon(n,e);return this.log("sendBeacon result:",r),r}catch(e){this.log("sendBeacon failed, falling back to fetch:",e)}}try{const e=await fetch(n,{method:"POST",headers:{"Content-Type":"application/json"},body:o,keepalive:!0});return this.log("fetch response:",e.status),e.ok}catch(e){return this.log("fetch error:",e),!1}}trackClick(e){return this.send("click",e)}trackSignup(e){return this.send("signup",e)}trackSale(e){return this.send("sale",e)}trackPageview(e){return this.send("pageview",e)}}class g{constructor(e){this.initialized=!1,this.referralInfo=null,this.config={programSlug:e.programSlug,apiUrl:e.apiUrl||t,trackingParam:e.trackingParam||"ref",cookieName:e.cookieName||n,cookieExpiryDays:e.cookieExpiryDays||30,debug:e.debug||!1,autoTrack:!1!==e.autoTrack},this.tracker=new d({apiUrl:this.config.apiUrl,programSlug:this.config.programSlug,debug:this.config.debug}),this.loadReferralInfo(),this.config.autoTrack&&this.autoTrackReferral(),this.exposeToWindow()}log(...e){this.config.debug&&console.log("[Blossu]",...e)}exposeToWindow(){"undefined"!=typeof window&&(window.blossu=this,this.referralInfo&&(window.blossu_ref_id=this.referralInfo.refId))}loadReferralInfo(){this.referralInfo=c(this.config.cookieName),this.referralInfo&&this.log("Loaded referral info from cookie:",this.referralInfo)}autoTrackReferral(){if("undefined"==typeof window)return;const e=f(this.config.trackingParam);e&&e!==this.referralInfo?.code&&(this.log("Detected referral code in URL:",e),this.trackClick(e))}getRefId(){return this.referralInfo?.refId||null}getCode(){return this.referralInfo?.code||null}getReferralInfo(){return this.referralInfo}hasReferral(){return null!==this.referralInfo}clearReferral(){u(this.config.cookieName),this.referralInfo=null,"undefined"!=typeof window&&delete window.blossu_ref_id,this.log("Cleared referral info")}async trackClick(e){return this.referralInfo=l(e,this.config.cookieName,this.config.cookieExpiryDays),"undefined"!=typeof window&&(window.blossu_ref_id=this.referralInfo.refId),this.log("Tracking click for code:",e,"refId:",this.referralInfo.refId),this.tracker.trackClick({code:this.referralInfo.code,refId:this.referralInfo.refId})}async signup(e={}){return this.referralInfo?(this.log("Tracking signup:",e),this.tracker.trackSignup({code:this.referralInfo.code,refId:this.referralInfo.refId,email:e.email,externalCustomerId:e.externalCustomerId,metadata:e.metadata})):(this.log("No referral info, skipping signup tracking"),!1)}async sale(e){return this.referralInfo?(this.log("Tracking sale:",e),this.tracker.trackSale({code:this.referralInfo.code,refId:this.referralInfo.refId,externalCustomerId:e.externalCustomerId,amount:e.amount,currency:e.currency,provider:e.provider||"custom",metadata:e.metadata})):(this.log("No referral info, skipping sale tracking"),!1)}async pageview(){return!!this.referralInfo&&this.tracker.trackPageview({code:this.referralInfo.code,refId:this.referralInfo.refId})}getStripeClientReferenceId(){return this.referralInfo?.refId||null}getStripeMetadata(){return this.referralInfo?{blossu_ref_id:this.referralInfo.refId,blossu_code:this.referralInfo.code}:{}}async getPartnerInfo(e){const r=`${this.config.apiUrl}/v1/public/programs/${this.config.programSlug}/referral/${encodeURIComponent(e)}`;try{const t=await fetch(r);if(!t.ok){if(404===t.status)return this.log("Partner info not found for code:",e),null;throw new Error(`HTTP error! status: ${t.status}`)}const n=await t.json();return this.log("Fetched partner info:",n),n}catch(e){return this.log("Error fetching partner info:",e),null}}getProgramSlug(){return this.config.programSlug}}let h=null;return e.BlossuClient=g,e.COOKIE_EXPIRY_DAYS=30,e.COOKIE_NAME=n,e.DEFAULT_API_URL=t,e.TRACKING_PARAM="ref",e.Tracker=d,e.VERSION=r,e.clearReferralInfo=u,e.default=g,e.deleteCookie=s,e.generateRefId=o,e.getBrowserInfo=function(){return"undefined"==typeof navigator?{userAgent:"",language:"",timezone:""}:{userAgent:navigator.userAgent||"",language:navigator.language||"",timezone:Intl?.DateTimeFormat?.()?.resolvedOptions?.()?.timeZone||""}},e.getClient=function(){return h},e.getCookie=a,e.getPageInfo=function(){return"undefined"==typeof window||"undefined"==typeof document?{url:"",referrer:"",title:""}:{url:window.location.href,referrer:document.referrer||"",title:document.title||""}},e.getReferralInfo=c,e.getUrlParam=f,e.init=function(e){return h=new g(e),h},e.saveReferralInfo=l,e.setCookie=i,Object.defineProperty(e,"__esModule",{value:!0}),e}({});
2
+ //# sourceMappingURL=blossu.min.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blossu.min.js","sources":["../src/constants.ts","../src/utils.ts","../src/tracker.ts","../src/blossu.ts"],"sourcesContent":[null,null,null,null],"names":["VERSION","DEFAULT_API_URL","COOKIE_NAME","generateRefId","Date","now","toString","Math","random","substring","setCookie","name","value","days","document","expires","setTime","getTime","secure","window","location","protocol","cookie","encodeURIComponent","toUTCString","getCookie","nameEQ","cookies","split","i","length","charAt","indexOf","decodeURIComponent","deleteCookie","getUrlParam","param","URLSearchParams","search","get","saveReferralInfo","code","cookieName","expiryDays","refId","info","toLowerCase","timestamp","JSON","stringify","getReferralInfo","parse","clearReferralInfo","Tracker","constructor","config","this","apiUrl","programSlug","debug","log","args","console","getEndpoint","event","getMeta","isBrowser","url","href","referrer","userAgent","navigator","language","timezone","Intl","DateTimeFormat","resolvedOptions","timeZone","sdkVersion","send","data","payload","meta","endpoint","body","sendBeacon","blob","Blob","type","success","error","response","fetch","method","headers","keepalive","status","ok","trackClick","trackSignup","trackSale","trackPageview","BlossuClient","initialized","referralInfo","trackingParam","cookieExpiryDays","autoTrack","tracker","loadReferralInfo","autoTrackReferral","exposeToWindow","blossu","blossu_ref_id","getRefId","getCode","hasReferral","clearReferral","signup","email","externalCustomerId","metadata","sale","amount","currency","provider","pageview","getStripeClientReferenceId","getStripeMetadata","blossu_code","getPartnerInfo","Error","json","getProgramSlug","defaultClient","title"],"mappings":"oCAAa,MAAAA,EAAU,QACVC,EAAkB,yBAClBC,EAAc,sBCCXC,IAGd,MAAO,OAFWC,KAAKC,MAAMC,SAAS,OACnBC,KAAKC,SAASF,SAAS,IAAIG,UAAU,EAAG,KAE7D,UAEgBC,EAAUC,EAAcC,EAAeC,GACrD,GAAwB,oBAAbC,SAA0B,OAErC,MAAMC,EAAU,IAAIX,KACpBW,EAAQC,QAAQD,EAAQE,UAAmB,GAAPJ,EAAY,GAAK,GAAK,KAE1D,MACMK,EAAsC,WAA7BC,OAAOC,SAASC,SAAwB,WAAa,GAEpEP,SAASQ,OAAS,GAAGX,KAAQY,mBAAmBX,eAAmBG,EAAQS,sCAA8CN,GAC3H,CAEM,SAAUO,EAAUd,GACxB,GAAwB,oBAAbG,SAA0B,OAAO,KAE5C,MAAMY,EAAS,GAAGf,KACZgB,EAAUb,SAASQ,OAAOM,MAAM,KAEtC,IAAK,IAAIC,EAAI,EAAGA,EAAIF,EAAQG,OAAQD,IAAK,CACvC,IAAIP,EAASK,EAAQE,GACrB,KAA4B,MAArBP,EAAOS,OAAO,IACnBT,EAASA,EAAOb,UAAU,EAAGa,EAAOQ,QAEtC,GAA+B,IAA3BR,EAAOU,QAAQN,GACjB,OAAOO,mBAAmBX,EAAOb,UAAUiB,EAAOI,OAAQR,EAAOQ,QAEpE,CACD,OAAO,IACT,CAEM,SAAUI,EAAavB,GACH,oBAAbG,WACXA,SAASQ,OAAS,GAAGX,qDACvB,CAEM,SAAUwB,EAAYC,GAC1B,GAAsB,oBAAXjB,OAAwB,OAAO,KAG1C,OADkB,IAAIkB,gBAAgBlB,OAAOC,SAASkB,QACrCC,IAAIH,EACvB,CAEM,SAAUI,EACdC,EACAC,EAAqBxC,EACrByC,EDnDgC,ICqDhC,MAAMC,EAAQzC,IACR0C,EAAqB,CACzBJ,KAAMA,EAAKK,cACXF,QACAG,UAAW3C,KAAKC,OAKlB,OAFAK,EAAUgC,EAAYM,KAAKC,UAAUJ,GAAOF,GAErCE,CACT,CAEgB,SAAAK,EACdR,EAAqBxC,GAErB,MAAMoB,EAASG,EAAUiB,GACzB,IAAKpB,EAAQ,OAAO,KAEpB,IACE,OAAO0B,KAAKG,MAAM7B,EACnB,CAAC,MACA,OAAO,IACR,CACH,CAEgB,SAAA8B,EAAkBV,EAAqBxC,GACrDgC,EAAaQ,EACf,OC7DaW,EAGX,WAAAC,CAAYC,GACVC,KAAKD,OAAS,CACZE,OAAQF,EAAOE,QAAUxD,EACzByD,YAAaH,EAAOG,YACpBC,MAAOJ,EAAOI,QAAS,EAE1B,CAEO,GAAAC,IAAOC,GACTL,KAAKD,OAAOI,OACdG,QAAQF,IAAI,cAAeC,EAE9B,CAEO,WAAAE,CAAYC,GAClB,MAAO,GAAGR,KAAKD,OAAOE,mBAAmBO,GAC1C,CAEO,OAAAC,GACN,MAAMC,EAA8B,oBAAX/C,OAEzB,MAAO,CACLgD,IAAKD,EAAY/C,OAAOC,SAASgD,KAAO,GACxCC,SAAUH,EAAYpD,SAASuD,SAAW,GAC1CC,UAAWJ,EAAYK,UAAUD,UAAY,GAC7CE,SAAUN,EAAYK,UAAUC,SAAW,GAC3CC,SAAUP,GACNQ,MAAMC,oBAAoBC,qBAAqBC,UAC/C,GACJ9B,UAAW3C,KAAKC,MAChByE,WAAY9E,EAEf,CAED,UAAM+E,CACJf,EACAgB,GAEA,MAAMC,EAAwB,CAC5BjB,QACAgB,OACAE,KAAM1B,KAAKS,WAGbT,KAAKI,IAAI,iBAAkBI,EAAOiB,GAElC,MAAME,EAAW3B,KAAKO,YAAYC,GAC5BoB,EAAOpC,KAAKC,UAAUgC,GAE5B,GAAyB,oBAAdV,WAA6BA,UAAUc,WAAY,CAC5D,MAAMC,EAAO,IAAIC,KAAK,CAACH,GAAO,CAAEI,KAAM,qBAEtC,IACE,MAAMC,EAAUlB,UAAUc,WAAWF,EAAUG,GAE/C,OADA9B,KAAKI,IAAI,qBAAsB6B,GACxBA,CACR,CAAC,MAAOC,GACPlC,KAAKI,IAAI,4CAA6C8B,EACvD,CACF,CAED,IACE,MAAMC,QAAiBC,MAAMT,EAAU,CACrCU,OAAQ,OACRC,QAAS,CACP,eAAgB,oBAElBV,OACAW,WAAW,IAIb,OADAvC,KAAKI,IAAI,kBAAmB+B,EAASK,QAC9BL,EAASM,EACjB,CAAC,MAAOP,GAEP,OADAlC,KAAKI,IAAI,eAAgB8B,IAClB,CACR,CACF,CAED,UAAAQ,CAAWlB,GACT,OAAOxB,KAAKuB,KAAK,QAASC,EAC3B,CAED,WAAAmB,CAAYnB,GAOV,OAAOxB,KAAKuB,KAAK,SAAUC,EAC5B,CAED,SAAAoB,CAAUpB,GASR,OAAOxB,KAAKuB,KAAK,OAAQC,EAC1B,CAED,aAAAqB,CAAcrB,GACZ,OAAOxB,KAAKuB,KAAK,WAAYC,EAC9B,QClHUsB,EAMX,WAAAhD,CAAYC,GAHJC,KAAW+C,aAAY,EACvB/C,KAAYgD,aAAwB,KAG1ChD,KAAKD,OAAS,CACZG,YAAaH,EAAOG,YACpBD,OAAQF,EAAOE,QAAUxD,EACzBwG,cAAelD,EAAOkD,eHxBE,MGyBxB/D,WAAYa,EAAOb,YAAcxC,EACjCwG,iBAAkBnD,EAAOmD,kBH3BG,GG4B5B/C,MAAOJ,EAAOI,QAAS,EACvBgD,WAAgC,IAArBpD,EAAOoD,WAGpBnD,KAAKoD,QAAU,IAAIvD,EAAQ,CACzBI,OAAQD,KAAKD,OAAOE,OACpBC,YAAaF,KAAKD,OAAOG,YACzBC,MAAOH,KAAKD,OAAOI,QAGrBH,KAAKqD,mBAEDrD,KAAKD,OAAOoD,WACdnD,KAAKsD,oBAGPtD,KAAKuD,gBACN,CAEO,GAAAnD,IAAOC,GACTL,KAAKD,OAAOI,OACdG,QAAQF,IAAI,cAAeC,EAE9B,CAEO,cAAAkD,GACgB,oBAAX5F,SACTA,OAAO6F,OAASxD,KACZA,KAAKgD,eACPrF,OAAO8F,cAAgBzD,KAAKgD,aAAa5D,OAG9C,CAEO,gBAAAiE,GACNrD,KAAKgD,aAAetD,EAAgBM,KAAKD,OAAOb,YAC5Cc,KAAKgD,cACPhD,KAAKI,IAAI,oCAAqCJ,KAAKgD,aAEtD,CAEO,iBAAAM,GACN,GAAsB,oBAAX3F,OAAwB,OAEnC,MAAMsB,EAAON,EAAYqB,KAAKD,OAAOkD,eACjChE,GAAQA,IAASe,KAAKgD,cAAc/D,OACtCe,KAAKI,IAAI,iCAAkCnB,GAC3Ce,KAAK0C,WAAWzD,GAEnB,CAED,QAAAyE,GACE,OAAO1D,KAAKgD,cAAc5D,OAAS,IACpC,CAED,OAAAuE,GACE,OAAO3D,KAAKgD,cAAc/D,MAAQ,IACnC,CAED,eAAAS,GACE,OAAOM,KAAKgD,YACb,CAED,WAAAY,GACE,OAA6B,OAAtB5D,KAAKgD,YACb,CAED,aAAAa,GACEjE,EAAkBI,KAAKD,OAAOb,YAC9Bc,KAAKgD,aAAe,KACE,oBAAXrF,eACFA,OAAO8F,cAEhBzD,KAAKI,IAAI,wBACV,CAED,gBAAMsC,CAAWzD,GAaf,OAZAe,KAAKgD,aAAehE,EAClBC,EACAe,KAAKD,OAAOb,WACZc,KAAKD,OAAOmD,kBAGQ,oBAAXvF,SACTA,OAAO8F,cAAgBzD,KAAKgD,aAAa5D,OAG3CY,KAAKI,IAAI,2BAA4BnB,EAAM,SAAUe,KAAKgD,aAAa5D,OAEhEY,KAAKoD,QAAQV,WAAW,CAC7BzD,KAAMe,KAAKgD,aAAa/D,KACxBG,MAAOY,KAAKgD,aAAa5D,OAE5B,CAED,YAAM0E,CAAOtC,EAAwB,IACnC,OAAKxB,KAAKgD,cAKVhD,KAAKI,IAAI,mBAAoBoB,GAEtBxB,KAAKoD,QAAQT,YAAY,CAC9B1D,KAAMe,KAAKgD,aAAa/D,KACxBG,MAAOY,KAAKgD,aAAa5D,MACzB2E,MAAOvC,EAAKuC,MACZC,mBAAoBxC,EAAKwC,mBACzBC,SAAUzC,EAAKyC,aAXfjE,KAAKI,IAAI,+CACF,EAYV,CAED,UAAM8D,CAAK1C,GACT,OAAKxB,KAAKgD,cAKVhD,KAAKI,IAAI,iBAAkBoB,GAEpBxB,KAAKoD,QAAQR,UAAU,CAC5B3D,KAAMe,KAAKgD,aAAa/D,KACxBG,MAAOY,KAAKgD,aAAa5D,MACzB4E,mBAAoBxC,EAAKwC,mBACzBG,OAAQ3C,EAAK2C,OACbC,SAAU5C,EAAK4C,SACfC,SAAU7C,EAAK6C,UAAY,SAC3BJ,SAAUzC,EAAKyC,aAbfjE,KAAKI,IAAI,6CACF,EAcV,CAED,cAAMkE,GACJ,QAAKtE,KAAKgD,cAIHhD,KAAKoD,QAAQP,cAAc,CAChC5D,KAAMe,KAAKgD,aAAa/D,KACxBG,MAAOY,KAAKgD,aAAa5D,OAE5B,CAED,0BAAAmF,GACE,OAAOvE,KAAKgD,cAAc5D,OAAS,IACpC,CAED,iBAAAoF,GACE,OAAKxE,KAAKgD,aAIH,CACLS,cAAezD,KAAKgD,aAAa5D,MACjCqF,YAAazE,KAAKgD,aAAa/D,MALxB,EAOV,CAED,oBAAMyF,CAAezF,GACnB,MAAM0B,EAAM,GAAGX,KAAKD,OAAOE,6BAA6BD,KAAKD,OAAOG,wBAAwBnC,mBAAmBkB,KAE/G,IACE,MAAMkD,QAAiBC,MAAMzB,GAE7B,IAAKwB,EAASM,GAAI,CAChB,GAAwB,MAApBN,EAASK,OAEX,OADAxC,KAAKI,IAAI,mCAAoCnB,GACtC,KAET,MAAM,IAAI0F,MAAM,uBAAuBxC,EAASK,SACjD,CAED,MAAMhB,QAAaW,EAASyC,OAE5B,OADA5E,KAAKI,IAAI,wBAAyBoB,GAC3BA,CACR,CAAC,MAAOU,GAEP,OADAlC,KAAKI,IAAI,+BAAgC8B,GAClC,IACR,CACF,CAED,cAAA2C,GACE,OAAO7E,KAAKD,OAAOG,WACpB,EAGH,IAAI4E,EAAqC,kDHrNP,wDACJ,+HCsF5B,MAAyB,oBAAd/D,UACF,CAAED,UAAW,GAAIE,SAAU,GAAIC,SAAU,IAG3C,CACLH,UAAWC,UAAUD,WAAa,GAClCE,SAAUD,UAAUC,UAAY,GAChCC,SAAUC,MAAMC,oBAAoBC,qBAAqBC,UAAY,GAEzE,yBE6HE,OAAOyD,CACT,yCFvHE,MAAsB,oBAAXnH,QAA8C,oBAAbL,SACnC,CAAEqD,IAAK,GAAIE,SAAU,GAAIkE,MAAO,IAGlC,CACLpE,IAAKhD,OAAOC,SAASgD,KACrBC,SAAUvD,SAASuD,UAAY,GAC/BkE,MAAOzH,SAASyH,OAAS,GAE7B,6CEuGM,SAAehF,GAEnB,OADA+E,EAAgB,IAAIhC,EAAa/C,GAC1B+E,CACT"}
@@ -0,0 +1,6 @@
1
+ export declare const VERSION = "0.1.0";
2
+ export declare const DEFAULT_API_URL = "https://api.blossu.com";
3
+ export declare const COOKIE_NAME = "blossu_ref";
4
+ export declare const COOKIE_EXPIRY_DAYS = 30;
5
+ export declare const TRACKING_PARAM = "ref";
6
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,OAAO,UAAU,CAAC;AAC/B,eAAO,MAAM,eAAe,2BAA2B,CAAC;AACxD,eAAO,MAAM,WAAW,eAAe,CAAC;AACxC,eAAO,MAAM,kBAAkB,KAAK,CAAC;AACrC,eAAO,MAAM,cAAc,QAAQ,CAAC"}
@@ -0,0 +1,8 @@
1
+ export { BlossuClient, init, getClient } from './blossu';
2
+ export { Tracker } from './tracker';
3
+ export type { BlossuConfig, TrackClickData, TrackSignupData, TrackSaleData, ReferralInfo, PublicPartnerInfo, PublicReferralInfo, PartnerBrand, } from './types';
4
+ export { generateRefId, setCookie, getCookie, deleteCookie, getUrlParam, saveReferralInfo, getReferralInfo, clearReferralInfo, getBrowserInfo, getPageInfo, } from './utils';
5
+ export { VERSION, DEFAULT_API_URL, COOKIE_NAME, COOKIE_EXPIRY_DAYS, TRACKING_PARAM, } from './constants';
6
+ import { BlossuClient } from './blossu';
7
+ export default BlossuClient;
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACzD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,YAAY,EACV,YAAY,EACZ,cAAc,EACd,eAAe,EACf,aAAa,EACb,YAAY,EACZ,iBAAiB,EACjB,kBAAkB,EAClB,YAAY,GACb,MAAM,SAAS,CAAC;AACjB,OAAO,EACL,aAAa,EACb,SAAS,EACT,SAAS,EACT,YAAY,EACZ,WAAW,EACX,gBAAgB,EAChB,eAAe,EACf,iBAAiB,EACjB,cAAc,EACd,WAAW,GACZ,MAAM,SAAS,CAAC;AACjB,OAAO,EACL,OAAO,EACP,eAAe,EACf,WAAW,EACX,kBAAkB,EAClB,cAAc,GACf,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AACxC,eAAe,YAAY,CAAC"}