@explorins/pers-shared 2.1.190 → 2.1.191
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/shared-lib/dto/redemption/redemptionRedeem.request.dto.d.ts.map +1 -1
- package/dist/cjs/shared-lib/dto/redemption/redemptionRedeem.request.dto.js +11 -1
- package/dist/cjs/shared-lib/dto/redemption/redemptionRedeem.request.dto.js.map +1 -1
- package/dist/cjs/shared-lib/interfaces/eligible-business-summary.interface.d.ts +3 -0
- package/dist/cjs/shared-lib/interfaces/eligible-business-summary.interface.d.ts.map +1 -1
- package/dist/cjs/shared-lib/types/data-source.type.d.ts +56 -10
- package/dist/cjs/shared-lib/types/data-source.type.d.ts.map +1 -1
- package/dist/cjs/shared-lib/types/data-source.type.js +123 -18
- package/dist/cjs/shared-lib/types/data-source.type.js.map +1 -1
- package/dist/esm/shared-lib/dto/redemption/redemptionRedeem.request.dto.d.ts.map +1 -1
- package/dist/esm/shared-lib/dto/redemption/redemptionRedeem.request.dto.js +11 -1
- package/dist/esm/shared-lib/dto/redemption/redemptionRedeem.request.dto.js.map +1 -1
- package/dist/esm/shared-lib/interfaces/eligible-business-summary.interface.d.ts +3 -0
- package/dist/esm/shared-lib/interfaces/eligible-business-summary.interface.d.ts.map +1 -1
- package/dist/esm/shared-lib/types/data-source.type.d.ts +56 -10
- package/dist/esm/shared-lib/types/data-source.type.d.ts.map +1 -1
- package/dist/esm/shared-lib/types/data-source.type.js +122 -18
- package/dist/esm/shared-lib/types/data-source.type.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"redemptionRedeem.request.dto.d.ts","sourceRoot":"","sources":["../../../../../src/shared-lib/dto/redemption/redemptionRedeem.request.dto.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4CAA4C,CAAC;AAEjF,qBAAa,0BAA0B;IACnC;;;;;;OAMG;IAUH,YAAY,EAAG,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"redemptionRedeem.request.dto.d.ts","sourceRoot":"","sources":["../../../../../src/shared-lib/dto/redemption/redemptionRedeem.request.dto.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4CAA4C,CAAC;AAEjF,qBAAa,0BAA0B;IACnC;;;;;;OAMG;IAUH,YAAY,EAAG,MAAM,CAAC;IAmBtB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAsB3B,OAAO,CAAC,EAAE,cAAc,CAAC;CAC5B"}
|
|
@@ -40,7 +40,17 @@ __decorate([
|
|
|
40
40
|
], RedemptionRedeemRequestDTO.prototype, "redemptionId", void 0);
|
|
41
41
|
__decorate([
|
|
42
42
|
(0, swagger_1.ApiProperty)({
|
|
43
|
-
description:
|
|
43
|
+
description: `Business ID associated with this redemption transaction (optional override).
|
|
44
|
+
|
|
45
|
+
**Token Recipient Priority:**
|
|
46
|
+
1. \`redemption.ownerBusinessId\` - Business that created/owns the redemption (default)
|
|
47
|
+
2. \`dto.businessId\` - This field (override for marketplace/facilitator scenarios)
|
|
48
|
+
3. \`TENANT\` - Platform fallback for platform-wide redemptions
|
|
49
|
+
|
|
50
|
+
**Use Cases:**
|
|
51
|
+
- Omit for standard redemptions (tokens go to redemption owner)
|
|
52
|
+
- Provide for marketplace scenarios where a facilitator business processes redemptions for another business
|
|
53
|
+
- Leave null for platform-managed redemptions without a specific business owner`,
|
|
44
54
|
type: String,
|
|
45
55
|
nullable: true
|
|
46
56
|
}),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"redemptionRedeem.request.dto.js","sourceRoot":"","sources":["../../../../../src/shared-lib/dto/redemption/redemptionRedeem.request.dto.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,6CAAmE;AACnE,qDAA+D;AAC/D,iDAAkE;AAGlE,MAAa,0BAA0B;IACnC;;;;;;OAMG;IACH;;SAEK;IAOL,YAAY,CAAU;
|
|
1
|
+
{"version":3,"file":"redemptionRedeem.request.dto.js","sourceRoot":"","sources":["../../../../../src/shared-lib/dto/redemption/redemptionRedeem.request.dto.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,6CAAmE;AACnE,qDAA+D;AAC/D,iDAAkE;AAGlE,MAAa,0BAA0B;IACnC;;;;;;OAMG;IACH;;SAEK;IAOL,YAAY,CAAU;IAmBtB,UAAU,CAAiB;IAsB3B,OAAO,CAAkB;CAC5B;AA3DD,gEA2DC;AA1CG;IANC,IAAA,qBAAW,EAAC;QACT,WAAW,EAAE,mBAAmB;QAChC,IAAI,EAAE,MAAM;KACf,CAAC;IACD,IAAA,4BAAU,GAAE;IACZ,IAAA,wBAAM,GAAE;;gEACa;AAmBtB;IAjBC,IAAA,qBAAW,EAAC;QACT,WAAW,EAAE;;;;;;;;;;gFAU2D;QACxE,IAAI,EAAE,MAAM;QACZ,QAAQ,EAAE,IAAI;KACjB,CAAC;IACD,IAAA,4BAAe,GAAE;IACjB,IAAA,wBAAM,GAAE;;8DACkB;AAsB3B;IApBC,IAAA,6BAAmB,EAAC;QACjB,WAAW,EAAE;;;;;;;;;;;;;mGAa8E;QAC3F,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,EAAE,SAAS,EAAE,UAAU,EAAE,YAAY,EAAE,sBAAsB,EAAE,eAAe,EAAE,sBAAsB,EAAE;KACpH,CAAC;IACD,IAAA,0BAAa,GAAE;IACf,IAAA,0BAAQ,GAAE;;2DACc"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { BusinessTypeDTO } from '../dto/business/business-type.dto';
|
|
1
2
|
/**
|
|
2
3
|
* Minimal business info for eligible business selectors.
|
|
3
4
|
*
|
|
@@ -13,5 +14,7 @@ export interface EligibleBusinessSummary {
|
|
|
13
14
|
displayName: string;
|
|
14
15
|
/** Optional logo/image URL */
|
|
15
16
|
imageUrl?: string | null;
|
|
17
|
+
/** Business type (for filtering/grouping/display) */
|
|
18
|
+
businessType?: BusinessTypeDTO | null;
|
|
16
19
|
}
|
|
17
20
|
//# sourceMappingURL=eligible-business-summary.interface.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"eligible-business-summary.interface.d.ts","sourceRoot":"","sources":["../../../../src/shared-lib/interfaces/eligible-business-summary.interface.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,MAAM,WAAW,uBAAuB;IACpC,kBAAkB;IAClB,EAAE,EAAE,MAAM,CAAC;IACX,0BAA0B;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,8BAA8B;IAC9B,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"eligible-business-summary.interface.d.ts","sourceRoot":"","sources":["../../../../src/shared-lib/interfaces/eligible-business-summary.interface.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AAEpE;;;;;;;GAOG;AACH,MAAM,WAAW,uBAAuB;IACpC,kBAAkB;IAClB,EAAE,EAAE,MAAM,CAAC;IACX,0BAA0B;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,8BAA8B;IAC9B,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,qDAAqD;IACrD,YAAY,CAAC,EAAE,eAAe,GAAG,IAAI,CAAC;CACzC"}
|
|
@@ -19,14 +19,15 @@
|
|
|
19
19
|
*
|
|
20
20
|
* ## Example Scenarios
|
|
21
21
|
*
|
|
22
|
-
* | Scenario | channel |
|
|
23
|
-
*
|
|
24
|
-
* |
|
|
25
|
-
* | Mobile
|
|
26
|
-
* |
|
|
27
|
-
* |
|
|
28
|
-
* |
|
|
29
|
-
* |
|
|
22
|
+
* | Scenario | channel | platform.deviceType | platform.app/browser | Notes |
|
|
23
|
+
* |-----------------------------|-----------|---------------------|----------------------|-------|
|
|
24
|
+
* | Desktop browser | `web` | `desktop` | `browser: Chrome` | - |
|
|
25
|
+
* | Mobile browser (Safari) | `web` | `phone` | `browser: Safari` | NOT 'mobile' channel |
|
|
26
|
+
* | Native iOS app | `mobile` | `phone` | `app: MyApp` | Requires x-source-channel |
|
|
27
|
+
* | Native Android app | `mobile` | `phone` | `app: MyApp` | Requires x-source-channel |
|
|
28
|
+
* | Partner API integration | `api` | - | - | - |
|
|
29
|
+
* | Admin creates user | `admin` | - | - | - |
|
|
30
|
+
* | Webhook from Stripe | `webhook` | - | - | - |
|
|
30
31
|
*
|
|
31
32
|
* @example
|
|
32
33
|
* // Simple usage - just channel
|
|
@@ -43,6 +44,10 @@
|
|
|
43
44
|
*/
|
|
44
45
|
/**
|
|
45
46
|
* Primary ingestion channels for data source tracking.
|
|
47
|
+
*
|
|
48
|
+
* IMPORTANT:
|
|
49
|
+
* - 'web' = ANY browser (desktop OR mobile) - use platform.deviceType to distinguish
|
|
50
|
+
* - 'mobile' = Native apps ONLY (iOS/Android) - must include platform.app
|
|
46
51
|
*/
|
|
47
52
|
export declare const DATA_SOURCE_CHANNELS: readonly ["web", "mobile", "api", "admin", "system", "import", "webhook", "sync", "migration", "unknown"];
|
|
48
53
|
export type DataSourceChannel = typeof DATA_SOURCE_CHANNELS[number];
|
|
@@ -51,11 +56,19 @@ export type DataSourceChannel = typeof DATA_SOURCE_CHANNELS[number];
|
|
|
51
56
|
*
|
|
52
57
|
* Provides both simple channel categorization and optional
|
|
53
58
|
* detailed attribution fields for analytics.
|
|
59
|
+
*
|
|
60
|
+
* CHANNEL USAGE:
|
|
61
|
+
* - 'web': ANY browser (desktop/mobile) - check platform.deviceType and platform.browser
|
|
62
|
+
* - 'mobile': Native apps ONLY - check platform.app and platform.appVersion
|
|
63
|
+
* - Use platform field to get detailed device/environment information
|
|
54
64
|
*/
|
|
55
65
|
export interface DataSource {
|
|
56
66
|
/**
|
|
57
67
|
* Primary ingestion channel.
|
|
58
68
|
* Required field for basic source categorization.
|
|
69
|
+
*
|
|
70
|
+
* - 'web' = Browser (desktop or mobile) - use platform.deviceType to distinguish
|
|
71
|
+
* - 'mobile' = Native mobile app - requires platform.app to be set
|
|
59
72
|
*/
|
|
60
73
|
channel: DataSourceChannel;
|
|
61
74
|
/**
|
|
@@ -83,6 +96,19 @@ export interface DataSource {
|
|
|
83
96
|
* SDK provides this - backend stores as-is.
|
|
84
97
|
*/
|
|
85
98
|
platform?: Platform;
|
|
99
|
+
/**
|
|
100
|
+
* Source of platform data.
|
|
101
|
+
* Indicates whether platform info came from SDK headers or auto-detection.
|
|
102
|
+
*
|
|
103
|
+
* - 'sdk': Explicitly sent via x-platform header (authoritative, trusted)
|
|
104
|
+
* - 'auto': Parsed from User-Agent header (best-effort, may be inaccurate)
|
|
105
|
+
*
|
|
106
|
+
* Use this to:
|
|
107
|
+
* - Identify incomplete SDK integrations (platformSource='auto' or missing)
|
|
108
|
+
* - Filter for high-quality data (platformSource='sdk')
|
|
109
|
+
* - Track SDK adoption progress
|
|
110
|
+
*/
|
|
111
|
+
platformSource?: 'sdk' | 'auto';
|
|
86
112
|
}
|
|
87
113
|
/**
|
|
88
114
|
* Platform/device information for analytics.
|
|
@@ -135,17 +161,37 @@ export declare const KNOWN_SOURCE_DOMAINS: Record<string, string>;
|
|
|
135
161
|
* detectSourceFromReferrer('https://partner.example.com') // 'example'
|
|
136
162
|
*/
|
|
137
163
|
export declare function detectSourceFromReferrer(referrer?: string): string | undefined;
|
|
164
|
+
/**
|
|
165
|
+
* Parse User-Agent string for platform information (fallback when SDK doesn't provide).
|
|
166
|
+
*
|
|
167
|
+
* Extracts OS, browser, device type from standard User-Agent patterns.
|
|
168
|
+
* This is best-effort - SDK headers are authoritative.
|
|
169
|
+
*
|
|
170
|
+
* @param userAgent - User-Agent header value
|
|
171
|
+
* @returns Platform object with detected fields, or undefined if unparseable
|
|
172
|
+
*
|
|
173
|
+
* @example
|
|
174
|
+
* parseUserAgentForPlatform('Mozilla/5.0 (iPhone; CPU iPhone OS 17_4...')
|
|
175
|
+
* // { os: 'iOS', osVersion: '17.4', browser: 'Safari', deviceType: 'phone' }
|
|
176
|
+
*/
|
|
177
|
+
export declare function parseUserAgentForPlatform(userAgent?: string): Platform | undefined;
|
|
138
178
|
/**
|
|
139
179
|
* Auto-detect channel from User-Agent string.
|
|
140
180
|
*
|
|
181
|
+
* IMPORTANT DESIGN:
|
|
182
|
+
* - Mobile browsers (Safari on iPhone, Chrome on Android) → 'web' (NOT 'mobile')
|
|
183
|
+
* - Native apps MUST send explicit x-source-channel: mobile header
|
|
184
|
+
* - Use platform.deviceType to distinguish mobile web from desktop web
|
|
185
|
+
*
|
|
141
186
|
* @param userAgent - User-Agent header value
|
|
142
187
|
* @param path - Optional request path for webhook detection
|
|
143
188
|
* @returns Detected channel
|
|
144
189
|
*
|
|
145
190
|
* @example
|
|
146
|
-
* detectChannelFromUserAgent('Mozilla/5.0 (iPhone; ...)') // 'mobile
|
|
147
|
-
* detectChannelFromUserAgent('Mozilla/5.0 (Windows NT...)') // 'web'
|
|
191
|
+
* detectChannelFromUserAgent('Mozilla/5.0 (iPhone; ...) Safari') // 'web' (mobile browser)
|
|
192
|
+
* detectChannelFromUserAgent('Mozilla/5.0 (Windows NT...)') // 'web' (desktop browser)
|
|
148
193
|
* detectChannelFromUserAgent('', '/webhook/stripe') // 'webhook'
|
|
194
|
+
* detectChannelFromUserAgent('MyApp/1.0') // 'unknown' (native app without header)
|
|
149
195
|
*/
|
|
150
196
|
export declare function detectChannelFromUserAgent(userAgent?: string, path?: string): DataSourceChannel;
|
|
151
197
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data-source.type.d.ts","sourceRoot":"","sources":["../../../../src/shared-lib/types/data-source.type.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"data-source.type.d.ts","sourceRoot":"","sources":["../../../../src/shared-lib/types/data-source.type.ts"],"names":[],"mappings":"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"}
|
|
@@ -20,14 +20,15 @@
|
|
|
20
20
|
*
|
|
21
21
|
* ## Example Scenarios
|
|
22
22
|
*
|
|
23
|
-
* | Scenario | channel |
|
|
24
|
-
*
|
|
25
|
-
* |
|
|
26
|
-
* | Mobile
|
|
27
|
-
* |
|
|
28
|
-
* |
|
|
29
|
-
* |
|
|
30
|
-
* |
|
|
23
|
+
* | Scenario | channel | platform.deviceType | platform.app/browser | Notes |
|
|
24
|
+
* |-----------------------------|-----------|---------------------|----------------------|-------|
|
|
25
|
+
* | Desktop browser | `web` | `desktop` | `browser: Chrome` | - |
|
|
26
|
+
* | Mobile browser (Safari) | `web` | `phone` | `browser: Safari` | NOT 'mobile' channel |
|
|
27
|
+
* | Native iOS app | `mobile` | `phone` | `app: MyApp` | Requires x-source-channel |
|
|
28
|
+
* | Native Android app | `mobile` | `phone` | `app: MyApp` | Requires x-source-channel |
|
|
29
|
+
* | Partner API integration | `api` | - | - | - |
|
|
30
|
+
* | Admin creates user | `admin` | - | - | - |
|
|
31
|
+
* | Webhook from Stripe | `webhook` | - | - | - |
|
|
31
32
|
*
|
|
32
33
|
* @example
|
|
33
34
|
* // Simple usage - just channel
|
|
@@ -46,14 +47,19 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
46
47
|
exports.KNOWN_SOURCE_DOMAINS = exports.DEFAULT_DATA_SOURCE = exports.DATA_SOURCE_CHANNELS = void 0;
|
|
47
48
|
exports.isDataSourceChannel = isDataSourceChannel;
|
|
48
49
|
exports.detectSourceFromReferrer = detectSourceFromReferrer;
|
|
50
|
+
exports.parseUserAgentForPlatform = parseUserAgentForPlatform;
|
|
49
51
|
exports.detectChannelFromUserAgent = detectChannelFromUserAgent;
|
|
50
52
|
exports.parseUtmParams = parseUtmParams;
|
|
51
53
|
/**
|
|
52
54
|
* Primary ingestion channels for data source tracking.
|
|
55
|
+
*
|
|
56
|
+
* IMPORTANT:
|
|
57
|
+
* - 'web' = ANY browser (desktop OR mobile) - use platform.deviceType to distinguish
|
|
58
|
+
* - 'mobile' = Native apps ONLY (iOS/Android) - must include platform.app
|
|
53
59
|
*/
|
|
54
60
|
exports.DATA_SOURCE_CHANNELS = [
|
|
55
|
-
'web', // Web
|
|
56
|
-
'mobile', //
|
|
61
|
+
'web', // Web browser (desktop or mobile) - check platform.deviceType
|
|
62
|
+
'mobile', // Native mobile app ONLY (iOS/Android) - requires platform.app
|
|
57
63
|
'api', // Direct API integration
|
|
58
64
|
'admin', // Admin panel/back-office
|
|
59
65
|
'system', // System-generated (automated)
|
|
@@ -181,17 +187,114 @@ function detectSourceFromReferrer(referrer) {
|
|
|
181
187
|
return undefined;
|
|
182
188
|
}
|
|
183
189
|
}
|
|
190
|
+
/**
|
|
191
|
+
* Parse User-Agent string for platform information (fallback when SDK doesn't provide).
|
|
192
|
+
*
|
|
193
|
+
* Extracts OS, browser, device type from standard User-Agent patterns.
|
|
194
|
+
* This is best-effort - SDK headers are authoritative.
|
|
195
|
+
*
|
|
196
|
+
* @param userAgent - User-Agent header value
|
|
197
|
+
* @returns Platform object with detected fields, or undefined if unparseable
|
|
198
|
+
*
|
|
199
|
+
* @example
|
|
200
|
+
* parseUserAgentForPlatform('Mozilla/5.0 (iPhone; CPU iPhone OS 17_4...')
|
|
201
|
+
* // { os: 'iOS', osVersion: '17.4', browser: 'Safari', deviceType: 'phone' }
|
|
202
|
+
*/
|
|
203
|
+
function parseUserAgentForPlatform(userAgent) {
|
|
204
|
+
if (!userAgent)
|
|
205
|
+
return undefined;
|
|
206
|
+
const ua = userAgent;
|
|
207
|
+
const platform = {};
|
|
208
|
+
// Detect OS and device type
|
|
209
|
+
if (/iPhone|iPod/i.test(ua)) {
|
|
210
|
+
platform.os = 'iOS';
|
|
211
|
+
const match = ua.match(/OS (\d+)[_\.](\d+)/);
|
|
212
|
+
if (match)
|
|
213
|
+
platform.osVersion = `${match[1]}.${match[2]}`;
|
|
214
|
+
platform.deviceType = 'phone';
|
|
215
|
+
}
|
|
216
|
+
else if (/iPad/i.test(ua)) {
|
|
217
|
+
platform.os = 'iOS';
|
|
218
|
+
const match = ua.match(/OS (\d+)[_\.](\d+)/);
|
|
219
|
+
if (match)
|
|
220
|
+
platform.osVersion = `${match[1]}.${match[2]}`;
|
|
221
|
+
platform.deviceType = 'tablet';
|
|
222
|
+
}
|
|
223
|
+
else if (/Android/i.test(ua)) {
|
|
224
|
+
platform.os = 'Android';
|
|
225
|
+
const match = ua.match(/Android ([\d\.]+)/);
|
|
226
|
+
if (match)
|
|
227
|
+
platform.osVersion = match[1];
|
|
228
|
+
platform.deviceType = /Mobile/i.test(ua) ? 'phone' : 'tablet';
|
|
229
|
+
}
|
|
230
|
+
else if (/Windows NT/i.test(ua)) {
|
|
231
|
+
platform.os = 'Windows';
|
|
232
|
+
const match = ua.match(/Windows NT ([\d\.]+)/);
|
|
233
|
+
if (match)
|
|
234
|
+
platform.osVersion = match[1];
|
|
235
|
+
platform.deviceType = 'desktop';
|
|
236
|
+
}
|
|
237
|
+
else if (/Macintosh|Mac OS X/i.test(ua)) {
|
|
238
|
+
platform.os = 'macOS';
|
|
239
|
+
const match = ua.match(/Mac OS X ([\d_]+)/);
|
|
240
|
+
if (match)
|
|
241
|
+
platform.osVersion = match[1].replace(/_/g, '.');
|
|
242
|
+
platform.deviceType = 'desktop';
|
|
243
|
+
}
|
|
244
|
+
else if (/Linux/i.test(ua) && !/Android/i.test(ua)) {
|
|
245
|
+
platform.os = 'Linux';
|
|
246
|
+
platform.deviceType = 'desktop';
|
|
247
|
+
}
|
|
248
|
+
// Detect browser (web channel)
|
|
249
|
+
if (/Edg\//i.test(ua)) {
|
|
250
|
+
platform.browser = 'Edge';
|
|
251
|
+
const match = ua.match(/Edg\/([\d\.]+)/);
|
|
252
|
+
if (match)
|
|
253
|
+
platform.browserVersion = match[1];
|
|
254
|
+
}
|
|
255
|
+
else if (/Chrome\//i.test(ua) && !/Edg/i.test(ua)) {
|
|
256
|
+
platform.browser = 'Chrome';
|
|
257
|
+
const match = ua.match(/Chrome\/([\d\.]+)/);
|
|
258
|
+
if (match)
|
|
259
|
+
platform.browserVersion = match[1];
|
|
260
|
+
}
|
|
261
|
+
else if (/Safari\//i.test(ua) && !/Chrome/i.test(ua)) {
|
|
262
|
+
platform.browser = 'Safari';
|
|
263
|
+
const match = ua.match(/Version\/([\d\.]+)/);
|
|
264
|
+
if (match)
|
|
265
|
+
platform.browserVersion = match[1];
|
|
266
|
+
}
|
|
267
|
+
else if (/Firefox\//i.test(ua)) {
|
|
268
|
+
platform.browser = 'Firefox';
|
|
269
|
+
const match = ua.match(/Firefox\/([\d\.]+)/);
|
|
270
|
+
if (match)
|
|
271
|
+
platform.browserVersion = match[1];
|
|
272
|
+
}
|
|
273
|
+
else if (/Opera|OPR\//i.test(ua)) {
|
|
274
|
+
platform.browser = 'Opera';
|
|
275
|
+
const match = ua.match(/(?:Opera|OPR)\/([\d\.]+)/);
|
|
276
|
+
if (match)
|
|
277
|
+
platform.browserVersion = match[1];
|
|
278
|
+
}
|
|
279
|
+
return Object.keys(platform).length > 0 ? platform : undefined;
|
|
280
|
+
}
|
|
184
281
|
/**
|
|
185
282
|
* Auto-detect channel from User-Agent string.
|
|
186
283
|
*
|
|
284
|
+
* IMPORTANT DESIGN:
|
|
285
|
+
* - Mobile browsers (Safari on iPhone, Chrome on Android) → 'web' (NOT 'mobile')
|
|
286
|
+
* - Native apps MUST send explicit x-source-channel: mobile header
|
|
287
|
+
* - Use platform.deviceType to distinguish mobile web from desktop web
|
|
288
|
+
*
|
|
187
289
|
* @param userAgent - User-Agent header value
|
|
188
290
|
* @param path - Optional request path for webhook detection
|
|
189
291
|
* @returns Detected channel
|
|
190
292
|
*
|
|
191
293
|
* @example
|
|
192
|
-
* detectChannelFromUserAgent('Mozilla/5.0 (iPhone; ...)') // 'mobile
|
|
193
|
-
* detectChannelFromUserAgent('Mozilla/5.0 (Windows NT...)') // 'web'
|
|
294
|
+
* detectChannelFromUserAgent('Mozilla/5.0 (iPhone; ...) Safari') // 'web' (mobile browser)
|
|
295
|
+
* detectChannelFromUserAgent('Mozilla/5.0 (Windows NT...)') // 'web' (desktop browser)
|
|
194
296
|
* detectChannelFromUserAgent('', '/webhook/stripe') // 'webhook'
|
|
297
|
+
* detectChannelFromUserAgent('MyApp/1.0') // 'unknown' (native app without header)
|
|
195
298
|
*/
|
|
196
299
|
function detectChannelFromUserAgent(userAgent, path) {
|
|
197
300
|
// Check for webhook paths
|
|
@@ -199,16 +302,18 @@ function detectChannelFromUserAgent(userAgent, path) {
|
|
|
199
302
|
return 'webhook';
|
|
200
303
|
}
|
|
201
304
|
const ua = (userAgent || '').toLowerCase();
|
|
202
|
-
// Check for mobile user-agents
|
|
203
|
-
if (/mobile|android|iphone|ipad|ipod|blackberry|windows phone/i.test(ua)) {
|
|
204
|
-
return 'mobile';
|
|
205
|
-
}
|
|
206
305
|
// Check for bot/crawler patterns (system)
|
|
207
306
|
if (/bot|crawler|spider|scraper|curl|wget|python|node-fetch|axios/i.test(ua)) {
|
|
208
307
|
return 'api';
|
|
209
308
|
}
|
|
210
|
-
//
|
|
211
|
-
|
|
309
|
+
// Check for ANY browser pattern (desktop OR mobile)
|
|
310
|
+
// Mobile browsers are 'web' channel - use platform.deviceType to distinguish
|
|
311
|
+
if (ua && /mozilla|chrome|safari|firefox|edge|opera|msie|trident/i.test(ua)) {
|
|
312
|
+
return 'web';
|
|
313
|
+
}
|
|
314
|
+
// Unknown: Native apps MUST send x-source-channel: mobile header
|
|
315
|
+
// If we see 'unknown', it means SDK integration is incomplete
|
|
316
|
+
return 'unknown';
|
|
212
317
|
}
|
|
213
318
|
/**
|
|
214
319
|
* Parse UTM parameters from a URL (deep link, referrer, etc.).
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data-source.type.js","sourceRoot":"","sources":["../../../../src/shared-lib/types/data-source.type.ts"],"names":[],"mappings":";AAAA
|
|
1
|
+
{"version":3,"file":"data-source.type.js","sourceRoot":"","sources":["../../../../src/shared-lib/types/data-source.type.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"redemptionRedeem.request.dto.d.ts","sourceRoot":"","sources":["../../../../../src/shared-lib/dto/redemption/redemptionRedeem.request.dto.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4CAA4C,CAAC;AAEjF,qBAAa,0BAA0B;IACnC;;;;;;OAMG;IAUH,YAAY,EAAG,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"redemptionRedeem.request.dto.d.ts","sourceRoot":"","sources":["../../../../../src/shared-lib/dto/redemption/redemptionRedeem.request.dto.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4CAA4C,CAAC;AAEjF,qBAAa,0BAA0B;IACnC;;;;;;OAMG;IAUH,YAAY,EAAG,MAAM,CAAC;IAmBtB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAsB3B,OAAO,CAAC,EAAE,cAAc,CAAC;CAC5B"}
|
|
@@ -32,7 +32,17 @@ __decorate([
|
|
|
32
32
|
], RedemptionRedeemRequestDTO.prototype, "redemptionId", void 0);
|
|
33
33
|
__decorate([
|
|
34
34
|
ApiProperty({
|
|
35
|
-
description:
|
|
35
|
+
description: `Business ID associated with this redemption transaction (optional override).
|
|
36
|
+
|
|
37
|
+
**Token Recipient Priority:**
|
|
38
|
+
1. \`redemption.ownerBusinessId\` - Business that created/owns the redemption (default)
|
|
39
|
+
2. \`dto.businessId\` - This field (override for marketplace/facilitator scenarios)
|
|
40
|
+
3. \`TENANT\` - Platform fallback for platform-wide redemptions
|
|
41
|
+
|
|
42
|
+
**Use Cases:**
|
|
43
|
+
- Omit for standard redemptions (tokens go to redemption owner)
|
|
44
|
+
- Provide for marketplace scenarios where a facilitator business processes redemptions for another business
|
|
45
|
+
- Leave null for platform-managed redemptions without a specific business owner`,
|
|
36
46
|
type: String,
|
|
37
47
|
nullable: true
|
|
38
48
|
}),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"redemptionRedeem.request.dto.js","sourceRoot":"","sources":["../../../../../src/shared-lib/dto/redemption/redemptionRedeem.request.dto.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACnE,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAGlE,MAAM,OAAO,0BAA0B;IACnC;;;;;;OAMG;IACH;;SAEK;IAOL,YAAY,CAAU;
|
|
1
|
+
{"version":3,"file":"redemptionRedeem.request.dto.js","sourceRoot":"","sources":["../../../../../src/shared-lib/dto/redemption/redemptionRedeem.request.dto.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACnE,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAGlE,MAAM,OAAO,0BAA0B;IACnC;;;;;;OAMG;IACH;;SAEK;IAOL,YAAY,CAAU;IAmBtB,UAAU,CAAiB;IAsB3B,OAAO,CAAkB;CAC5B;AA1CG;IANC,WAAW,CAAC;QACT,WAAW,EAAE,mBAAmB;QAChC,IAAI,EAAE,MAAM;KACf,CAAC;IACD,UAAU,EAAE;IACZ,MAAM,EAAE;gEACa;AAmBtB;IAjBC,WAAW,CAAC;QACT,WAAW,EAAE;;;;;;;;;;gFAU2D;QACxE,IAAI,EAAE,MAAM;QACZ,QAAQ,EAAE,IAAI;KACjB,CAAC;IACD,eAAe,EAAE;IACjB,MAAM,EAAE;8DACkB;AAsB3B;IApBC,mBAAmB,CAAC;QACjB,WAAW,EAAE;;;;;;;;;;;;;mGAa8E;QAC3F,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,EAAE,SAAS,EAAE,UAAU,EAAE,YAAY,EAAE,sBAAsB,EAAE,eAAe,EAAE,sBAAsB,EAAE;KACpH,CAAC;IACD,aAAa,EAAE;IACf,QAAQ,EAAE;2DACc"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { BusinessTypeDTO } from '../dto/business/business-type.dto';
|
|
1
2
|
/**
|
|
2
3
|
* Minimal business info for eligible business selectors.
|
|
3
4
|
*
|
|
@@ -13,5 +14,7 @@ export interface EligibleBusinessSummary {
|
|
|
13
14
|
displayName: string;
|
|
14
15
|
/** Optional logo/image URL */
|
|
15
16
|
imageUrl?: string | null;
|
|
17
|
+
/** Business type (for filtering/grouping/display) */
|
|
18
|
+
businessType?: BusinessTypeDTO | null;
|
|
16
19
|
}
|
|
17
20
|
//# sourceMappingURL=eligible-business-summary.interface.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"eligible-business-summary.interface.d.ts","sourceRoot":"","sources":["../../../../src/shared-lib/interfaces/eligible-business-summary.interface.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,MAAM,WAAW,uBAAuB;IACpC,kBAAkB;IAClB,EAAE,EAAE,MAAM,CAAC;IACX,0BAA0B;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,8BAA8B;IAC9B,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"eligible-business-summary.interface.d.ts","sourceRoot":"","sources":["../../../../src/shared-lib/interfaces/eligible-business-summary.interface.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AAEpE;;;;;;;GAOG;AACH,MAAM,WAAW,uBAAuB;IACpC,kBAAkB;IAClB,EAAE,EAAE,MAAM,CAAC;IACX,0BAA0B;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,8BAA8B;IAC9B,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,qDAAqD;IACrD,YAAY,CAAC,EAAE,eAAe,GAAG,IAAI,CAAC;CACzC"}
|
|
@@ -19,14 +19,15 @@
|
|
|
19
19
|
*
|
|
20
20
|
* ## Example Scenarios
|
|
21
21
|
*
|
|
22
|
-
* | Scenario | channel |
|
|
23
|
-
*
|
|
24
|
-
* |
|
|
25
|
-
* | Mobile
|
|
26
|
-
* |
|
|
27
|
-
* |
|
|
28
|
-
* |
|
|
29
|
-
* |
|
|
22
|
+
* | Scenario | channel | platform.deviceType | platform.app/browser | Notes |
|
|
23
|
+
* |-----------------------------|-----------|---------------------|----------------------|-------|
|
|
24
|
+
* | Desktop browser | `web` | `desktop` | `browser: Chrome` | - |
|
|
25
|
+
* | Mobile browser (Safari) | `web` | `phone` | `browser: Safari` | NOT 'mobile' channel |
|
|
26
|
+
* | Native iOS app | `mobile` | `phone` | `app: MyApp` | Requires x-source-channel |
|
|
27
|
+
* | Native Android app | `mobile` | `phone` | `app: MyApp` | Requires x-source-channel |
|
|
28
|
+
* | Partner API integration | `api` | - | - | - |
|
|
29
|
+
* | Admin creates user | `admin` | - | - | - |
|
|
30
|
+
* | Webhook from Stripe | `webhook` | - | - | - |
|
|
30
31
|
*
|
|
31
32
|
* @example
|
|
32
33
|
* // Simple usage - just channel
|
|
@@ -43,6 +44,10 @@
|
|
|
43
44
|
*/
|
|
44
45
|
/**
|
|
45
46
|
* Primary ingestion channels for data source tracking.
|
|
47
|
+
*
|
|
48
|
+
* IMPORTANT:
|
|
49
|
+
* - 'web' = ANY browser (desktop OR mobile) - use platform.deviceType to distinguish
|
|
50
|
+
* - 'mobile' = Native apps ONLY (iOS/Android) - must include platform.app
|
|
46
51
|
*/
|
|
47
52
|
export declare const DATA_SOURCE_CHANNELS: readonly ["web", "mobile", "api", "admin", "system", "import", "webhook", "sync", "migration", "unknown"];
|
|
48
53
|
export type DataSourceChannel = typeof DATA_SOURCE_CHANNELS[number];
|
|
@@ -51,11 +56,19 @@ export type DataSourceChannel = typeof DATA_SOURCE_CHANNELS[number];
|
|
|
51
56
|
*
|
|
52
57
|
* Provides both simple channel categorization and optional
|
|
53
58
|
* detailed attribution fields for analytics.
|
|
59
|
+
*
|
|
60
|
+
* CHANNEL USAGE:
|
|
61
|
+
* - 'web': ANY browser (desktop/mobile) - check platform.deviceType and platform.browser
|
|
62
|
+
* - 'mobile': Native apps ONLY - check platform.app and platform.appVersion
|
|
63
|
+
* - Use platform field to get detailed device/environment information
|
|
54
64
|
*/
|
|
55
65
|
export interface DataSource {
|
|
56
66
|
/**
|
|
57
67
|
* Primary ingestion channel.
|
|
58
68
|
* Required field for basic source categorization.
|
|
69
|
+
*
|
|
70
|
+
* - 'web' = Browser (desktop or mobile) - use platform.deviceType to distinguish
|
|
71
|
+
* - 'mobile' = Native mobile app - requires platform.app to be set
|
|
59
72
|
*/
|
|
60
73
|
channel: DataSourceChannel;
|
|
61
74
|
/**
|
|
@@ -83,6 +96,19 @@ export interface DataSource {
|
|
|
83
96
|
* SDK provides this - backend stores as-is.
|
|
84
97
|
*/
|
|
85
98
|
platform?: Platform;
|
|
99
|
+
/**
|
|
100
|
+
* Source of platform data.
|
|
101
|
+
* Indicates whether platform info came from SDK headers or auto-detection.
|
|
102
|
+
*
|
|
103
|
+
* - 'sdk': Explicitly sent via x-platform header (authoritative, trusted)
|
|
104
|
+
* - 'auto': Parsed from User-Agent header (best-effort, may be inaccurate)
|
|
105
|
+
*
|
|
106
|
+
* Use this to:
|
|
107
|
+
* - Identify incomplete SDK integrations (platformSource='auto' or missing)
|
|
108
|
+
* - Filter for high-quality data (platformSource='sdk')
|
|
109
|
+
* - Track SDK adoption progress
|
|
110
|
+
*/
|
|
111
|
+
platformSource?: 'sdk' | 'auto';
|
|
86
112
|
}
|
|
87
113
|
/**
|
|
88
114
|
* Platform/device information for analytics.
|
|
@@ -135,17 +161,37 @@ export declare const KNOWN_SOURCE_DOMAINS: Record<string, string>;
|
|
|
135
161
|
* detectSourceFromReferrer('https://partner.example.com') // 'example'
|
|
136
162
|
*/
|
|
137
163
|
export declare function detectSourceFromReferrer(referrer?: string): string | undefined;
|
|
164
|
+
/**
|
|
165
|
+
* Parse User-Agent string for platform information (fallback when SDK doesn't provide).
|
|
166
|
+
*
|
|
167
|
+
* Extracts OS, browser, device type from standard User-Agent patterns.
|
|
168
|
+
* This is best-effort - SDK headers are authoritative.
|
|
169
|
+
*
|
|
170
|
+
* @param userAgent - User-Agent header value
|
|
171
|
+
* @returns Platform object with detected fields, or undefined if unparseable
|
|
172
|
+
*
|
|
173
|
+
* @example
|
|
174
|
+
* parseUserAgentForPlatform('Mozilla/5.0 (iPhone; CPU iPhone OS 17_4...')
|
|
175
|
+
* // { os: 'iOS', osVersion: '17.4', browser: 'Safari', deviceType: 'phone' }
|
|
176
|
+
*/
|
|
177
|
+
export declare function parseUserAgentForPlatform(userAgent?: string): Platform | undefined;
|
|
138
178
|
/**
|
|
139
179
|
* Auto-detect channel from User-Agent string.
|
|
140
180
|
*
|
|
181
|
+
* IMPORTANT DESIGN:
|
|
182
|
+
* - Mobile browsers (Safari on iPhone, Chrome on Android) → 'web' (NOT 'mobile')
|
|
183
|
+
* - Native apps MUST send explicit x-source-channel: mobile header
|
|
184
|
+
* - Use platform.deviceType to distinguish mobile web from desktop web
|
|
185
|
+
*
|
|
141
186
|
* @param userAgent - User-Agent header value
|
|
142
187
|
* @param path - Optional request path for webhook detection
|
|
143
188
|
* @returns Detected channel
|
|
144
189
|
*
|
|
145
190
|
* @example
|
|
146
|
-
* detectChannelFromUserAgent('Mozilla/5.0 (iPhone; ...)') // 'mobile
|
|
147
|
-
* detectChannelFromUserAgent('Mozilla/5.0 (Windows NT...)') // 'web'
|
|
191
|
+
* detectChannelFromUserAgent('Mozilla/5.0 (iPhone; ...) Safari') // 'web' (mobile browser)
|
|
192
|
+
* detectChannelFromUserAgent('Mozilla/5.0 (Windows NT...)') // 'web' (desktop browser)
|
|
148
193
|
* detectChannelFromUserAgent('', '/webhook/stripe') // 'webhook'
|
|
194
|
+
* detectChannelFromUserAgent('MyApp/1.0') // 'unknown' (native app without header)
|
|
149
195
|
*/
|
|
150
196
|
export declare function detectChannelFromUserAgent(userAgent?: string, path?: string): DataSourceChannel;
|
|
151
197
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data-source.type.d.ts","sourceRoot":"","sources":["../../../../src/shared-lib/types/data-source.type.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"data-source.type.d.ts","sourceRoot":"","sources":["../../../../src/shared-lib/types/data-source.type.ts"],"names":[],"mappings":"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"}
|
|
@@ -19,14 +19,15 @@
|
|
|
19
19
|
*
|
|
20
20
|
* ## Example Scenarios
|
|
21
21
|
*
|
|
22
|
-
* | Scenario | channel |
|
|
23
|
-
*
|
|
24
|
-
* |
|
|
25
|
-
* | Mobile
|
|
26
|
-
* |
|
|
27
|
-
* |
|
|
28
|
-
* |
|
|
29
|
-
* |
|
|
22
|
+
* | Scenario | channel | platform.deviceType | platform.app/browser | Notes |
|
|
23
|
+
* |-----------------------------|-----------|---------------------|----------------------|-------|
|
|
24
|
+
* | Desktop browser | `web` | `desktop` | `browser: Chrome` | - |
|
|
25
|
+
* | Mobile browser (Safari) | `web` | `phone` | `browser: Safari` | NOT 'mobile' channel |
|
|
26
|
+
* | Native iOS app | `mobile` | `phone` | `app: MyApp` | Requires x-source-channel |
|
|
27
|
+
* | Native Android app | `mobile` | `phone` | `app: MyApp` | Requires x-source-channel |
|
|
28
|
+
* | Partner API integration | `api` | - | - | - |
|
|
29
|
+
* | Admin creates user | `admin` | - | - | - |
|
|
30
|
+
* | Webhook from Stripe | `webhook` | - | - | - |
|
|
30
31
|
*
|
|
31
32
|
* @example
|
|
32
33
|
* // Simple usage - just channel
|
|
@@ -43,10 +44,14 @@
|
|
|
43
44
|
*/
|
|
44
45
|
/**
|
|
45
46
|
* Primary ingestion channels for data source tracking.
|
|
47
|
+
*
|
|
48
|
+
* IMPORTANT:
|
|
49
|
+
* - 'web' = ANY browser (desktop OR mobile) - use platform.deviceType to distinguish
|
|
50
|
+
* - 'mobile' = Native apps ONLY (iOS/Android) - must include platform.app
|
|
46
51
|
*/
|
|
47
52
|
export const DATA_SOURCE_CHANNELS = [
|
|
48
|
-
'web', // Web
|
|
49
|
-
'mobile', //
|
|
53
|
+
'web', // Web browser (desktop or mobile) - check platform.deviceType
|
|
54
|
+
'mobile', // Native mobile app ONLY (iOS/Android) - requires platform.app
|
|
50
55
|
'api', // Direct API integration
|
|
51
56
|
'admin', // Admin panel/back-office
|
|
52
57
|
'system', // System-generated (automated)
|
|
@@ -174,17 +179,114 @@ export function detectSourceFromReferrer(referrer) {
|
|
|
174
179
|
return undefined;
|
|
175
180
|
}
|
|
176
181
|
}
|
|
182
|
+
/**
|
|
183
|
+
* Parse User-Agent string for platform information (fallback when SDK doesn't provide).
|
|
184
|
+
*
|
|
185
|
+
* Extracts OS, browser, device type from standard User-Agent patterns.
|
|
186
|
+
* This is best-effort - SDK headers are authoritative.
|
|
187
|
+
*
|
|
188
|
+
* @param userAgent - User-Agent header value
|
|
189
|
+
* @returns Platform object with detected fields, or undefined if unparseable
|
|
190
|
+
*
|
|
191
|
+
* @example
|
|
192
|
+
* parseUserAgentForPlatform('Mozilla/5.0 (iPhone; CPU iPhone OS 17_4...')
|
|
193
|
+
* // { os: 'iOS', osVersion: '17.4', browser: 'Safari', deviceType: 'phone' }
|
|
194
|
+
*/
|
|
195
|
+
export function parseUserAgentForPlatform(userAgent) {
|
|
196
|
+
if (!userAgent)
|
|
197
|
+
return undefined;
|
|
198
|
+
const ua = userAgent;
|
|
199
|
+
const platform = {};
|
|
200
|
+
// Detect OS and device type
|
|
201
|
+
if (/iPhone|iPod/i.test(ua)) {
|
|
202
|
+
platform.os = 'iOS';
|
|
203
|
+
const match = ua.match(/OS (\d+)[_\.](\d+)/);
|
|
204
|
+
if (match)
|
|
205
|
+
platform.osVersion = `${match[1]}.${match[2]}`;
|
|
206
|
+
platform.deviceType = 'phone';
|
|
207
|
+
}
|
|
208
|
+
else if (/iPad/i.test(ua)) {
|
|
209
|
+
platform.os = 'iOS';
|
|
210
|
+
const match = ua.match(/OS (\d+)[_\.](\d+)/);
|
|
211
|
+
if (match)
|
|
212
|
+
platform.osVersion = `${match[1]}.${match[2]}`;
|
|
213
|
+
platform.deviceType = 'tablet';
|
|
214
|
+
}
|
|
215
|
+
else if (/Android/i.test(ua)) {
|
|
216
|
+
platform.os = 'Android';
|
|
217
|
+
const match = ua.match(/Android ([\d\.]+)/);
|
|
218
|
+
if (match)
|
|
219
|
+
platform.osVersion = match[1];
|
|
220
|
+
platform.deviceType = /Mobile/i.test(ua) ? 'phone' : 'tablet';
|
|
221
|
+
}
|
|
222
|
+
else if (/Windows NT/i.test(ua)) {
|
|
223
|
+
platform.os = 'Windows';
|
|
224
|
+
const match = ua.match(/Windows NT ([\d\.]+)/);
|
|
225
|
+
if (match)
|
|
226
|
+
platform.osVersion = match[1];
|
|
227
|
+
platform.deviceType = 'desktop';
|
|
228
|
+
}
|
|
229
|
+
else if (/Macintosh|Mac OS X/i.test(ua)) {
|
|
230
|
+
platform.os = 'macOS';
|
|
231
|
+
const match = ua.match(/Mac OS X ([\d_]+)/);
|
|
232
|
+
if (match)
|
|
233
|
+
platform.osVersion = match[1].replace(/_/g, '.');
|
|
234
|
+
platform.deviceType = 'desktop';
|
|
235
|
+
}
|
|
236
|
+
else if (/Linux/i.test(ua) && !/Android/i.test(ua)) {
|
|
237
|
+
platform.os = 'Linux';
|
|
238
|
+
platform.deviceType = 'desktop';
|
|
239
|
+
}
|
|
240
|
+
// Detect browser (web channel)
|
|
241
|
+
if (/Edg\//i.test(ua)) {
|
|
242
|
+
platform.browser = 'Edge';
|
|
243
|
+
const match = ua.match(/Edg\/([\d\.]+)/);
|
|
244
|
+
if (match)
|
|
245
|
+
platform.browserVersion = match[1];
|
|
246
|
+
}
|
|
247
|
+
else if (/Chrome\//i.test(ua) && !/Edg/i.test(ua)) {
|
|
248
|
+
platform.browser = 'Chrome';
|
|
249
|
+
const match = ua.match(/Chrome\/([\d\.]+)/);
|
|
250
|
+
if (match)
|
|
251
|
+
platform.browserVersion = match[1];
|
|
252
|
+
}
|
|
253
|
+
else if (/Safari\//i.test(ua) && !/Chrome/i.test(ua)) {
|
|
254
|
+
platform.browser = 'Safari';
|
|
255
|
+
const match = ua.match(/Version\/([\d\.]+)/);
|
|
256
|
+
if (match)
|
|
257
|
+
platform.browserVersion = match[1];
|
|
258
|
+
}
|
|
259
|
+
else if (/Firefox\//i.test(ua)) {
|
|
260
|
+
platform.browser = 'Firefox';
|
|
261
|
+
const match = ua.match(/Firefox\/([\d\.]+)/);
|
|
262
|
+
if (match)
|
|
263
|
+
platform.browserVersion = match[1];
|
|
264
|
+
}
|
|
265
|
+
else if (/Opera|OPR\//i.test(ua)) {
|
|
266
|
+
platform.browser = 'Opera';
|
|
267
|
+
const match = ua.match(/(?:Opera|OPR)\/([\d\.]+)/);
|
|
268
|
+
if (match)
|
|
269
|
+
platform.browserVersion = match[1];
|
|
270
|
+
}
|
|
271
|
+
return Object.keys(platform).length > 0 ? platform : undefined;
|
|
272
|
+
}
|
|
177
273
|
/**
|
|
178
274
|
* Auto-detect channel from User-Agent string.
|
|
179
275
|
*
|
|
276
|
+
* IMPORTANT DESIGN:
|
|
277
|
+
* - Mobile browsers (Safari on iPhone, Chrome on Android) → 'web' (NOT 'mobile')
|
|
278
|
+
* - Native apps MUST send explicit x-source-channel: mobile header
|
|
279
|
+
* - Use platform.deviceType to distinguish mobile web from desktop web
|
|
280
|
+
*
|
|
180
281
|
* @param userAgent - User-Agent header value
|
|
181
282
|
* @param path - Optional request path for webhook detection
|
|
182
283
|
* @returns Detected channel
|
|
183
284
|
*
|
|
184
285
|
* @example
|
|
185
|
-
* detectChannelFromUserAgent('Mozilla/5.0 (iPhone; ...)') // 'mobile
|
|
186
|
-
* detectChannelFromUserAgent('Mozilla/5.0 (Windows NT...)') // 'web'
|
|
286
|
+
* detectChannelFromUserAgent('Mozilla/5.0 (iPhone; ...) Safari') // 'web' (mobile browser)
|
|
287
|
+
* detectChannelFromUserAgent('Mozilla/5.0 (Windows NT...)') // 'web' (desktop browser)
|
|
187
288
|
* detectChannelFromUserAgent('', '/webhook/stripe') // 'webhook'
|
|
289
|
+
* detectChannelFromUserAgent('MyApp/1.0') // 'unknown' (native app without header)
|
|
188
290
|
*/
|
|
189
291
|
export function detectChannelFromUserAgent(userAgent, path) {
|
|
190
292
|
// Check for webhook paths
|
|
@@ -192,16 +294,18 @@ export function detectChannelFromUserAgent(userAgent, path) {
|
|
|
192
294
|
return 'webhook';
|
|
193
295
|
}
|
|
194
296
|
const ua = (userAgent || '').toLowerCase();
|
|
195
|
-
// Check for mobile user-agents
|
|
196
|
-
if (/mobile|android|iphone|ipad|ipod|blackberry|windows phone/i.test(ua)) {
|
|
197
|
-
return 'mobile';
|
|
198
|
-
}
|
|
199
297
|
// Check for bot/crawler patterns (system)
|
|
200
298
|
if (/bot|crawler|spider|scraper|curl|wget|python|node-fetch|axios/i.test(ua)) {
|
|
201
299
|
return 'api';
|
|
202
300
|
}
|
|
203
|
-
//
|
|
204
|
-
|
|
301
|
+
// Check for ANY browser pattern (desktop OR mobile)
|
|
302
|
+
// Mobile browsers are 'web' channel - use platform.deviceType to distinguish
|
|
303
|
+
if (ua && /mozilla|chrome|safari|firefox|edge|opera|msie|trident/i.test(ua)) {
|
|
304
|
+
return 'web';
|
|
305
|
+
}
|
|
306
|
+
// Unknown: Native apps MUST send x-source-channel: mobile header
|
|
307
|
+
// If we see 'unknown', it means SDK integration is incomplete
|
|
308
|
+
return 'unknown';
|
|
205
309
|
}
|
|
206
310
|
/**
|
|
207
311
|
* Parse UTM parameters from a URL (deep link, referrer, etc.).
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data-source.type.js","sourceRoot":"","sources":["../../../../src/shared-lib/types/data-source.type.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"data-source.type.js","sourceRoot":"","sources":["../../../../src/shared-lib/types/data-source.type.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED