sitepong 0.0.5 → 0.0.7
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/breadcrumbs-DwXK5gNn.d.mts +119 -0
- package/dist/breadcrumbs-DwXK5gNn.d.ts +119 -0
- package/dist/express/index.d.mts +47 -0
- package/dist/express/index.d.ts +47 -0
- package/dist/express/index.js +128 -0
- package/dist/express/index.js.map +1 -0
- package/dist/express/index.mjs +124 -0
- package/dist/express/index.mjs.map +1 -0
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +2 -2
- package/dist/index.mjs.map +1 -1
- package/dist/nextjs/index.d.mts +109 -0
- package/dist/nextjs/index.d.ts +109 -0
- package/dist/nextjs/index.js +440 -0
- package/dist/nextjs/index.js.map +1 -0
- package/dist/nextjs/index.mjs +431 -0
- package/dist/nextjs/index.mjs.map +1 -0
- package/dist/react/index.d.mts +1 -110
- package/dist/react/index.d.ts +1 -110
- package/dist/react/index.js.map +1 -1
- package/dist/react/index.mjs.map +1 -1
- package/dist/server/index.d.mts +46 -0
- package/dist/server/index.d.ts +46 -0
- package/dist/server/index.js +360 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/index.mjs +352 -0
- package/dist/server/index.mjs.map +1 -0
- package/package.json +35 -6
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { S as SitePongConfig, C as CaptureContext, L as LogLevel } from '../breadcrumbs-DwXK5gNn.mjs';
|
|
2
|
+
export { E as ErrorEvent, a as addBreadcrumb, c as clearBreadcrumbs, g as getBreadcrumbs } from '../breadcrumbs-DwXK5gNn.mjs';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Server-side exports for @sitepong/react
|
|
6
|
+
* Use this for Next.js API routes, Express, and other Node.js servers
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Initialize SitePong for server-side usage
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```ts
|
|
14
|
+
* // In your server entry point or API route
|
|
15
|
+
* import { initServer } from '@sitepong/react/server';
|
|
16
|
+
*
|
|
17
|
+
* initServer({
|
|
18
|
+
* dsn: process.env.SITEPONG_DSN,
|
|
19
|
+
* environment: process.env.NODE_ENV,
|
|
20
|
+
* });
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
declare function initServer(config: SitePongConfig): void;
|
|
24
|
+
/**
|
|
25
|
+
* Get the current server configuration
|
|
26
|
+
*/
|
|
27
|
+
declare function getServerConfig(): SitePongConfig | null;
|
|
28
|
+
/**
|
|
29
|
+
* Capture an exception on the server
|
|
30
|
+
*/
|
|
31
|
+
declare function captureServerException(error: Error | unknown, context?: CaptureContext & {
|
|
32
|
+
request?: {
|
|
33
|
+
url?: string;
|
|
34
|
+
method?: string;
|
|
35
|
+
headers?: Record<string, string>;
|
|
36
|
+
query?: Record<string, string>;
|
|
37
|
+
body?: unknown;
|
|
38
|
+
ip?: string;
|
|
39
|
+
};
|
|
40
|
+
}): Promise<string | null>;
|
|
41
|
+
/**
|
|
42
|
+
* Capture a message on the server
|
|
43
|
+
*/
|
|
44
|
+
declare function captureServerMessage(message: string, level?: LogLevel, context?: CaptureContext): Promise<string | null>;
|
|
45
|
+
|
|
46
|
+
export { CaptureContext, LogLevel, SitePongConfig, captureServerException, captureServerMessage, getServerConfig, initServer };
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { S as SitePongConfig, C as CaptureContext, L as LogLevel } from '../breadcrumbs-DwXK5gNn.js';
|
|
2
|
+
export { E as ErrorEvent, a as addBreadcrumb, c as clearBreadcrumbs, g as getBreadcrumbs } from '../breadcrumbs-DwXK5gNn.js';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Server-side exports for @sitepong/react
|
|
6
|
+
* Use this for Next.js API routes, Express, and other Node.js servers
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Initialize SitePong for server-side usage
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```ts
|
|
14
|
+
* // In your server entry point or API route
|
|
15
|
+
* import { initServer } from '@sitepong/react/server';
|
|
16
|
+
*
|
|
17
|
+
* initServer({
|
|
18
|
+
* dsn: process.env.SITEPONG_DSN,
|
|
19
|
+
* environment: process.env.NODE_ENV,
|
|
20
|
+
* });
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
declare function initServer(config: SitePongConfig): void;
|
|
24
|
+
/**
|
|
25
|
+
* Get the current server configuration
|
|
26
|
+
*/
|
|
27
|
+
declare function getServerConfig(): SitePongConfig | null;
|
|
28
|
+
/**
|
|
29
|
+
* Capture an exception on the server
|
|
30
|
+
*/
|
|
31
|
+
declare function captureServerException(error: Error | unknown, context?: CaptureContext & {
|
|
32
|
+
request?: {
|
|
33
|
+
url?: string;
|
|
34
|
+
method?: string;
|
|
35
|
+
headers?: Record<string, string>;
|
|
36
|
+
query?: Record<string, string>;
|
|
37
|
+
body?: unknown;
|
|
38
|
+
ip?: string;
|
|
39
|
+
};
|
|
40
|
+
}): Promise<string | null>;
|
|
41
|
+
/**
|
|
42
|
+
* Capture a message on the server
|
|
43
|
+
*/
|
|
44
|
+
declare function captureServerMessage(message: string, level?: LogLevel, context?: CaptureContext): Promise<string | null>;
|
|
45
|
+
|
|
46
|
+
export { CaptureContext, LogLevel, SitePongConfig, captureServerException, captureServerMessage, getServerConfig, initServer };
|
|
@@ -0,0 +1,360 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
// src/core/dsn.ts
|
|
4
|
+
function parseDSN(dsn) {
|
|
5
|
+
const match = dsn.match(
|
|
6
|
+
/^(https?):\/\/([^@]+)@([^/]+)\/(.+)$/
|
|
7
|
+
);
|
|
8
|
+
if (!match) {
|
|
9
|
+
throw new Error(
|
|
10
|
+
`Invalid DSN: ${dsn}. Expected format: https://<public_key>@<host>/<project_id>`
|
|
11
|
+
);
|
|
12
|
+
}
|
|
13
|
+
const [, protocol, publicKey, host, projectId] = match;
|
|
14
|
+
return {
|
|
15
|
+
protocol,
|
|
16
|
+
publicKey,
|
|
17
|
+
host,
|
|
18
|
+
projectId
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
function getApiEndpoint(config) {
|
|
22
|
+
if (config.apiEndpoint) {
|
|
23
|
+
return config.apiEndpoint;
|
|
24
|
+
}
|
|
25
|
+
if (config.dsn) {
|
|
26
|
+
const parsed = parseDSN(config.dsn);
|
|
27
|
+
return `${parsed.protocol}://${parsed.host}`;
|
|
28
|
+
}
|
|
29
|
+
return "https://api.sitepong.com";
|
|
30
|
+
}
|
|
31
|
+
function getAuthHeaders(config) {
|
|
32
|
+
if (config.dsn) {
|
|
33
|
+
const parsed = parseDSN(config.dsn);
|
|
34
|
+
return {
|
|
35
|
+
"X-SitePong-Key": parsed.publicKey,
|
|
36
|
+
"X-SitePong-Project": parsed.projectId
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
if (config.apiKey) {
|
|
40
|
+
return {
|
|
41
|
+
Authorization: `Bearer ${config.apiKey}`
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
return {};
|
|
45
|
+
}
|
|
46
|
+
function validateConfig(config) {
|
|
47
|
+
if (!config.dsn && !config.apiKey) {
|
|
48
|
+
throw new Error(
|
|
49
|
+
"SitePong: You must provide either a DSN or an API key"
|
|
50
|
+
);
|
|
51
|
+
}
|
|
52
|
+
if (config.dsn && config.apiKey) {
|
|
53
|
+
console.warn(
|
|
54
|
+
"SitePong: Both DSN and API key provided. DSN will be used."
|
|
55
|
+
);
|
|
56
|
+
}
|
|
57
|
+
if (config.sampleRate !== void 0) {
|
|
58
|
+
if (config.sampleRate < 0 || config.sampleRate > 1) {
|
|
59
|
+
throw new Error(
|
|
60
|
+
"SitePong: sampleRate must be between 0 and 1"
|
|
61
|
+
);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// src/utils/platform.ts
|
|
67
|
+
function detectPlatform() {
|
|
68
|
+
if (typeof navigator !== "undefined" && navigator.product === "ReactNative") {
|
|
69
|
+
return "react-native";
|
|
70
|
+
}
|
|
71
|
+
if (typeof process !== "undefined" && process.versions && process.versions.node) {
|
|
72
|
+
return "node";
|
|
73
|
+
}
|
|
74
|
+
if (typeof window !== "undefined" && typeof document !== "undefined") {
|
|
75
|
+
return "browser";
|
|
76
|
+
}
|
|
77
|
+
return "unknown";
|
|
78
|
+
}
|
|
79
|
+
var currentPlatform = detectPlatform();
|
|
80
|
+
function isReactNative() {
|
|
81
|
+
return currentPlatform === "react-native";
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// src/utils/stacktrace.ts
|
|
85
|
+
function parseStackTrace(error) {
|
|
86
|
+
if (!error.stack) {
|
|
87
|
+
return [];
|
|
88
|
+
}
|
|
89
|
+
const lines = error.stack.split("\n");
|
|
90
|
+
const frames = [];
|
|
91
|
+
for (const line of lines) {
|
|
92
|
+
const frame = parseStackLine(line);
|
|
93
|
+
if (frame) {
|
|
94
|
+
frames.push(frame);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
return frames;
|
|
98
|
+
}
|
|
99
|
+
function parseStackLine(line) {
|
|
100
|
+
const chromeMatch = line.match(
|
|
101
|
+
/^\s*at\s+(?:(.+?)\s+\()?(?:(.+?):(\d+):(\d+))\)?$/
|
|
102
|
+
);
|
|
103
|
+
if (chromeMatch) {
|
|
104
|
+
return {
|
|
105
|
+
function: chromeMatch[1] || "anonymous",
|
|
106
|
+
filename: chromeMatch[2],
|
|
107
|
+
lineno: parseInt(chromeMatch[3], 10),
|
|
108
|
+
colno: parseInt(chromeMatch[4], 10),
|
|
109
|
+
in_app: !chromeMatch[2]?.includes("node_modules")
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
const firefoxMatch = line.match(/^(.+?)@(.+?):(\d+):(\d+)$/);
|
|
113
|
+
if (firefoxMatch) {
|
|
114
|
+
return {
|
|
115
|
+
function: firefoxMatch[1] || "anonymous",
|
|
116
|
+
filename: firefoxMatch[2],
|
|
117
|
+
lineno: parseInt(firefoxMatch[3], 10),
|
|
118
|
+
colno: parseInt(firefoxMatch[4], 10),
|
|
119
|
+
in_app: !firefoxMatch[2]?.includes("node_modules")
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
return null;
|
|
123
|
+
}
|
|
124
|
+
function generateEventId() {
|
|
125
|
+
const hex = "0123456789abcdef";
|
|
126
|
+
let id = "";
|
|
127
|
+
for (let i = 0; i < 32; i++) {
|
|
128
|
+
id += hex[Math.floor(Math.random() * 16)];
|
|
129
|
+
}
|
|
130
|
+
return id;
|
|
131
|
+
}
|
|
132
|
+
function getBrowserContext() {
|
|
133
|
+
if (isReactNative()) {
|
|
134
|
+
return {
|
|
135
|
+
browser: { name: "React Native", version: "unknown" },
|
|
136
|
+
os: { name: "unknown", version: "unknown" },
|
|
137
|
+
runtime: { name: "React Native", version: "unknown" }
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
if (typeof process !== "undefined" && process.versions?.node) {
|
|
141
|
+
return {
|
|
142
|
+
browser: { name: "Node.js", version: process.versions.node },
|
|
143
|
+
os: {
|
|
144
|
+
name: process.platform || "unknown",
|
|
145
|
+
version: process.version || "unknown"
|
|
146
|
+
},
|
|
147
|
+
runtime: { name: "Node.js", version: process.versions.node }
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
if (typeof navigator === "undefined") {
|
|
151
|
+
return {
|
|
152
|
+
browser: { name: "unknown", version: "unknown" },
|
|
153
|
+
os: { name: "unknown", version: "unknown" }
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
const ua = navigator.userAgent;
|
|
157
|
+
let browserName = "unknown";
|
|
158
|
+
let browserVersion = "unknown";
|
|
159
|
+
if (ua.includes("Firefox/")) {
|
|
160
|
+
browserName = "Firefox";
|
|
161
|
+
browserVersion = ua.match(/Firefox\/(\d+)/)?.[1] || "unknown";
|
|
162
|
+
} else if (ua.includes("Edg/")) {
|
|
163
|
+
browserName = "Edge";
|
|
164
|
+
browserVersion = ua.match(/Edg\/(\d+)/)?.[1] || "unknown";
|
|
165
|
+
} else if (ua.includes("Chrome/")) {
|
|
166
|
+
browserName = "Chrome";
|
|
167
|
+
browserVersion = ua.match(/Chrome\/(\d+)/)?.[1] || "unknown";
|
|
168
|
+
} else if (ua.includes("Safari/") && !ua.includes("Chrome")) {
|
|
169
|
+
browserName = "Safari";
|
|
170
|
+
browserVersion = ua.match(/Version\/(\d+)/)?.[1] || "unknown";
|
|
171
|
+
}
|
|
172
|
+
let osName = "unknown";
|
|
173
|
+
let osVersion = "unknown";
|
|
174
|
+
if (ua.includes("Windows")) {
|
|
175
|
+
osName = "Windows";
|
|
176
|
+
osVersion = ua.match(/Windows NT (\d+\.\d+)/)?.[1] || "unknown";
|
|
177
|
+
} else if (ua.includes("Mac OS X")) {
|
|
178
|
+
osName = "macOS";
|
|
179
|
+
osVersion = ua.match(/Mac OS X (\d+[._]\d+)/)?.[1]?.replace("_", ".") || "unknown";
|
|
180
|
+
} else if (ua.includes("Linux")) {
|
|
181
|
+
osName = "Linux";
|
|
182
|
+
} else if (ua.includes("Android")) {
|
|
183
|
+
osName = "Android";
|
|
184
|
+
osVersion = ua.match(/Android (\d+)/)?.[1] || "unknown";
|
|
185
|
+
} else if (ua.includes("iOS") || ua.includes("iPhone") || ua.includes("iPad")) {
|
|
186
|
+
osName = "iOS";
|
|
187
|
+
osVersion = ua.match(/OS (\d+)/)?.[1] || "unknown";
|
|
188
|
+
}
|
|
189
|
+
return {
|
|
190
|
+
browser: { name: browserName, version: browserVersion },
|
|
191
|
+
os: { name: osName, version: osVersion }
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
// src/core/breadcrumbs.ts
|
|
196
|
+
var MAX_BREADCRUMBS = 100;
|
|
197
|
+
var BreadcrumbManager = class {
|
|
198
|
+
constructor() {
|
|
199
|
+
this.breadcrumbs = [];
|
|
200
|
+
this.maxBreadcrumbs = MAX_BREADCRUMBS;
|
|
201
|
+
}
|
|
202
|
+
setMaxBreadcrumbs(max) {
|
|
203
|
+
this.maxBreadcrumbs = max;
|
|
204
|
+
this.trim();
|
|
205
|
+
}
|
|
206
|
+
add(breadcrumb) {
|
|
207
|
+
const entry = {
|
|
208
|
+
...breadcrumb,
|
|
209
|
+
timestamp: Date.now()
|
|
210
|
+
};
|
|
211
|
+
this.breadcrumbs.push(entry);
|
|
212
|
+
this.trim();
|
|
213
|
+
}
|
|
214
|
+
getAll() {
|
|
215
|
+
return [...this.breadcrumbs];
|
|
216
|
+
}
|
|
217
|
+
clear() {
|
|
218
|
+
this.breadcrumbs = [];
|
|
219
|
+
}
|
|
220
|
+
trim() {
|
|
221
|
+
if (this.breadcrumbs.length > this.maxBreadcrumbs) {
|
|
222
|
+
this.breadcrumbs = this.breadcrumbs.slice(-this.maxBreadcrumbs);
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
};
|
|
226
|
+
var breadcrumbs = new BreadcrumbManager();
|
|
227
|
+
function addBreadcrumb(breadcrumb) {
|
|
228
|
+
breadcrumbs.add(breadcrumb);
|
|
229
|
+
}
|
|
230
|
+
function getBreadcrumbs() {
|
|
231
|
+
return breadcrumbs.getAll();
|
|
232
|
+
}
|
|
233
|
+
function clearBreadcrumbs() {
|
|
234
|
+
breadcrumbs.clear();
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
// src/server/index.ts
|
|
238
|
+
var serverConfig = null;
|
|
239
|
+
function initServer(config) {
|
|
240
|
+
validateConfig(config);
|
|
241
|
+
serverConfig = {
|
|
242
|
+
enabled: true,
|
|
243
|
+
debug: false,
|
|
244
|
+
sampleRate: 1,
|
|
245
|
+
...config
|
|
246
|
+
};
|
|
247
|
+
if (serverConfig.debug) {
|
|
248
|
+
console.log("[SitePong] Server SDK initialized");
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
function getServerConfig() {
|
|
252
|
+
return serverConfig;
|
|
253
|
+
}
|
|
254
|
+
async function captureServerException(error, context) {
|
|
255
|
+
if (!serverConfig?.enabled) {
|
|
256
|
+
return null;
|
|
257
|
+
}
|
|
258
|
+
const err = error instanceof Error ? error : new Error(String(error));
|
|
259
|
+
const event = createServerErrorEvent(err, context);
|
|
260
|
+
await sendServerEvent(event);
|
|
261
|
+
return event.event_id;
|
|
262
|
+
}
|
|
263
|
+
async function captureServerMessage(message, level = "info", context) {
|
|
264
|
+
if (!serverConfig?.enabled) {
|
|
265
|
+
return null;
|
|
266
|
+
}
|
|
267
|
+
const event = createServerMessageEvent(message, level, context);
|
|
268
|
+
await sendServerEvent(event);
|
|
269
|
+
return event.event_id;
|
|
270
|
+
}
|
|
271
|
+
function createServerErrorEvent(error, context) {
|
|
272
|
+
const browserContext = getBrowserContext();
|
|
273
|
+
return {
|
|
274
|
+
event_id: generateEventId(),
|
|
275
|
+
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
|
|
276
|
+
level: context?.level || "error",
|
|
277
|
+
message: error.message,
|
|
278
|
+
exception: {
|
|
279
|
+
type: error.name,
|
|
280
|
+
value: error.message,
|
|
281
|
+
stacktrace: parseStackTrace(error)
|
|
282
|
+
},
|
|
283
|
+
tags: { ...context?.tags, runtime: "server" },
|
|
284
|
+
extra: { ...context?.extra },
|
|
285
|
+
user: context?.user,
|
|
286
|
+
breadcrumbs: getBreadcrumbs(),
|
|
287
|
+
context: {
|
|
288
|
+
runtime: browserContext.runtime || { name: "Node.js", version: process.version }
|
|
289
|
+
},
|
|
290
|
+
environment: serverConfig?.environment,
|
|
291
|
+
release: serverConfig?.release,
|
|
292
|
+
request: context?.request
|
|
293
|
+
};
|
|
294
|
+
}
|
|
295
|
+
function createServerMessageEvent(message, level, context) {
|
|
296
|
+
return {
|
|
297
|
+
event_id: generateEventId(),
|
|
298
|
+
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
|
|
299
|
+
level,
|
|
300
|
+
message,
|
|
301
|
+
tags: { ...context?.tags, runtime: "server" },
|
|
302
|
+
extra: { ...context?.extra },
|
|
303
|
+
user: context?.user,
|
|
304
|
+
breadcrumbs: getBreadcrumbs(),
|
|
305
|
+
environment: serverConfig?.environment,
|
|
306
|
+
release: serverConfig?.release
|
|
307
|
+
};
|
|
308
|
+
}
|
|
309
|
+
async function sendServerEvent(event) {
|
|
310
|
+
if (!serverConfig) return;
|
|
311
|
+
const endpoint = getApiEndpoint(serverConfig);
|
|
312
|
+
const headers = getAuthHeaders(serverConfig);
|
|
313
|
+
try {
|
|
314
|
+
const response = await fetch(`${endpoint}/api/errors`, {
|
|
315
|
+
method: "POST",
|
|
316
|
+
headers: {
|
|
317
|
+
"Content-Type": "application/json",
|
|
318
|
+
...headers
|
|
319
|
+
},
|
|
320
|
+
body: JSON.stringify({
|
|
321
|
+
title: event.exception?.type || "Error",
|
|
322
|
+
message: event.message,
|
|
323
|
+
stack: event.exception?.stacktrace?.map(
|
|
324
|
+
(frame) => ` at ${frame.function || "anonymous"} (${frame.filename}:${frame.lineno}:${frame.colno})`
|
|
325
|
+
).join("\n"),
|
|
326
|
+
level: event.level,
|
|
327
|
+
timestamp: event.timestamp,
|
|
328
|
+
environment: event.environment,
|
|
329
|
+
release: event.release,
|
|
330
|
+
tags: event.tags,
|
|
331
|
+
extra: event.extra,
|
|
332
|
+
user: event.user,
|
|
333
|
+
breadcrumbs: event.breadcrumbs,
|
|
334
|
+
context: event.context,
|
|
335
|
+
request: event.request
|
|
336
|
+
})
|
|
337
|
+
});
|
|
338
|
+
if (serverConfig.debug) {
|
|
339
|
+
if (response.ok) {
|
|
340
|
+
console.log("[SitePong] Server event sent:", event.event_id);
|
|
341
|
+
} else {
|
|
342
|
+
console.error("[SitePong] Failed to send server event:", response.status);
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
} catch (err) {
|
|
346
|
+
if (serverConfig.debug) {
|
|
347
|
+
console.error("[SitePong] Error sending server event:", err);
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
exports.addBreadcrumb = addBreadcrumb;
|
|
353
|
+
exports.captureServerException = captureServerException;
|
|
354
|
+
exports.captureServerMessage = captureServerMessage;
|
|
355
|
+
exports.clearBreadcrumbs = clearBreadcrumbs;
|
|
356
|
+
exports.getBreadcrumbs = getBreadcrumbs;
|
|
357
|
+
exports.getServerConfig = getServerConfig;
|
|
358
|
+
exports.initServer = initServer;
|
|
359
|
+
//# sourceMappingURL=index.js.map
|
|
360
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/core/dsn.ts","../../src/utils/platform.ts","../../src/utils/stacktrace.ts","../../src/core/breadcrumbs.ts","../../src/server/index.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import type { ParsedDSN, SitePongConfig } from \"./types\";\n\n/**\n * Parse a DSN string into its components\n * Format: https://<public_key>@<host>/<project_id>\n * Example: https://abc123@ingest.sitepong.com/1\n */\nexport function parseDSN(dsn: string): ParsedDSN {\n const match = dsn.match(\n /^(https?):\\/\\/([^@]+)@([^/]+)\\/(.+)$/\n );\n\n if (!match) {\n throw new Error(\n `Invalid DSN: ${dsn}. Expected format: https://<public_key>@<host>/<project_id>`\n );\n }\n\n const [, protocol, publicKey, host, projectId] = match;\n\n return {\n protocol,\n publicKey,\n host,\n projectId,\n };\n}\n\n/**\n * Parse an API key and extract environment\n * Format: sp_live_xxx or sp_test_xxx\n */\nexport function parseApiKey(apiKey: string): {\n key: string;\n environment: \"production\" | \"test\";\n} {\n if (!apiKey.startsWith(\"sp_\")) {\n throw new Error(\n `Invalid API key format. Expected: sp_live_xxx or sp_test_xxx`\n );\n }\n\n const isTest = apiKey.startsWith(\"sp_test_\");\n const isLive = apiKey.startsWith(\"sp_live_\");\n\n if (!isTest && !isLive) {\n throw new Error(\n `Invalid API key prefix. Expected: sp_live_ or sp_test_`\n );\n }\n\n return {\n key: apiKey,\n environment: isLive ? \"production\" : \"test\",\n };\n}\n\n/**\n * Get the API endpoint URL from config\n */\nexport function getApiEndpoint(config: SitePongConfig): string {\n // Custom endpoint takes precedence\n if (config.apiEndpoint) {\n return config.apiEndpoint;\n }\n\n // Parse from DSN\n if (config.dsn) {\n const parsed = parseDSN(config.dsn);\n return `${parsed.protocol}://${parsed.host}`;\n }\n\n // Default endpoint for API key auth\n return \"https://api.sitepong.com\";\n}\n\n/**\n * Get authentication headers for API requests\n */\nexport function getAuthHeaders(config: SitePongConfig): Record<string, string> {\n if (config.dsn) {\n const parsed = parseDSN(config.dsn);\n return {\n \"X-SitePong-Key\": parsed.publicKey,\n \"X-SitePong-Project\": parsed.projectId,\n };\n }\n\n if (config.apiKey) {\n return {\n Authorization: `Bearer ${config.apiKey}`,\n };\n }\n\n return {};\n}\n\n/**\n * Validate configuration\n */\nexport function validateConfig(config: SitePongConfig): void {\n if (!config.dsn && !config.apiKey) {\n throw new Error(\n \"SitePong: You must provide either a DSN or an API key\"\n );\n }\n\n if (config.dsn && config.apiKey) {\n console.warn(\n \"SitePong: Both DSN and API key provided. DSN will be used.\"\n );\n }\n\n if (config.sampleRate !== undefined) {\n if (config.sampleRate < 0 || config.sampleRate > 1) {\n throw new Error(\n \"SitePong: sampleRate must be between 0 and 1\"\n );\n }\n }\n}\n","/**\n * Platform detection and adapters for cross-platform support\n * Supports: Browser, React Native/Expo, Node.js\n */\n\nexport type Platform = \"browser\" | \"react-native\" | \"node\" | \"unknown\";\n\n/**\n * Detect the current platform\n */\nexport function detectPlatform(): Platform {\n // React Native detection\n if (\n typeof navigator !== \"undefined\" &&\n navigator.product === \"ReactNative\"\n ) {\n return \"react-native\";\n }\n\n // Node.js detection\n if (\n typeof process !== \"undefined\" &&\n process.versions &&\n process.versions.node\n ) {\n return \"node\";\n }\n\n // Browser detection\n if (typeof window !== \"undefined\" && typeof document !== \"undefined\") {\n return \"browser\";\n }\n\n return \"unknown\";\n}\n\nexport const currentPlatform = detectPlatform();\n\n/**\n * Check if running in browser\n */\nexport function isBrowser(): boolean {\n return currentPlatform === \"browser\";\n}\n\n/**\n * Check if running in React Native\n */\nexport function isReactNative(): boolean {\n return currentPlatform === \"react-native\";\n}\n\n/**\n * Check if running in Node.js\n */\nexport function isNode(): boolean {\n return currentPlatform === \"node\";\n}\n\n/**\n * Get device info based on platform\n */\nexport function getDeviceInfo(): {\n platform: Platform;\n userAgent?: string;\n deviceName?: string;\n osName?: string;\n osVersion?: string;\n appVersion?: string;\n} {\n const info: ReturnType<typeof getDeviceInfo> = {\n platform: currentPlatform,\n };\n\n if (isBrowser() && typeof navigator !== \"undefined\") {\n info.userAgent = navigator.userAgent;\n }\n\n // React Native device info would be injected via configuration\n // since we can't directly access native modules from here\n\n return info;\n}\n\n/**\n * Platform-agnostic storage interface\n */\nexport interface StorageAdapter {\n getItem(key: string): Promise<string | null>;\n setItem(key: string, value: string): Promise<void>;\n removeItem(key: string): Promise<void>;\n}\n\n/**\n * Get storage adapter for current platform\n */\nexport function getStorageAdapter(): StorageAdapter | null {\n if (isBrowser() && typeof localStorage !== \"undefined\") {\n return {\n getItem: async (key) => localStorage.getItem(key),\n setItem: async (key, value) => localStorage.setItem(key, value),\n removeItem: async (key) => localStorage.removeItem(key),\n };\n }\n\n // React Native AsyncStorage would be passed in via config\n // Node.js could use file-based storage\n\n return null;\n}\n\n/**\n * Platform-agnostic network request\n */\nexport async function platformFetch(\n url: string,\n options: RequestInit\n): Promise<Response> {\n // Use native fetch if available (browser, React Native with polyfill, Node 18+)\n if (typeof fetch !== \"undefined\") {\n return fetch(url, options);\n }\n\n throw new Error(\"No fetch implementation available\");\n}\n\n/**\n * Get current URL (browser only)\n */\nexport function getCurrentUrl(): string | null {\n if (isBrowser() && typeof window !== \"undefined\") {\n return window.location.href;\n }\n return null;\n}\n\n/**\n * Get referrer (browser only)\n */\nexport function getReferrer(): string | null {\n if (isBrowser() && typeof document !== \"undefined\") {\n return document.referrer || null;\n }\n return null;\n}\n","import type { StackFrame } from \"../core/types\";\nimport { isBrowser, isReactNative } from \"./platform\";\n\n/**\n * Parse an Error stack trace into structured frames\n * Works across Browser, React Native, and Node.js\n */\nexport function parseStackTrace(error: Error): StackFrame[] {\n if (!error.stack) {\n return [];\n }\n\n const lines = error.stack.split(\"\\n\");\n const frames: StackFrame[] = [];\n\n for (const line of lines) {\n const frame = parseStackLine(line);\n if (frame) {\n frames.push(frame);\n }\n }\n\n return frames;\n}\n\n/**\n * Parse a single line of a stack trace\n */\nfunction parseStackLine(line: string): StackFrame | null {\n // Chrome/Edge/Node format: \" at functionName (filename:line:col)\"\n const chromeMatch = line.match(\n /^\\s*at\\s+(?:(.+?)\\s+\\()?(?:(.+?):(\\d+):(\\d+))\\)?$/\n );\n\n if (chromeMatch) {\n return {\n function: chromeMatch[1] || \"anonymous\",\n filename: chromeMatch[2],\n lineno: parseInt(chromeMatch[3], 10),\n colno: parseInt(chromeMatch[4], 10),\n in_app: !chromeMatch[2]?.includes(\"node_modules\"),\n };\n }\n\n // Firefox/Safari format: \"functionName@filename:line:col\"\n const firefoxMatch = line.match(/^(.+?)@(.+?):(\\d+):(\\d+)$/);\n\n if (firefoxMatch) {\n return {\n function: firefoxMatch[1] || \"anonymous\",\n filename: firefoxMatch[2],\n lineno: parseInt(firefoxMatch[3], 10),\n colno: parseInt(firefoxMatch[4], 10),\n in_app: !firefoxMatch[2]?.includes(\"node_modules\"),\n };\n }\n\n return null;\n}\n\n/**\n * Generate a unique event ID\n */\nexport function generateEventId(): string {\n // Generate a UUID v4-like ID\n const hex = \"0123456789abcdef\";\n let id = \"\";\n\n for (let i = 0; i < 32; i++) {\n id += hex[Math.floor(Math.random() * 16)];\n }\n\n return id;\n}\n\n/**\n * Get device/browser context information\n * Works across Browser, React Native, and Node.js\n */\nexport function getBrowserContext(): {\n browser: { name: string; version: string };\n os: { name: string; version: string };\n runtime?: { name: string; version: string };\n} {\n // React Native\n if (isReactNative()) {\n return {\n browser: { name: \"React Native\", version: \"unknown\" },\n os: { name: \"unknown\", version: \"unknown\" },\n runtime: { name: \"React Native\", version: \"unknown\" },\n };\n }\n\n // Node.js\n if (typeof process !== \"undefined\" && process.versions?.node) {\n return {\n browser: { name: \"Node.js\", version: process.versions.node },\n os: {\n name: process.platform || \"unknown\",\n version: process.version || \"unknown\"\n },\n runtime: { name: \"Node.js\", version: process.versions.node },\n };\n }\n\n // Browser\n if (typeof navigator === \"undefined\") {\n return {\n browser: { name: \"unknown\", version: \"unknown\" },\n os: { name: \"unknown\", version: \"unknown\" },\n };\n }\n\n const ua = navigator.userAgent;\n\n // Simple browser detection\n let browserName = \"unknown\";\n let browserVersion = \"unknown\";\n\n if (ua.includes(\"Firefox/\")) {\n browserName = \"Firefox\";\n browserVersion = ua.match(/Firefox\\/(\\d+)/)?.[1] || \"unknown\";\n } else if (ua.includes(\"Edg/\")) {\n browserName = \"Edge\";\n browserVersion = ua.match(/Edg\\/(\\d+)/)?.[1] || \"unknown\";\n } else if (ua.includes(\"Chrome/\")) {\n browserName = \"Chrome\";\n browserVersion = ua.match(/Chrome\\/(\\d+)/)?.[1] || \"unknown\";\n } else if (ua.includes(\"Safari/\") && !ua.includes(\"Chrome\")) {\n browserName = \"Safari\";\n browserVersion = ua.match(/Version\\/(\\d+)/)?.[1] || \"unknown\";\n }\n\n // Simple OS detection\n let osName = \"unknown\";\n let osVersion = \"unknown\";\n\n if (ua.includes(\"Windows\")) {\n osName = \"Windows\";\n osVersion = ua.match(/Windows NT (\\d+\\.\\d+)/)?.[1] || \"unknown\";\n } else if (ua.includes(\"Mac OS X\")) {\n osName = \"macOS\";\n osVersion =\n ua.match(/Mac OS X (\\d+[._]\\d+)/)?.[1]?.replace(\"_\", \".\") || \"unknown\";\n } else if (ua.includes(\"Linux\")) {\n osName = \"Linux\";\n } else if (ua.includes(\"Android\")) {\n osName = \"Android\";\n osVersion = ua.match(/Android (\\d+)/)?.[1] || \"unknown\";\n } else if (ua.includes(\"iOS\") || ua.includes(\"iPhone\") || ua.includes(\"iPad\")) {\n osName = \"iOS\";\n osVersion = ua.match(/OS (\\d+)/)?.[1] || \"unknown\";\n }\n\n return {\n browser: { name: browserName, version: browserVersion },\n os: { name: osName, version: osVersion },\n };\n}\n\n/**\n * Get current URL and request info\n * Platform-aware - works in browser, returns empty in RN/Node\n */\nexport function getRequestContext(): {\n url: string;\n referrer: string;\n} {\n if (isBrowser() && typeof window !== \"undefined\") {\n return {\n url: window.location.href,\n referrer: document.referrer || \"\",\n };\n }\n\n // React Native and Node.js don't have a \"current URL\" concept\n // This would be set manually via navigation tracking\n return { url: \"\", referrer: \"\" };\n}\n","import type { Breadcrumb } from \"./types\";\n\nconst MAX_BREADCRUMBS = 100;\n\nclass BreadcrumbManager {\n private breadcrumbs: Breadcrumb[] = [];\n private maxBreadcrumbs: number = MAX_BREADCRUMBS;\n\n setMaxBreadcrumbs(max: number): void {\n this.maxBreadcrumbs = max;\n this.trim();\n }\n\n add(breadcrumb: Omit<Breadcrumb, \"timestamp\">): void {\n const entry: Breadcrumb = {\n ...breadcrumb,\n timestamp: Date.now(),\n };\n\n this.breadcrumbs.push(entry);\n this.trim();\n }\n\n getAll(): Breadcrumb[] {\n return [...this.breadcrumbs];\n }\n\n clear(): void {\n this.breadcrumbs = [];\n }\n\n private trim(): void {\n if (this.breadcrumbs.length > this.maxBreadcrumbs) {\n this.breadcrumbs = this.breadcrumbs.slice(-this.maxBreadcrumbs);\n }\n }\n}\n\nexport const breadcrumbs = new BreadcrumbManager();\n\n/**\n * Add a breadcrumb to the trail\n */\nexport function addBreadcrumb(\n breadcrumb: Omit<Breadcrumb, \"timestamp\">\n): void {\n breadcrumbs.add(breadcrumb);\n}\n\n/**\n * Get all breadcrumbs\n */\nexport function getBreadcrumbs(): Breadcrumb[] {\n return breadcrumbs.getAll();\n}\n\n/**\n * Clear all breadcrumbs\n */\nexport function clearBreadcrumbs(): void {\n breadcrumbs.clear();\n}\n","/**\n * Server-side exports for @sitepong/react\n * Use this for Next.js API routes, Express, and other Node.js servers\n */\n\nimport type { SitePongConfig, ErrorEvent, CaptureContext, LogLevel } from \"../core/types\";\nimport { validateConfig, getApiEndpoint, getAuthHeaders } from \"../core/dsn\";\nimport {\n parseStackTrace,\n generateEventId,\n getBrowserContext,\n} from \"../utils/stacktrace\";\nimport { getBreadcrumbs, addBreadcrumb, clearBreadcrumbs } from \"../core/breadcrumbs\";\n\n// Server-side client (stateless for serverless environments)\nlet serverConfig: SitePongConfig | null = null;\n\n/**\n * Initialize SitePong for server-side usage\n *\n * @example\n * ```ts\n * // In your server entry point or API route\n * import { initServer } from '@sitepong/react/server';\n *\n * initServer({\n * dsn: process.env.SITEPONG_DSN,\n * environment: process.env.NODE_ENV,\n * });\n * ```\n */\nexport function initServer(config: SitePongConfig): void {\n validateConfig(config);\n serverConfig = {\n enabled: true,\n debug: false,\n sampleRate: 1.0,\n ...config,\n };\n\n if (serverConfig.debug) {\n console.log(\"[SitePong] Server SDK initialized\");\n }\n}\n\n/**\n * Get the current server configuration\n */\nexport function getServerConfig(): SitePongConfig | null {\n return serverConfig;\n}\n\n/**\n * Capture an exception on the server\n */\nexport async function captureServerException(\n error: Error | unknown,\n context?: CaptureContext & {\n request?: {\n url?: string;\n method?: string;\n headers?: Record<string, string>;\n query?: Record<string, string>;\n body?: unknown;\n ip?: string;\n };\n }\n): Promise<string | null> {\n if (!serverConfig?.enabled) {\n return null;\n }\n\n const err = error instanceof Error ? error : new Error(String(error));\n const event = createServerErrorEvent(err, context);\n\n await sendServerEvent(event);\n return event.event_id;\n}\n\n/**\n * Capture a message on the server\n */\nexport async function captureServerMessage(\n message: string,\n level: LogLevel = \"info\",\n context?: CaptureContext\n): Promise<string | null> {\n if (!serverConfig?.enabled) {\n return null;\n }\n\n const event = createServerMessageEvent(message, level, context);\n await sendServerEvent(event);\n return event.event_id;\n}\n\nfunction createServerErrorEvent(\n error: Error,\n context?: CaptureContext & { request?: Record<string, unknown> }\n): ErrorEvent {\n const browserContext = getBrowserContext();\n\n return {\n event_id: generateEventId(),\n timestamp: new Date().toISOString(),\n level: context?.level || \"error\",\n message: error.message,\n exception: {\n type: error.name,\n value: error.message,\n stacktrace: parseStackTrace(error),\n },\n tags: { ...context?.tags, runtime: \"server\" },\n extra: { ...context?.extra },\n user: context?.user,\n breadcrumbs: getBreadcrumbs(),\n context: {\n runtime: browserContext.runtime || { name: \"Node.js\", version: process.version },\n },\n environment: serverConfig?.environment,\n release: serverConfig?.release,\n request: context?.request as ErrorEvent[\"request\"],\n };\n}\n\nfunction createServerMessageEvent(\n message: string,\n level: LogLevel,\n context?: CaptureContext\n): ErrorEvent {\n return {\n event_id: generateEventId(),\n timestamp: new Date().toISOString(),\n level,\n message,\n tags: { ...context?.tags, runtime: \"server\" },\n extra: { ...context?.extra },\n user: context?.user,\n breadcrumbs: getBreadcrumbs(),\n environment: serverConfig?.environment,\n release: serverConfig?.release,\n };\n}\n\nasync function sendServerEvent(event: ErrorEvent): Promise<void> {\n if (!serverConfig) return;\n\n const endpoint = getApiEndpoint(serverConfig);\n const headers = getAuthHeaders(serverConfig);\n\n try {\n const response = await fetch(`${endpoint}/api/errors`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...headers,\n },\n body: JSON.stringify({\n title: event.exception?.type || \"Error\",\n message: event.message,\n stack: event.exception?.stacktrace\n ?.map(\n (frame) =>\n ` at ${frame.function || \"anonymous\"} (${frame.filename}:${frame.lineno}:${frame.colno})`\n )\n .join(\"\\n\"),\n level: event.level,\n timestamp: event.timestamp,\n environment: event.environment,\n release: event.release,\n tags: event.tags,\n extra: event.extra,\n user: event.user,\n breadcrumbs: event.breadcrumbs,\n context: event.context,\n request: event.request,\n }),\n });\n\n if (serverConfig.debug) {\n if (response.ok) {\n console.log(\"[SitePong] Server event sent:\", event.event_id);\n } else {\n console.error(\"[SitePong] Failed to send server event:\", response.status);\n }\n }\n } catch (err) {\n if (serverConfig.debug) {\n console.error(\"[SitePong] Error sending server event:\", err);\n }\n }\n}\n\n// Re-export breadcrumb functions for server use\nexport { addBreadcrumb, getBreadcrumbs, clearBreadcrumbs };\n\n// Re-export types\nexport type { SitePongConfig, ErrorEvent, CaptureContext, LogLevel };\n"]}
|