datadog-frontend-toolkit 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (173) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +486 -0
  3. package/dist/cjs/context/ContextManager.js +197 -0
  4. package/dist/cjs/context/ContextManager.js.map +1 -0
  5. package/dist/cjs/core/BootstrapGuard.js +81 -0
  6. package/dist/cjs/core/BootstrapGuard.js.map +1 -0
  7. package/dist/cjs/core/ConfigManager.js +133 -0
  8. package/dist/cjs/core/ConfigManager.js.map +1 -0
  9. package/dist/cjs/core/ObservabilitySDK.js +355 -0
  10. package/dist/cjs/core/ObservabilitySDK.js.map +1 -0
  11. package/dist/cjs/errors/ErrorBoundary.js +187 -0
  12. package/dist/cjs/errors/ErrorBoundary.js.map +1 -0
  13. package/dist/cjs/index.js +110 -0
  14. package/dist/cjs/index.js.map +1 -0
  15. package/dist/cjs/logger/LoggerService.js +256 -0
  16. package/dist/cjs/logger/LoggerService.js.map +1 -0
  17. package/dist/cjs/logs/LogsManager.js +112 -0
  18. package/dist/cjs/logs/LogsManager.js.map +1 -0
  19. package/dist/cjs/network/NetworkInterceptor.js +185 -0
  20. package/dist/cjs/network/NetworkInterceptor.js.map +1 -0
  21. package/dist/cjs/performance/PerformanceMonitor.js +290 -0
  22. package/dist/cjs/performance/PerformanceMonitor.js.map +1 -0
  23. package/dist/cjs/resources/ResourceProvisioner.js +210 -0
  24. package/dist/cjs/resources/ResourceProvisioner.js.map +1 -0
  25. package/dist/cjs/resources/templates/dashboard.js +333 -0
  26. package/dist/cjs/resources/templates/dashboard.js.map +1 -0
  27. package/dist/cjs/resources/templates/monitors.js +120 -0
  28. package/dist/cjs/resources/templates/monitors.js.map +1 -0
  29. package/dist/cjs/resources/templates/slos.js +79 -0
  30. package/dist/cjs/resources/templates/slos.js.map +1 -0
  31. package/dist/cjs/rum/RumManager.js +164 -0
  32. package/dist/cjs/rum/RumManager.js.map +1 -0
  33. package/dist/cjs/types/config.js +13 -0
  34. package/dist/cjs/types/config.js.map +1 -0
  35. package/dist/cjs/types/events.js +26 -0
  36. package/dist/cjs/types/events.js.map +1 -0
  37. package/dist/cjs/types/index.js +20 -0
  38. package/dist/cjs/types/index.js.map +1 -0
  39. package/dist/cjs/types/logger.js +13 -0
  40. package/dist/cjs/types/logger.js.map +1 -0
  41. package/dist/cjs/utils/EventEmitter.js +49 -0
  42. package/dist/cjs/utils/EventEmitter.js.map +1 -0
  43. package/dist/cjs/utils/fingerprint.js +48 -0
  44. package/dist/cjs/utils/fingerprint.js.map +1 -0
  45. package/dist/cjs/utils/retry.js +35 -0
  46. package/dist/cjs/utils/retry.js.map +1 -0
  47. package/dist/cjs/utils/sanitizer.js +106 -0
  48. package/dist/cjs/utils/sanitizer.js.map +1 -0
  49. package/dist/cjs/utils/storage.js +99 -0
  50. package/dist/cjs/utils/storage.js.map +1 -0
  51. package/dist/cli/commands/setup.js +178 -0
  52. package/dist/cli/commands/setup.js.map +1 -0
  53. package/dist/cli/commands/status.js +103 -0
  54. package/dist/cli/commands/status.js.map +1 -0
  55. package/dist/cli/index.js +111 -0
  56. package/dist/cli/index.js.map +1 -0
  57. package/dist/cli/prompt.js +140 -0
  58. package/dist/cli/prompt.js.map +1 -0
  59. package/dist/esm/context/ContextManager.js +193 -0
  60. package/dist/esm/context/ContextManager.js.map +1 -0
  61. package/dist/esm/core/BootstrapGuard.js +77 -0
  62. package/dist/esm/core/BootstrapGuard.js.map +1 -0
  63. package/dist/esm/core/ConfigManager.js +129 -0
  64. package/dist/esm/core/ConfigManager.js.map +1 -0
  65. package/dist/esm/core/ObservabilitySDK.js +351 -0
  66. package/dist/esm/core/ObservabilitySDK.js.map +1 -0
  67. package/dist/esm/errors/ErrorBoundary.js +183 -0
  68. package/dist/esm/errors/ErrorBoundary.js.map +1 -0
  69. package/dist/esm/index.js +87 -0
  70. package/dist/esm/index.js.map +1 -0
  71. package/dist/esm/logger/LoggerService.js +251 -0
  72. package/dist/esm/logger/LoggerService.js.map +1 -0
  73. package/dist/esm/logs/LogsManager.js +108 -0
  74. package/dist/esm/logs/LogsManager.js.map +1 -0
  75. package/dist/esm/network/NetworkInterceptor.js +181 -0
  76. package/dist/esm/network/NetworkInterceptor.js.map +1 -0
  77. package/dist/esm/performance/PerformanceMonitor.js +286 -0
  78. package/dist/esm/performance/PerformanceMonitor.js.map +1 -0
  79. package/dist/esm/resources/ResourceProvisioner.js +206 -0
  80. package/dist/esm/resources/ResourceProvisioner.js.map +1 -0
  81. package/dist/esm/resources/templates/dashboard.js +330 -0
  82. package/dist/esm/resources/templates/dashboard.js.map +1 -0
  83. package/dist/esm/resources/templates/monitors.js +117 -0
  84. package/dist/esm/resources/templates/monitors.js.map +1 -0
  85. package/dist/esm/resources/templates/slos.js +76 -0
  86. package/dist/esm/resources/templates/slos.js.map +1 -0
  87. package/dist/esm/rum/RumManager.js +160 -0
  88. package/dist/esm/rum/RumManager.js.map +1 -0
  89. package/dist/esm/types/config.js +10 -0
  90. package/dist/esm/types/config.js.map +1 -0
  91. package/dist/esm/types/events.js +23 -0
  92. package/dist/esm/types/events.js.map +1 -0
  93. package/dist/esm/types/index.js +4 -0
  94. package/dist/esm/types/index.js.map +1 -0
  95. package/dist/esm/types/logger.js +10 -0
  96. package/dist/esm/types/logger.js.map +1 -0
  97. package/dist/esm/utils/EventEmitter.js +45 -0
  98. package/dist/esm/utils/EventEmitter.js.map +1 -0
  99. package/dist/esm/utils/fingerprint.js +44 -0
  100. package/dist/esm/utils/fingerprint.js.map +1 -0
  101. package/dist/esm/utils/retry.js +32 -0
  102. package/dist/esm/utils/retry.js.map +1 -0
  103. package/dist/esm/utils/sanitizer.js +102 -0
  104. package/dist/esm/utils/sanitizer.js.map +1 -0
  105. package/dist/esm/utils/storage.js +95 -0
  106. package/dist/esm/utils/storage.js.map +1 -0
  107. package/dist/resources/ResourceProvisioner.js +207 -0
  108. package/dist/resources/ResourceProvisioner.js.map +1 -0
  109. package/dist/resources/templates/dashboard.js +333 -0
  110. package/dist/resources/templates/dashboard.js.map +1 -0
  111. package/dist/resources/templates/monitors.js +120 -0
  112. package/dist/resources/templates/monitors.js.map +1 -0
  113. package/dist/resources/templates/slos.js +79 -0
  114. package/dist/resources/templates/slos.js.map +1 -0
  115. package/dist/types/config.js +13 -0
  116. package/dist/types/config.js.map +1 -0
  117. package/dist/types/context/ContextManager.d.ts +63 -0
  118. package/dist/types/context/ContextManager.d.ts.map +1 -0
  119. package/dist/types/core/BootstrapGuard.d.ts +46 -0
  120. package/dist/types/core/BootstrapGuard.d.ts.map +1 -0
  121. package/dist/types/core/ConfigManager.d.ts +13 -0
  122. package/dist/types/core/ConfigManager.d.ts.map +1 -0
  123. package/dist/types/core/ObservabilitySDK.d.ts +141 -0
  124. package/dist/types/core/ObservabilitySDK.d.ts.map +1 -0
  125. package/dist/types/errors/ErrorBoundary.d.ts +55 -0
  126. package/dist/types/errors/ErrorBoundary.d.ts.map +1 -0
  127. package/dist/types/events.js +26 -0
  128. package/dist/types/events.js.map +1 -0
  129. package/dist/types/index.d.ts +75 -0
  130. package/dist/types/index.d.ts.map +1 -0
  131. package/dist/types/index.js +20 -0
  132. package/dist/types/index.js.map +1 -0
  133. package/dist/types/logger/LoggerService.d.ts +104 -0
  134. package/dist/types/logger/LoggerService.d.ts.map +1 -0
  135. package/dist/types/logger.js +13 -0
  136. package/dist/types/logger.js.map +1 -0
  137. package/dist/types/logs/LogsManager.d.ts +41 -0
  138. package/dist/types/logs/LogsManager.d.ts.map +1 -0
  139. package/dist/types/network/NetworkInterceptor.d.ts +35 -0
  140. package/dist/types/network/NetworkInterceptor.d.ts.map +1 -0
  141. package/dist/types/performance/PerformanceMonitor.d.ts +44 -0
  142. package/dist/types/performance/PerformanceMonitor.d.ts.map +1 -0
  143. package/dist/types/resources/ResourceProvisioner.d.ts +46 -0
  144. package/dist/types/resources/ResourceProvisioner.d.ts.map +1 -0
  145. package/dist/types/resources/templates/dashboard.d.ts +6 -0
  146. package/dist/types/resources/templates/dashboard.d.ts.map +1 -0
  147. package/dist/types/resources/templates/monitors.d.ts +11 -0
  148. package/dist/types/resources/templates/monitors.d.ts.map +1 -0
  149. package/dist/types/resources/templates/slos.d.ts +18 -0
  150. package/dist/types/resources/templates/slos.d.ts.map +1 -0
  151. package/dist/types/rum/RumManager.d.ts +70 -0
  152. package/dist/types/rum/RumManager.d.ts.map +1 -0
  153. package/dist/types/types/config.d.ts +271 -0
  154. package/dist/types/types/config.d.ts.map +1 -0
  155. package/dist/types/types/events.d.ts +71 -0
  156. package/dist/types/types/events.d.ts.map +1 -0
  157. package/dist/types/types/index.d.ts +4 -0
  158. package/dist/types/types/index.d.ts.map +1 -0
  159. package/dist/types/types/logger.d.ts +102 -0
  160. package/dist/types/types/logger.d.ts.map +1 -0
  161. package/dist/types/utils/EventEmitter.d.ts +14 -0
  162. package/dist/types/utils/EventEmitter.d.ts.map +1 -0
  163. package/dist/types/utils/fingerprint.d.ts +10 -0
  164. package/dist/types/utils/fingerprint.d.ts.map +1 -0
  165. package/dist/types/utils/retry.d.ts +9 -0
  166. package/dist/types/utils/retry.d.ts.map +1 -0
  167. package/dist/types/utils/sanitizer.d.ts +14 -0
  168. package/dist/types/utils/sanitizer.d.ts.map +1 -0
  169. package/dist/types/utils/storage.d.ts +17 -0
  170. package/dist/types/utils/storage.d.ts.map +1 -0
  171. package/dist/utils/retry.js +35 -0
  172. package/dist/utils/retry.js.map +1 -0
  173. package/package.json +84 -0
@@ -0,0 +1,140 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.prompt = prompt;
37
+ exports.promptSecret = promptSecret;
38
+ exports.confirm = confirm;
39
+ exports.select = select;
40
+ exports.selectOrCustom = selectOrCustom;
41
+ const readline = __importStar(require("readline"));
42
+ function createInterface() {
43
+ return readline.createInterface({
44
+ input: process.stdin,
45
+ output: process.stderr,
46
+ });
47
+ }
48
+ function prompt(question, defaultValue) {
49
+ const rl = createInterface();
50
+ const suffix = defaultValue ? ` (${defaultValue})` : '';
51
+ return new Promise((resolve) => {
52
+ rl.question(` ${question}${suffix}: `, (answer) => {
53
+ rl.close();
54
+ resolve(answer.trim() || defaultValue || '');
55
+ });
56
+ });
57
+ }
58
+ function promptSecret(question) {
59
+ return new Promise((resolve) => {
60
+ const rl = createInterface();
61
+ // Mute stdout to hide input
62
+ const stdout = process.stderr;
63
+ let value = '';
64
+ stdout.write(` ${question}: `);
65
+ if (process.stdin.isTTY) {
66
+ process.stdin.setRawMode(true);
67
+ }
68
+ process.stdin.resume();
69
+ process.stdin.setEncoding('utf8');
70
+ const onData = (char) => {
71
+ const c = char.toString();
72
+ if (c === '\n' || c === '\r' || c === '\u0004') {
73
+ // Enter or EOF
74
+ if (process.stdin.isTTY) {
75
+ process.stdin.setRawMode(false);
76
+ }
77
+ process.stdin.pause();
78
+ process.stdin.removeListener('data', onData);
79
+ stdout.write('\n');
80
+ rl.close();
81
+ resolve(value);
82
+ }
83
+ else if (c === '\u0003') {
84
+ // Ctrl+C
85
+ stdout.write('\n');
86
+ process.exit(1);
87
+ }
88
+ else if (c === '\u007F' || c === '\b') {
89
+ // Backspace
90
+ if (value.length > 0) {
91
+ value = value.slice(0, -1);
92
+ stdout.write('\b \b');
93
+ }
94
+ }
95
+ else {
96
+ value += c;
97
+ stdout.write('*');
98
+ }
99
+ };
100
+ process.stdin.on('data', onData);
101
+ });
102
+ }
103
+ async function confirm(question, defaultYes = true) {
104
+ const hint = defaultYes ? 'Y/n' : 'y/N';
105
+ const answer = await prompt(`${question} [${hint}]`);
106
+ if (!answer)
107
+ return defaultYes;
108
+ return answer.toLowerCase().startsWith('y');
109
+ }
110
+ async function select(question, options, defaultIndex = 0) {
111
+ // eslint-disable-next-line no-console
112
+ console.error(` ${question}`);
113
+ for (let i = 0; i < options.length; i++) {
114
+ const marker = i === defaultIndex ? '›' : ' ';
115
+ // eslint-disable-next-line no-console
116
+ console.error(` ${marker} ${i + 1}) ${options[i]}`);
117
+ }
118
+ const answer = await prompt('Choose', String(defaultIndex + 1));
119
+ const index = parseInt(answer, 10) - 1;
120
+ return options[index] ?? options[defaultIndex];
121
+ }
122
+ async function selectOrCustom(question, options, defaultIndex = 0) {
123
+ const customLabel = 'Other (enter custom value)';
124
+ // eslint-disable-next-line no-console
125
+ console.error(` ${question}`);
126
+ for (let i = 0; i < options.length; i++) {
127
+ const marker = i === defaultIndex ? '›' : ' ';
128
+ // eslint-disable-next-line no-console
129
+ console.error(` ${marker} ${i + 1}) ${options[i]}`);
130
+ }
131
+ // eslint-disable-next-line no-console
132
+ console.error(` ${options.length + 1}) ${customLabel}`);
133
+ const answer = await prompt('Choose', String(defaultIndex + 1));
134
+ const index = parseInt(answer, 10) - 1;
135
+ if (index === options.length) {
136
+ return prompt('Enter custom value');
137
+ }
138
+ return options[index] ?? options[defaultIndex];
139
+ }
140
+ //# sourceMappingURL=prompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../src/cli/prompt.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,193 @@
1
+ import { SDKEvent } from '../types/events';
2
+ /**
3
+ * Centralized context management for enriching all events with
4
+ * browser, user, session, and application metadata.
5
+ * Implements the Mediator pattern to share context across modules.
6
+ */
7
+ export class ContextManager {
8
+ globalContext;
9
+ userContext;
10
+ config;
11
+ emitter;
12
+ viewName;
13
+ cachedBrowserInfo;
14
+ constructor(config, emitter) {
15
+ this.config = config;
16
+ this.emitter = emitter;
17
+ this.globalContext = { ...config.globalContext };
18
+ this.userContext = config.user ? { ...config.user } : undefined;
19
+ }
20
+ /**
21
+ * Returns the full context snapshot to attach to logs and events.
22
+ */
23
+ getFullContext() {
24
+ return {
25
+ ...this.globalContext,
26
+ service: this.config.service,
27
+ env: this.config.env,
28
+ version: this.config.version,
29
+ url: this.getCurrentUrl(),
30
+ view: this.viewName,
31
+ browser: this.getBrowserInfo(),
32
+ user: this.userContext,
33
+ tags: this.config.tags,
34
+ timestamp: new Date().toISOString(),
35
+ };
36
+ }
37
+ /**
38
+ * Returns only the global context (without browser info).
39
+ */
40
+ getGlobalContext() {
41
+ return { ...this.globalContext };
42
+ }
43
+ /**
44
+ * Sets a key-value pair in the global context.
45
+ */
46
+ setGlobalContext(key, value) {
47
+ this.globalContext[key] = value;
48
+ this.emitter.emit(SDKEvent.CONTEXT_UPDATED, {
49
+ type: SDKEvent.CONTEXT_UPDATED,
50
+ timestamp: Date.now(),
51
+ data: { key, value },
52
+ });
53
+ }
54
+ /**
55
+ * Removes a key from the global context.
56
+ */
57
+ removeGlobalContext(key) {
58
+ delete this.globalContext[key];
59
+ this.emitter.emit(SDKEvent.CONTEXT_UPDATED, {
60
+ type: SDKEvent.CONTEXT_UPDATED,
61
+ timestamp: Date.now(),
62
+ data: { key, removed: true },
63
+ });
64
+ }
65
+ /**
66
+ * Sets user context.
67
+ */
68
+ setUser(user) {
69
+ this.userContext = { ...user };
70
+ this.emitter.emit(SDKEvent.USER_SET, {
71
+ type: SDKEvent.USER_SET,
72
+ timestamp: Date.now(),
73
+ data: { userId: user.id },
74
+ });
75
+ }
76
+ /**
77
+ * Clears user context.
78
+ */
79
+ clearUser() {
80
+ this.userContext = undefined;
81
+ }
82
+ /**
83
+ * Gets current user context.
84
+ */
85
+ getUser() {
86
+ return this.userContext ? { ...this.userContext } : undefined;
87
+ }
88
+ /**
89
+ * Sets the current view/route name.
90
+ */
91
+ setView(name) {
92
+ this.viewName = name;
93
+ this.emitter.emit(SDKEvent.VIEW_CHANGED, {
94
+ type: SDKEvent.VIEW_CHANGED,
95
+ timestamp: Date.now(),
96
+ data: { view: name },
97
+ });
98
+ }
99
+ /**
100
+ * Gets the current view/route name.
101
+ */
102
+ getView() {
103
+ return this.viewName;
104
+ }
105
+ /**
106
+ * Collects browser and device information.
107
+ * Cached after first call since these values rarely change.
108
+ */
109
+ getBrowserInfo() {
110
+ if (this.cachedBrowserInfo) {
111
+ return {
112
+ ...this.cachedBrowserInfo,
113
+ online: typeof navigator !== 'undefined' ? navigator.onLine : true,
114
+ };
115
+ }
116
+ if (typeof window === 'undefined' || typeof navigator === 'undefined') {
117
+ return this.getSSRBrowserInfo();
118
+ }
119
+ this.cachedBrowserInfo = {
120
+ userAgent: navigator.userAgent,
121
+ language: navigator.language,
122
+ platform: navigator.platform ?? 'unknown',
123
+ vendor: navigator.vendor ?? 'unknown',
124
+ cookieEnabled: navigator.cookieEnabled,
125
+ online: navigator.onLine,
126
+ screenResolution: `${screen.width}x${screen.height}`,
127
+ viewportSize: `${window.innerWidth}x${window.innerHeight}`,
128
+ devicePixelRatio: window.devicePixelRatio,
129
+ colorDepth: screen.colorDepth,
130
+ timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,
131
+ memory: this.getMemoryInfo(),
132
+ connection: this.getConnectionInfo(),
133
+ };
134
+ return { ...this.cachedBrowserInfo };
135
+ }
136
+ getCurrentUrl() {
137
+ try {
138
+ return typeof window !== 'undefined' ? window.location.href : 'unknown';
139
+ }
140
+ catch {
141
+ return 'unknown';
142
+ }
143
+ }
144
+ getMemoryInfo() {
145
+ try {
146
+ const perf = performance;
147
+ if (perf.memory) {
148
+ return {
149
+ jsHeapSizeLimit: perf.memory.jsHeapSizeLimit,
150
+ totalJSHeapSize: perf.memory.totalJSHeapSize,
151
+ usedJSHeapSize: perf.memory.usedJSHeapSize,
152
+ };
153
+ }
154
+ }
155
+ catch {
156
+ // Not available
157
+ }
158
+ return undefined;
159
+ }
160
+ getConnectionInfo() {
161
+ try {
162
+ const nav = navigator;
163
+ if (nav.connection) {
164
+ return {
165
+ effectiveType: nav.connection.effectiveType,
166
+ downlink: nav.connection.downlink,
167
+ rtt: nav.connection.rtt,
168
+ saveData: nav.connection.saveData,
169
+ };
170
+ }
171
+ }
172
+ catch {
173
+ // Not available
174
+ }
175
+ return undefined;
176
+ }
177
+ getSSRBrowserInfo() {
178
+ return {
179
+ userAgent: 'ssr',
180
+ language: 'en',
181
+ platform: 'server',
182
+ vendor: 'unknown',
183
+ cookieEnabled: false,
184
+ online: true,
185
+ screenResolution: '0x0',
186
+ viewportSize: '0x0',
187
+ devicePixelRatio: 1,
188
+ colorDepth: 0,
189
+ timezone: 'UTC',
190
+ };
191
+ }
192
+ }
193
+ //# sourceMappingURL=ContextManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ContextManager.js","sourceRoot":"","sources":["../../../src/context/ContextManager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,77 @@
1
+ import { StorageManager } from '../utils/storage';
2
+ const BOOTSTRAP_KEY = 'bootstrap_record';
3
+ /**
4
+ * Guards against duplicate initialization and tracks bootstrap state.
5
+ * Ensures the SDK is only initialized once per page lifecycle,
6
+ * while persisting bootstrap history across sessions.
7
+ */
8
+ export class BootstrapGuard {
9
+ static instance = null;
10
+ storage;
11
+ initialized = false;
12
+ constructor() {
13
+ this.storage = new StorageManager();
14
+ }
15
+ static getInstance() {
16
+ if (!BootstrapGuard.instance) {
17
+ BootstrapGuard.instance = new BootstrapGuard();
18
+ }
19
+ return BootstrapGuard.instance;
20
+ }
21
+ /**
22
+ * Returns true if this is the first bootstrap for this service+env combination.
23
+ */
24
+ isFirstBootstrap(service, env) {
25
+ const record = this.getRecord(service, env);
26
+ return record === undefined;
27
+ }
28
+ /**
29
+ * Marks the current session as initialized.
30
+ * Returns false if already initialized in this page lifecycle (prevents double-init).
31
+ */
32
+ markInitialized(service, env, version) {
33
+ if (this.initialized) {
34
+ return false;
35
+ }
36
+ const existing = this.getRecord(service, env);
37
+ const now = new Date().toISOString();
38
+ const record = {
39
+ service,
40
+ env,
41
+ version,
42
+ initializedAt: existing?.initializedAt ?? now,
43
+ lastSeenAt: now,
44
+ bootstrapCount: (existing?.bootstrapCount ?? 0) + 1,
45
+ };
46
+ this.storage.set(this.buildKey(service, env), record);
47
+ this.initialized = true;
48
+ return true;
49
+ }
50
+ /**
51
+ * Returns the bootstrap record for a service+env combination.
52
+ */
53
+ getRecord(service, env) {
54
+ return this.storage.get(this.buildKey(service, env));
55
+ }
56
+ /**
57
+ * Resets the initialization flag (for teardown/testing).
58
+ */
59
+ reset() {
60
+ this.initialized = false;
61
+ }
62
+ /**
63
+ * Completely clears bootstrap state (for testing).
64
+ */
65
+ clear() {
66
+ this.initialized = false;
67
+ this.storage.clear();
68
+ }
69
+ /** @internal For testing only */
70
+ static resetInstance() {
71
+ BootstrapGuard.instance = null;
72
+ }
73
+ buildKey(service, env) {
74
+ return `${BOOTSTRAP_KEY}_${service}_${env}`;
75
+ }
76
+ }
77
+ //# sourceMappingURL=BootstrapGuard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BootstrapGuard.js","sourceRoot":"","sources":["../../../src/core/BootstrapGuard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAWlD,MAAM,aAAa,GAAG,kBAAkB,CAAC;AAEzC;;;;GAIG;AACH,MAAM,OAAO,cAAc;IACjB,MAAM,CAAC,QAAQ,GAA0B,IAAI,CAAC;IACrC,OAAO,CAAiB;IACjC,WAAW,GAAG,KAAK,CAAC;IAE5B;QACE,IAAI,CAAC,OAAO,GAAG,IAAI,cAAc,EAAE,CAAC;IACtC,CAAC;IAED,MAAM,CAAC,WAAW;QAChB,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,CAAC;YAC7B,cAAc,CAAC,QAAQ,GAAG,IAAI,cAAc,EAAE,CAAC;QACjD,CAAC;QACD,OAAO,cAAc,CAAC,QAAQ,CAAC;IACjC,CAAC;IAED;;OAEG;IACH,gBAAgB,CAAC,OAAe,EAAE,GAAW;QAC3C,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QAC5C,OAAO,MAAM,KAAK,SAAS,CAAC;IAC9B,CAAC;IAED;;;OAGG;IACH,eAAe,CAAC,OAAe,EAAE,GAAW,EAAE,OAAe;QAC3D,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,OAAO,KAAK,CAAC;QACf,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QAC9C,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAErC,MAAM,MAAM,GAAoB;YAC9B,OAAO;YACP,GAAG;YACH,OAAO;YACP,aAAa,EAAE,QAAQ,EAAE,aAAa,IAAI,GAAG;YAC7C,UAAU,EAAE,GAAG;YACf,cAAc,EAAE,CAAC,QAAQ,EAAE,cAAc,IAAI,CAAC,CAAC,GAAG,CAAC;SACpD,CAAC;QAEF,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC;QACtD,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QACxB,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACH,SAAS,CAAC,OAAe,EAAE,GAAW;QACpC,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAkB,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;IACxE,CAAC;IAED;;OAEG;IACH,KAAK;QACH,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;IAC3B,CAAC;IAED;;OAEG;IACH,KAAK;QACH,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;QACzB,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;IAED,iCAAiC;IACjC,MAAM,CAAC,aAAa;QAClB,cAAc,CAAC,QAAQ,GAAG,IAAI,CAAC;IACjC,CAAC;IAEO,QAAQ,CAAC,OAAe,EAAE,GAAW;QAC3C,OAAO,GAAG,aAAa,IAAI,OAAO,IAAI,GAAG,EAAE,CAAC;IAC9C,CAAC"}
@@ -0,0 +1,129 @@
1
+ import { LogLevel } from '../types/config';
2
+ /**
3
+ * Resolves user-provided config with sensible defaults.
4
+ * Validates required fields and applies environment-aware defaults.
5
+ * Follows the Builder pattern to construct a fully resolved config.
6
+ */
7
+ export class ConfigManager {
8
+ static REQUIRED_FIELDS = [
9
+ 'clientToken',
10
+ 'applicationId',
11
+ 'service',
12
+ 'env',
13
+ ];
14
+ static resolve(config) {
15
+ ConfigManager.validate(config);
16
+ const isDev = config.env === 'development' || config.env === 'test';
17
+ return {
18
+ // Required
19
+ clientToken: config.clientToken,
20
+ applicationId: config.applicationId,
21
+ service: config.service,
22
+ env: config.env,
23
+ // Core with defaults
24
+ version: config.version ?? '0.0.0',
25
+ site: config.site ?? 'datadoghq.com',
26
+ debug: config.debug ?? isDev,
27
+ logLevel: config.logLevel ?? (isDev ? LogLevel.DEBUG : LogLevel.WARN),
28
+ consoleOutput: config.consoleOutput ?? isDev,
29
+ // Sampling
30
+ sampling: {
31
+ sessionSampleRate: config.sampling?.sessionSampleRate ?? 100,
32
+ sessionReplaySampleRate: config.sampling?.sessionReplaySampleRate ?? 20,
33
+ traceSampleRate: config.sampling?.traceSampleRate ?? 100,
34
+ logSampleRate: config.sampling?.logSampleRate ?? 100,
35
+ },
36
+ // Network
37
+ network: {
38
+ enabled: config.network?.enabled ?? true,
39
+ excludeUrls: config.network?.excludeUrls ?? [],
40
+ trackHeaders: config.network?.trackHeaders ?? false,
41
+ trackBodies: config.network?.trackBodies ?? false,
42
+ maxBodySize: config.network?.maxBodySize ?? 4096,
43
+ failedOnly: config.network?.failedOnly ?? false,
44
+ },
45
+ // Performance
46
+ performance: {
47
+ webVitals: config.performance?.webVitals ?? true,
48
+ longTasks: config.performance?.longTasks ?? true,
49
+ longTaskThreshold: config.performance?.longTaskThreshold ?? 50,
50
+ resourceTiming: config.performance?.resourceTiming ?? true,
51
+ firstInputDelay: config.performance?.firstInputDelay ?? true,
52
+ cumulativeLayoutShift: config.performance?.cumulativeLayoutShift ?? true,
53
+ largestContentfulPaint: config.performance?.largestContentfulPaint ?? true,
54
+ interactionToNextPaint: config.performance?.interactionToNextPaint ?? true,
55
+ customMarks: config.performance?.customMarks ?? [],
56
+ },
57
+ // Error tracking
58
+ errorTracking: {
59
+ enabled: config.errorTracking?.enabled ?? true,
60
+ unhandledRejections: config.errorTracking?.unhandledRejections ?? true,
61
+ consoleErrors: config.errorTracking?.consoleErrors ?? true,
62
+ ignorePatterns: config.errorTracking?.ignorePatterns ?? [],
63
+ maxErrorsPerMinute: config.errorTracking?.maxErrorsPerMinute ?? 100,
64
+ captureStackTraces: config.errorTracking?.captureStackTraces ?? true,
65
+ fingerprint: config.errorTracking?.fingerprint,
66
+ },
67
+ // Session
68
+ session: {
69
+ enabled: config.session?.enabled ?? true,
70
+ timeout: config.session?.timeout ?? 1800000,
71
+ crossTabSync: config.session?.crossTabSync ?? true,
72
+ },
73
+ // Actions
74
+ actions: {
75
+ trackUserInteractions: config.actions?.trackUserInteractions ?? true,
76
+ trackFrustrations: config.actions?.trackFrustrations ?? true,
77
+ trackViewsManually: config.actions?.trackViewsManually ?? false,
78
+ },
79
+ // Privacy
80
+ privacy: {
81
+ defaultPrivacyLevel: config.privacy?.defaultPrivacyLevel ?? 'mask-user-input',
82
+ piiFields: config.privacy?.piiFields ?? [],
83
+ requireConsent: config.privacy?.requireConsent ?? false,
84
+ consentPurposes: config.privacy?.consentPurposes ?? [],
85
+ },
86
+ // Context
87
+ user: config.user,
88
+ globalContext: config.globalContext ?? {},
89
+ tags: config.tags ?? [],
90
+ plugins: config.plugins ?? [],
91
+ hooks: config.hooks ?? {},
92
+ // Advanced
93
+ proxy: config.proxy,
94
+ allowedTracingUrls: config.allowedTracingUrls ?? [],
95
+ rumOverrides: config.rumOverrides ?? {},
96
+ logsOverrides: config.logsOverrides ?? {},
97
+ provisioning: config.provisioning,
98
+ };
99
+ }
100
+ static validate(config) {
101
+ const errors = [];
102
+ for (const field of ConfigManager.REQUIRED_FIELDS) {
103
+ if (!config[field]) {
104
+ errors.push(`Missing required field: '${field}'`);
105
+ }
106
+ }
107
+ if (config.sampling?.sessionSampleRate !== undefined) {
108
+ ConfigManager.validateRange('sampling.sessionSampleRate', config.sampling.sessionSampleRate, 0, 100, errors);
109
+ }
110
+ if (config.sampling?.sessionReplaySampleRate !== undefined) {
111
+ ConfigManager.validateRange('sampling.sessionReplaySampleRate', config.sampling.sessionReplaySampleRate, 0, 100, errors);
112
+ }
113
+ if (config.sampling?.traceSampleRate !== undefined) {
114
+ ConfigManager.validateRange('sampling.traceSampleRate', config.sampling.traceSampleRate, 0, 100, errors);
115
+ }
116
+ if (config.errorTracking?.maxErrorsPerMinute !== undefined && config.errorTracking.maxErrorsPerMinute < 1) {
117
+ errors.push('errorTracking.maxErrorsPerMinute must be >= 1');
118
+ }
119
+ if (errors.length > 0) {
120
+ throw new Error(`[dd-frontend-toolkit] Configuration errors:\n${errors.map((e) => ` - ${e}`).join('\n')}`);
121
+ }
122
+ }
123
+ static validateRange(field, value, min, max, errors) {
124
+ if (value < min || value > max) {
125
+ errors.push(`${field} must be between ${min} and ${max}, got ${value}`);
126
+ }
127
+ }
128
+ }
129
+ //# sourceMappingURL=ConfigManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConfigManager.js","sourceRoot":"","sources":["../../../src/core/ConfigManager.ts"],"names":[],"mappings":"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"}