@glideidentity/web-client-sdk 5.1.3 → 6.0.0-beta.2

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 (203) hide show
  1. package/README.md +337 -526
  2. package/dist/browser/web-client-sdk.min.js +1 -1
  3. package/dist/cjs/adapters/index.js +15 -0
  4. package/dist/cjs/adapters/react.js +192 -0
  5. package/dist/cjs/adapters/vanilla.js +38 -0
  6. package/dist/cjs/adapters/vue.js +187 -0
  7. package/dist/cjs/browser.js +58 -0
  8. package/dist/cjs/client/http.js +159 -0
  9. package/dist/cjs/client/index.js +19 -0
  10. package/dist/cjs/client/logger.js +135 -0
  11. package/dist/cjs/client/phone-auth-client.js +428 -0
  12. package/dist/cjs/client/strategies/polling.js +177 -0
  13. package/dist/cjs/core/errors.js +204 -0
  14. package/dist/cjs/core/index.js +83 -0
  15. package/dist/cjs/core/type-guards.js +196 -0
  16. package/dist/cjs/core/types.js +25 -0
  17. package/dist/{core/phone-auth/validation-utils.js → cjs/core/validators.js} +70 -23
  18. package/dist/cjs/index.js +81 -0
  19. package/dist/cjs/ui/index.js +11 -0
  20. package/dist/{core/phone-auth → cjs}/ui/mobile-debug-console.js +149 -78
  21. package/dist/cjs/ui/modal.js +1122 -0
  22. package/dist/esm/adapters/index.js +11 -0
  23. package/dist/esm/adapters/react.js +182 -0
  24. package/dist/esm/adapters/vanilla.js +29 -0
  25. package/dist/esm/adapters/vue.js +177 -0
  26. package/dist/esm/browser.js +30 -11
  27. package/dist/esm/client/http.js +156 -0
  28. package/dist/esm/client/index.js +11 -0
  29. package/dist/esm/client/logger.js +131 -0
  30. package/dist/esm/client/phone-auth-client.js +424 -0
  31. package/dist/esm/client/strategies/polling.js +174 -0
  32. package/dist/esm/core/errors.js +193 -0
  33. package/dist/esm/core/index.js +60 -0
  34. package/dist/esm/core/type-guards.js +181 -0
  35. package/dist/esm/core/types.js +22 -1
  36. package/dist/esm/core/{phone-auth/validation-utils.js → validators.js} +66 -21
  37. package/dist/esm/index.js +45 -17
  38. package/dist/esm/ui/index.js +5 -0
  39. package/dist/esm/{core/phone-auth/ui → ui}/mobile-debug-console.js +149 -78
  40. package/dist/esm/ui/modal.js +1117 -0
  41. package/dist/types/adapters/index.d.ts +10 -0
  42. package/dist/types/adapters/index.d.ts.map +1 -0
  43. package/dist/types/adapters/react.d.ts +70 -0
  44. package/dist/types/adapters/react.d.ts.map +1 -0
  45. package/dist/types/adapters/vanilla.d.ts +29 -0
  46. package/dist/types/adapters/vanilla.d.ts.map +1 -0
  47. package/dist/types/adapters/vue.d.ts +71 -0
  48. package/dist/types/adapters/vue.d.ts.map +1 -0
  49. package/dist/types/browser.d.ts +27 -0
  50. package/dist/types/browser.d.ts.map +1 -0
  51. package/dist/types/client/http.d.ts +41 -0
  52. package/dist/types/client/http.d.ts.map +1 -0
  53. package/dist/types/client/index.d.ts +10 -0
  54. package/dist/types/client/index.d.ts.map +1 -0
  55. package/dist/types/client/logger.d.ts +36 -0
  56. package/dist/types/client/logger.d.ts.map +1 -0
  57. package/dist/types/client/phone-auth-client.d.ts +91 -0
  58. package/dist/types/client/phone-auth-client.d.ts.map +1 -0
  59. package/dist/types/client/strategies/polling.d.ts +36 -0
  60. package/dist/types/client/strategies/polling.d.ts.map +1 -0
  61. package/dist/types/core/errors.d.ts +71 -0
  62. package/dist/types/core/errors.d.ts.map +1 -0
  63. package/dist/types/core/index.d.ts +38 -0
  64. package/dist/types/core/index.d.ts.map +1 -0
  65. package/dist/types/core/type-guards.d.ts +118 -0
  66. package/dist/types/core/type-guards.d.ts.map +1 -0
  67. package/dist/types/core/types.d.ts +535 -0
  68. package/dist/types/core/types.d.ts.map +1 -0
  69. package/dist/types/core/validators.d.ts +63 -0
  70. package/dist/types/core/validators.d.ts.map +1 -0
  71. package/dist/types/index.d.ts +40 -0
  72. package/dist/types/index.d.ts.map +1 -0
  73. package/dist/types/ui/index.d.ts +6 -0
  74. package/dist/types/ui/index.d.ts.map +1 -0
  75. package/dist/{esm/core/phone-auth → types}/ui/mobile-debug-console.d.ts +1 -0
  76. package/dist/types/ui/mobile-debug-console.d.ts.map +1 -0
  77. package/dist/types/ui/modal.d.ts +87 -0
  78. package/dist/types/ui/modal.d.ts.map +1 -0
  79. package/package.json +48 -34
  80. package/dist/adapters/angular/client.service.d.ts +0 -7
  81. package/dist/adapters/angular/client.service.js +0 -30
  82. package/dist/adapters/angular/index.d.ts +0 -3
  83. package/dist/adapters/angular/index.js +0 -18
  84. package/dist/adapters/angular/phone-auth.service.d.ts +0 -38
  85. package/dist/adapters/angular/phone-auth.service.js +0 -130
  86. package/dist/adapters/react/index.d.ts +0 -9
  87. package/dist/adapters/react/index.js +0 -28
  88. package/dist/adapters/react/useClient.d.ts +0 -26
  89. package/dist/adapters/react/useClient.js +0 -121
  90. package/dist/adapters/react/usePhoneAuth.d.ts +0 -23
  91. package/dist/adapters/react/usePhoneAuth.js +0 -95
  92. package/dist/adapters/vanilla/client.d.ts +0 -8
  93. package/dist/adapters/vanilla/client.js +0 -33
  94. package/dist/adapters/vanilla/index.d.ts +0 -3
  95. package/dist/adapters/vanilla/index.js +0 -18
  96. package/dist/adapters/vanilla/phone-auth.d.ts +0 -46
  97. package/dist/adapters/vanilla/phone-auth.js +0 -138
  98. package/dist/adapters/vue/index.d.ts +0 -10
  99. package/dist/adapters/vue/index.js +0 -36
  100. package/dist/adapters/vue/useClient.d.ts +0 -115
  101. package/dist/adapters/vue/useClient.js +0 -131
  102. package/dist/adapters/vue/usePhoneAuth.d.ts +0 -94
  103. package/dist/adapters/vue/usePhoneAuth.js +0 -103
  104. package/dist/browser.d.ts +0 -7
  105. package/dist/browser.js +0 -31
  106. package/dist/core/client.d.ts +0 -22
  107. package/dist/core/client.js +0 -77
  108. package/dist/core/logger.d.ts +0 -130
  109. package/dist/core/logger.js +0 -370
  110. package/dist/core/phone-auth/api-types.d.ts +0 -593
  111. package/dist/core/phone-auth/api-types.js +0 -215
  112. package/dist/core/phone-auth/client.d.ts +0 -189
  113. package/dist/core/phone-auth/client.js +0 -1441
  114. package/dist/core/phone-auth/error-utils.d.ts +0 -110
  115. package/dist/core/phone-auth/error-utils.js +0 -350
  116. package/dist/core/phone-auth/index.d.ts +0 -7
  117. package/dist/core/phone-auth/index.js +0 -50
  118. package/dist/core/phone-auth/status-types.d.ts +0 -107
  119. package/dist/core/phone-auth/status-types.js +0 -31
  120. package/dist/core/phone-auth/strategies/desktop.d.ts +0 -122
  121. package/dist/core/phone-auth/strategies/desktop.js +0 -596
  122. package/dist/core/phone-auth/strategies/index.d.ts +0 -11
  123. package/dist/core/phone-auth/strategies/index.js +0 -15
  124. package/dist/core/phone-auth/strategies/link.d.ts +0 -89
  125. package/dist/core/phone-auth/strategies/link.js +0 -384
  126. package/dist/core/phone-auth/strategies/ts43.d.ts +0 -32
  127. package/dist/core/phone-auth/strategies/ts43.js +0 -161
  128. package/dist/core/phone-auth/strategies/types.d.ts +0 -18
  129. package/dist/core/phone-auth/strategies/types.js +0 -6
  130. package/dist/core/phone-auth/type-guards.d.ts +0 -143
  131. package/dist/core/phone-auth/type-guards.js +0 -198
  132. package/dist/core/phone-auth/types.d.ts +0 -237
  133. package/dist/core/phone-auth/types.js +0 -93
  134. package/dist/core/phone-auth/ui/mobile-debug-console.d.ts +0 -25
  135. package/dist/core/phone-auth/ui/modal.d.ts +0 -88
  136. package/dist/core/phone-auth/ui/modal.js +0 -598
  137. package/dist/core/phone-auth/validation-utils.d.ts +0 -44
  138. package/dist/core/types.d.ts +0 -62
  139. package/dist/core/types.js +0 -2
  140. package/dist/core/version.d.ts +0 -1
  141. package/dist/core/version.js +0 -5
  142. package/dist/esm/adapters/angular/client.service.d.ts +0 -7
  143. package/dist/esm/adapters/angular/client.service.js +0 -27
  144. package/dist/esm/adapters/angular/index.d.ts +0 -3
  145. package/dist/esm/adapters/angular/index.js +0 -4
  146. package/dist/esm/adapters/angular/phone-auth.service.d.ts +0 -38
  147. package/dist/esm/adapters/angular/phone-auth.service.js +0 -127
  148. package/dist/esm/adapters/react/index.d.ts +0 -9
  149. package/dist/esm/adapters/react/index.js +0 -8
  150. package/dist/esm/adapters/react/useClient.d.ts +0 -26
  151. package/dist/esm/adapters/react/useClient.js +0 -116
  152. package/dist/esm/adapters/react/usePhoneAuth.d.ts +0 -23
  153. package/dist/esm/adapters/react/usePhoneAuth.js +0 -92
  154. package/dist/esm/adapters/vanilla/client.d.ts +0 -8
  155. package/dist/esm/adapters/vanilla/client.js +0 -29
  156. package/dist/esm/adapters/vanilla/index.d.ts +0 -3
  157. package/dist/esm/adapters/vanilla/index.js +0 -4
  158. package/dist/esm/adapters/vanilla/phone-auth.d.ts +0 -46
  159. package/dist/esm/adapters/vanilla/phone-auth.js +0 -134
  160. package/dist/esm/adapters/vue/index.d.ts +0 -10
  161. package/dist/esm/adapters/vue/index.js +0 -11
  162. package/dist/esm/adapters/vue/useClient.d.ts +0 -115
  163. package/dist/esm/adapters/vue/useClient.js +0 -127
  164. package/dist/esm/adapters/vue/usePhoneAuth.d.ts +0 -94
  165. package/dist/esm/adapters/vue/usePhoneAuth.js +0 -100
  166. package/dist/esm/browser.d.ts +0 -7
  167. package/dist/esm/core/client.d.ts +0 -22
  168. package/dist/esm/core/client.js +0 -70
  169. package/dist/esm/core/logger.d.ts +0 -130
  170. package/dist/esm/core/logger.js +0 -359
  171. package/dist/esm/core/phone-auth/api-types.d.ts +0 -593
  172. package/dist/esm/core/phone-auth/api-types.js +0 -203
  173. package/dist/esm/core/phone-auth/client.d.ts +0 -189
  174. package/dist/esm/core/phone-auth/client.js +0 -1404
  175. package/dist/esm/core/phone-auth/error-utils.d.ts +0 -110
  176. package/dist/esm/core/phone-auth/error-utils.js +0 -338
  177. package/dist/esm/core/phone-auth/index.d.ts +0 -7
  178. package/dist/esm/core/phone-auth/index.js +0 -8
  179. package/dist/esm/core/phone-auth/status-types.d.ts +0 -107
  180. package/dist/esm/core/phone-auth/status-types.js +0 -26
  181. package/dist/esm/core/phone-auth/strategies/desktop.d.ts +0 -122
  182. package/dist/esm/core/phone-auth/strategies/desktop.js +0 -590
  183. package/dist/esm/core/phone-auth/strategies/index.d.ts +0 -11
  184. package/dist/esm/core/phone-auth/strategies/index.js +0 -7
  185. package/dist/esm/core/phone-auth/strategies/link.d.ts +0 -89
  186. package/dist/esm/core/phone-auth/strategies/link.js +0 -380
  187. package/dist/esm/core/phone-auth/strategies/ts43.d.ts +0 -32
  188. package/dist/esm/core/phone-auth/strategies/ts43.js +0 -157
  189. package/dist/esm/core/phone-auth/strategies/types.d.ts +0 -18
  190. package/dist/esm/core/phone-auth/strategies/types.js +0 -5
  191. package/dist/esm/core/phone-auth/type-guards.d.ts +0 -143
  192. package/dist/esm/core/phone-auth/type-guards.js +0 -185
  193. package/dist/esm/core/phone-auth/types.d.ts +0 -237
  194. package/dist/esm/core/phone-auth/types.js +0 -76
  195. package/dist/esm/core/phone-auth/ui/modal.d.ts +0 -88
  196. package/dist/esm/core/phone-auth/ui/modal.js +0 -594
  197. package/dist/esm/core/phone-auth/validation-utils.d.ts +0 -44
  198. package/dist/esm/core/types.d.ts +0 -62
  199. package/dist/esm/core/version.d.ts +0 -1
  200. package/dist/esm/core/version.js +0 -2
  201. package/dist/esm/index.d.ts +0 -12
  202. package/dist/index.d.ts +0 -12
  203. package/dist/index.js +0 -55
@@ -1,70 +0,0 @@
1
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
- return new (P || (P = Promise))(function (resolve, reject) {
4
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
- step((generator = generator.apply(thisArg, _arguments || [])).next());
8
- });
9
- };
10
- import axios from 'axios';
11
- import { PhoneAuthClient } from './phone-auth';
12
- export class SDKClient {
13
- constructor(config) {
14
- this.config = config;
15
- this.client = axios.create({
16
- baseURL: config.baseURL || '',
17
- timeout: config.timeout || 10000,
18
- headers: {
19
- 'Content-Type': 'application/json',
20
- },
21
- });
22
- // Initialize Phone Auth client
23
- this.phoneAuth = new PhoneAuthClient({
24
- endpoints: config.phoneAuthEndpoints ? {
25
- prepare: config.phoneAuthEndpoints.prepareRequest,
26
- process: config.phoneAuthEndpoints.processResponse
27
- } : undefined,
28
- debug: config.debug
29
- });
30
- // Add authentication interceptor
31
- this.client.interceptors.request.use((config) => __awaiter(this, void 0, void 0, function* () {
32
- if (this.token) {
33
- config.headers.Authorization = `Bearer ${this.token}`;
34
- }
35
- return config;
36
- }));
37
- }
38
- /**
39
- * Set authentication token for API requests
40
- */
41
- setToken(token) {
42
- this.token = token;
43
- }
44
- /**
45
- * Clear authentication token
46
- */
47
- clearToken() {
48
- this.token = undefined;
49
- }
50
- /**
51
- * Make a GET request to the API
52
- * Note: Requires baseURL to be set in the config
53
- */
54
- get(path, options) {
55
- return __awaiter(this, void 0, void 0, function* () {
56
- if (!this.config.baseURL) {
57
- throw new Error('baseURL is required for making API requests. Please provide it in the ClientConfig.');
58
- }
59
- const response = yield this.client.get(path, {
60
- headers: options === null || options === void 0 ? void 0 : options.headers,
61
- params: options === null || options === void 0 ? void 0 : options.params,
62
- });
63
- return {
64
- data: response.data,
65
- status: response.status,
66
- headers: Object.fromEntries(Object.entries(response.headers).map(([k, v]) => [k, String(v)])),
67
- };
68
- });
69
- }
70
- }
@@ -1,130 +0,0 @@
1
- /**
2
- * Industry-grade logging for Glide Web SDK
3
- * Following best practices from Stripe, Auth0, Twilio, and AWS Amplify
4
- */
5
- export declare enum LogLevel {
6
- SILENT = 0,
7
- ERROR = 1,
8
- WARN = 2,
9
- INFO = 3,
10
- DEBUG = 4
11
- }
12
- export interface LogFields {
13
- [key: string]: any;
14
- }
15
- export interface Logger {
16
- debug(message: string, fields?: LogFields): void;
17
- info(message: string, fields?: LogFields): void;
18
- warn(message: string, fields?: LogFields): void;
19
- error(message: string, fields?: LogFields): void;
20
- }
21
- /**
22
- * Default browser console logger with automatic data sanitization
23
- */
24
- export declare class ConsoleLogger implements Logger {
25
- private level;
26
- private prefix;
27
- private enableGrouping;
28
- constructor(level?: LogLevel, prefix?: string, enableGrouping?: boolean);
29
- debug(message: string, fields?: LogFields): void;
30
- info(message: string, fields?: LogFields): void;
31
- warn(message: string, fields?: LogFields): void;
32
- error(message: string, fields?: LogFields): void;
33
- private log;
34
- /**
35
- * Sanitize sensitive data from log fields
36
- */
37
- private sanitizeFields;
38
- /**
39
- * Redact sensitive information based on field name and value patterns
40
- */
41
- private sanitizeValue;
42
- }
43
- /**
44
- * No-op logger for when logging is disabled
45
- */
46
- export declare class NoopLogger implements Logger {
47
- debug(message: string, fields?: LogFields): void;
48
- info(message: string, fields?: LogFields): void;
49
- warn(message: string, fields?: LogFields): void;
50
- error(message: string, fields?: LogFields): void;
51
- }
52
- /**
53
- * Remote logger for sending logs to a backend service
54
- * Useful for debugging production issues
55
- */
56
- export declare class RemoteLogger implements Logger {
57
- private endpoint;
58
- private apiKey;
59
- private localLogger;
60
- private buffer;
61
- private flushInterval;
62
- private maxBufferSize;
63
- constructor(endpoint: string, apiKey: string, fallbackLogger?: Logger);
64
- debug(message: string, fields?: LogFields): void;
65
- info(message: string, fields?: LogFields): void;
66
- warn(message: string, fields?: LogFields): void;
67
- error(message: string, fields?: LogFields): void;
68
- private log;
69
- private flush;
70
- }
71
- /**
72
- * Parse log level from string
73
- */
74
- export declare function parseLogLevel(level: string): LogLevel;
75
- /**
76
- * Get log level from browser environment
77
- */
78
- export declare function getLogLevelFromEnv(): LogLevel;
79
- /**
80
- * Performance timer for measuring operation duration
81
- */
82
- export declare class PerformanceTimer {
83
- private startTime;
84
- private marks;
85
- private logger;
86
- constructor(logger: Logger);
87
- /**
88
- * Mark a point in time
89
- */
90
- mark(name: string): void;
91
- /**
92
- * Log elapsed time with optional fields
93
- */
94
- logElapsed(message: string, fields?: LogFields): void;
95
- /**
96
- * Log time between marks
97
- */
98
- logMarkDuration(fromMark: string, toMark: string, message: string, fields?: LogFields): void;
99
- }
100
- /**
101
- * Generate a unique request ID for distributed tracing
102
- */
103
- export declare function generateRequestId(): string;
104
- /**
105
- * Logger factory for creating loggers with consistent configuration
106
- */
107
- export declare class LoggerFactory {
108
- private static defaultLevel;
109
- private static defaultLogger;
110
- /**
111
- * Set the default log level for all new loggers
112
- */
113
- static setDefaultLevel(level: LogLevel): void;
114
- /**
115
- * Set a default logger instance to use
116
- */
117
- static setDefaultLogger(logger: Logger): void;
118
- /**
119
- * Create a logger instance based on configuration
120
- */
121
- static create(options?: {
122
- level?: LogLevel;
123
- prefix?: string;
124
- remote?: {
125
- endpoint: string;
126
- apiKey: string;
127
- };
128
- custom?: Logger;
129
- }): Logger;
130
- }
@@ -1,359 +0,0 @@
1
- /**
2
- * Industry-grade logging for Glide Web SDK
3
- * Following best practices from Stripe, Auth0, Twilio, and AWS Amplify
4
- */
5
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
6
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
7
- return new (P || (P = Promise))(function (resolve, reject) {
8
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
9
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
10
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
11
- step((generator = generator.apply(thisArg, _arguments || [])).next());
12
- });
13
- };
14
- export var LogLevel;
15
- (function (LogLevel) {
16
- LogLevel[LogLevel["SILENT"] = 0] = "SILENT";
17
- LogLevel[LogLevel["ERROR"] = 1] = "ERROR";
18
- LogLevel[LogLevel["WARN"] = 2] = "WARN";
19
- LogLevel[LogLevel["INFO"] = 3] = "INFO";
20
- LogLevel[LogLevel["DEBUG"] = 4] = "DEBUG";
21
- })(LogLevel || (LogLevel = {}));
22
- /**
23
- * Default browser console logger with automatic data sanitization
24
- */
25
- export class ConsoleLogger {
26
- constructor(level = LogLevel.SILENT, prefix = '[Glide]', enableGrouping = false) {
27
- this.level = level;
28
- this.prefix = prefix;
29
- this.enableGrouping = enableGrouping;
30
- }
31
- debug(message, fields) {
32
- if (this.level >= LogLevel.DEBUG) {
33
- this.log('debug', message, fields);
34
- }
35
- }
36
- info(message, fields) {
37
- if (this.level >= LogLevel.INFO) {
38
- this.log('info', message, fields);
39
- }
40
- }
41
- warn(message, fields) {
42
- if (this.level >= LogLevel.WARN) {
43
- this.log('warn', message, fields);
44
- }
45
- }
46
- error(message, fields) {
47
- if (this.level >= LogLevel.ERROR) {
48
- this.log('error', message, fields);
49
- }
50
- }
51
- log(level, message, fields) {
52
- const timestamp = new Date().toISOString();
53
- const sanitizedFields = fields ? this.sanitizeFields(fields) : {};
54
- // Format the message
55
- const formattedMessage = `${this.prefix} ${timestamp} [${level.toUpperCase()}] ${message}`;
56
- // Use console grouping for better readability if enabled
57
- if (this.enableGrouping && Object.keys(sanitizedFields).length > 0) {
58
- console.groupCollapsed(formattedMessage);
59
- Object.entries(sanitizedFields).forEach(([key, value]) => {
60
- console.log(`${key}:`, value);
61
- });
62
- console.groupEnd();
63
- }
64
- else {
65
- // Standard logging with or without fields
66
- if (Object.keys(sanitizedFields).length > 0) {
67
- console[level](formattedMessage, sanitizedFields);
68
- }
69
- else {
70
- console[level](formattedMessage);
71
- }
72
- }
73
- }
74
- /**
75
- * Sanitize sensitive data from log fields
76
- */
77
- sanitizeFields(fields) {
78
- const sanitized = {};
79
- for (const [key, value] of Object.entries(fields)) {
80
- sanitized[key] = this.sanitizeValue(key, value);
81
- }
82
- return sanitized;
83
- }
84
- /**
85
- * Redact sensitive information based on field name and value patterns
86
- */
87
- sanitizeValue(key, value) {
88
- // List of sensitive field patterns
89
- const sensitiveFields = [
90
- 'apikey', 'api_key', 'apiKey',
91
- 'token', 'accesstoken', 'access_token', 'accessToken',
92
- 'password', 'passwd', 'pwd',
93
- 'secret', 'credential',
94
- 'authorization', 'auth',
95
- 'cookie', 'session',
96
- ];
97
- const lowerKey = key.toLowerCase();
98
- // Check if field name indicates sensitive data
99
- for (const sensitive of sensitiveFields) {
100
- if (lowerKey.includes(sensitive.toLowerCase())) {
101
- if (typeof value === 'string' && value.length > 4) {
102
- return value.substring(0, 4) + '****[REDACTED]';
103
- }
104
- return '****[REDACTED]';
105
- }
106
- }
107
- // Handle specific value patterns
108
- if (typeof value === 'string') {
109
- // Phone number pattern - show area code only
110
- const phoneRegex = /^\+?[1-9]\d{6,14}$/;
111
- if (phoneRegex.test(value)) {
112
- return value.substring(0, 6) + '****';
113
- }
114
- // Email pattern - show domain only
115
- const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
116
- if (emailRegex.test(value)) {
117
- const [, domain] = value.split('@');
118
- return '****@' + domain;
119
- }
120
- // URL with credentials
121
- if (value.includes('://') && value.includes('@')) {
122
- return value.replace(/\/\/([^:]+):([^@]+)@/, '//****:****@');
123
- }
124
- // JWT tokens
125
- if (value.startsWith('eyJ') && value.split('.').length === 3) {
126
- return value.substring(0, 10) + '****[JWT]';
127
- }
128
- // Credit card numbers
129
- const creditCardRegex = /\b\d{13,19}\b/;
130
- if (creditCardRegex.test(value)) {
131
- return value.substring(0, 4) + '****' + value.substring(value.length - 4);
132
- }
133
- }
134
- // Recursively sanitize objects
135
- if (value && typeof value === 'object' && !Array.isArray(value)) {
136
- return this.sanitizeFields(value);
137
- }
138
- // Sanitize arrays
139
- if (Array.isArray(value)) {
140
- return value.map((item, index) => this.sanitizeValue(`${key}[${index}]`, item));
141
- }
142
- return value;
143
- }
144
- }
145
- /**
146
- * No-op logger for when logging is disabled
147
- */
148
- export class NoopLogger {
149
- debug(message, fields) { }
150
- info(message, fields) { }
151
- warn(message, fields) { }
152
- error(message, fields) { }
153
- }
154
- /**
155
- * Remote logger for sending logs to a backend service
156
- * Useful for debugging production issues
157
- */
158
- export class RemoteLogger {
159
- constructor(endpoint, apiKey, fallbackLogger) {
160
- this.buffer = [];
161
- this.flushInterval = 5000; // 5 seconds
162
- this.maxBufferSize = 100;
163
- this.endpoint = endpoint;
164
- this.apiKey = apiKey;
165
- this.localLogger = fallbackLogger || new ConsoleLogger(LogLevel.ERROR);
166
- // Set up automatic flushing
167
- if (typeof window !== 'undefined') {
168
- setInterval(() => this.flush(), this.flushInterval);
169
- // Flush on page unload
170
- window.addEventListener('beforeunload', () => this.flush());
171
- }
172
- }
173
- debug(message, fields) {
174
- this.log('debug', message, fields);
175
- }
176
- info(message, fields) {
177
- this.log('info', message, fields);
178
- }
179
- warn(message, fields) {
180
- this.log('warn', message, fields);
181
- }
182
- error(message, fields) {
183
- this.log('error', message, fields);
184
- }
185
- log(level, message, fields) {
186
- const logEntry = {
187
- timestamp: new Date().toISOString(),
188
- level,
189
- message,
190
- fields,
191
- userAgent: typeof navigator !== 'undefined' ? navigator.userAgent : undefined,
192
- url: typeof window !== 'undefined' ? window.location.href : undefined,
193
- };
194
- this.buffer.push(logEntry);
195
- // Also log locally for immediate feedback
196
- this.localLogger[level](message, fields);
197
- // Flush if buffer is full
198
- if (this.buffer.length >= this.maxBufferSize) {
199
- this.flush();
200
- }
201
- }
202
- flush() {
203
- return __awaiter(this, void 0, void 0, function* () {
204
- if (this.buffer.length === 0)
205
- return;
206
- const logs = [...this.buffer];
207
- this.buffer = [];
208
- try {
209
- yield fetch(this.endpoint, {
210
- method: 'POST',
211
- headers: {
212
- 'Content-Type': 'application/json',
213
- 'Authorization': `Bearer ${this.apiKey}`,
214
- },
215
- body: JSON.stringify({ logs }),
216
- });
217
- }
218
- catch (error) {
219
- // Failed to send logs, log locally
220
- this.localLogger.error('Failed to send logs to remote server', { error });
221
- // Optionally, put logs back in buffer for retry
222
- // this.buffer.unshift(...logs);
223
- }
224
- });
225
- }
226
- }
227
- /**
228
- * Parse log level from string
229
- */
230
- export function parseLogLevel(level) {
231
- switch (level.toLowerCase()) {
232
- case 'debug':
233
- return LogLevel.DEBUG;
234
- case 'info':
235
- return LogLevel.INFO;
236
- case 'warn':
237
- case 'warning':
238
- return LogLevel.WARN;
239
- case 'error':
240
- return LogLevel.ERROR;
241
- case 'silent':
242
- case 'none':
243
- case 'off':
244
- return LogLevel.SILENT;
245
- default:
246
- return LogLevel.SILENT;
247
- }
248
- }
249
- /**
250
- * Get log level from browser environment
251
- */
252
- export function getLogLevelFromEnv() {
253
- // Check localStorage
254
- if (typeof localStorage !== 'undefined') {
255
- const storedLevel = localStorage.getItem('GLIDE_LOG_LEVEL');
256
- if (storedLevel) {
257
- return parseLogLevel(storedLevel);
258
- }
259
- const debugFlag = localStorage.getItem('GLIDE_DEBUG');
260
- if (debugFlag === 'true' || debugFlag === '1') {
261
- return LogLevel.DEBUG;
262
- }
263
- }
264
- // Check URL parameters
265
- if (typeof window !== 'undefined' && window.location) {
266
- const params = new URLSearchParams(window.location.search);
267
- const urlLogLevel = params.get('glide_log_level');
268
- if (urlLogLevel) {
269
- return parseLogLevel(urlLogLevel);
270
- }
271
- if (params.has('glide_debug')) {
272
- return LogLevel.DEBUG;
273
- }
274
- }
275
- return LogLevel.SILENT;
276
- }
277
- /**
278
- * Performance timer for measuring operation duration
279
- */
280
- export class PerformanceTimer {
281
- constructor(logger) {
282
- this.marks = new Map();
283
- this.startTime = performance.now();
284
- this.logger = logger;
285
- }
286
- /**
287
- * Mark a point in time
288
- */
289
- mark(name) {
290
- this.marks.set(name, performance.now());
291
- }
292
- /**
293
- * Log elapsed time with optional fields
294
- */
295
- logElapsed(message, fields) {
296
- const elapsed = performance.now() - this.startTime;
297
- this.logger.debug(message, Object.assign(Object.assign({}, fields), { elapsedMs: elapsed, elapsed: `${elapsed.toFixed(2)}ms` }));
298
- }
299
- /**
300
- * Log time between marks
301
- */
302
- logMarkDuration(fromMark, toMark, message, fields) {
303
- const from = this.marks.get(fromMark);
304
- const to = this.marks.get(toMark);
305
- if (from && to) {
306
- const duration = to - from;
307
- this.logger.debug(message, Object.assign(Object.assign({}, fields), { durationMs: duration, duration: `${duration.toFixed(2)}ms`, fromMark,
308
- toMark }));
309
- }
310
- }
311
- }
312
- /**
313
- * Generate a unique request ID for distributed tracing
314
- */
315
- export function generateRequestId() {
316
- return `req_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`;
317
- }
318
- /**
319
- * Logger factory for creating loggers with consistent configuration
320
- */
321
- export class LoggerFactory {
322
- /**
323
- * Set the default log level for all new loggers
324
- */
325
- static setDefaultLevel(level) {
326
- this.defaultLevel = level;
327
- }
328
- /**
329
- * Set a default logger instance to use
330
- */
331
- static setDefaultLogger(logger) {
332
- this.defaultLogger = logger;
333
- }
334
- /**
335
- * Create a logger instance based on configuration
336
- */
337
- static create(options) {
338
- var _a, _b;
339
- // Use custom logger if provided
340
- if (options === null || options === void 0 ? void 0 : options.custom) {
341
- return options.custom;
342
- }
343
- // Use default logger if set
344
- if (this.defaultLogger) {
345
- return this.defaultLogger;
346
- }
347
- // Determine log level
348
- const level = (_b = (_a = options === null || options === void 0 ? void 0 : options.level) !== null && _a !== void 0 ? _a : getLogLevelFromEnv()) !== null && _b !== void 0 ? _b : this.defaultLevel;
349
- // Create remote logger if configured
350
- if (options === null || options === void 0 ? void 0 : options.remote) {
351
- const fallbackLogger = new ConsoleLogger(level, options === null || options === void 0 ? void 0 : options.prefix);
352
- return new RemoteLogger(options.remote.endpoint, options.remote.apiKey, fallbackLogger);
353
- }
354
- // Create console logger
355
- return new ConsoleLogger(level, options === null || options === void 0 ? void 0 : options.prefix);
356
- }
357
- }
358
- LoggerFactory.defaultLevel = LogLevel.SILENT;
359
- LoggerFactory.defaultLogger = null;