sonar-sdk 0.2.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 (62) hide show
  1. package/README.md +78 -0
  2. package/dist/browser/auto.d.ts +28 -0
  3. package/dist/browser/auto.d.ts.map +1 -0
  4. package/dist/browser/auto.js +207 -0
  5. package/dist/browser/auto.js.map +1 -0
  6. package/dist/browser/consent.d.ts +19 -0
  7. package/dist/browser/consent.d.ts.map +1 -0
  8. package/dist/browser/consent.js +132 -0
  9. package/dist/browser/consent.js.map +1 -0
  10. package/dist/browser/frustration.d.ts +34 -0
  11. package/dist/browser/frustration.d.ts.map +1 -0
  12. package/dist/browser/frustration.js +257 -0
  13. package/dist/browser/frustration.js.map +1 -0
  14. package/dist/browser/index.d.ts +10 -0
  15. package/dist/browser/index.d.ts.map +1 -0
  16. package/dist/browser/index.js +9 -0
  17. package/dist/browser/index.js.map +1 -0
  18. package/dist/browser/screenshot.d.ts +21 -0
  19. package/dist/browser/screenshot.d.ts.map +1 -0
  20. package/dist/browser/screenshot.js +143 -0
  21. package/dist/browser/screenshot.js.map +1 -0
  22. package/dist/browser/session-recorder.d.ts +19 -0
  23. package/dist/browser/session-recorder.d.ts.map +1 -0
  24. package/dist/browser/session-recorder.js +68 -0
  25. package/dist/browser/session-recorder.js.map +1 -0
  26. package/dist/browser/sonar-web.d.ts +28 -0
  27. package/dist/browser/sonar-web.d.ts.map +1 -0
  28. package/dist/browser/sonar-web.js +186 -0
  29. package/dist/browser/sonar-web.js.map +1 -0
  30. package/dist/browser/transport.d.ts +19 -0
  31. package/dist/browser/transport.d.ts.map +1 -0
  32. package/dist/browser/transport.js +128 -0
  33. package/dist/browser/transport.js.map +1 -0
  34. package/dist/browser/types.d.ts +119 -0
  35. package/dist/browser/types.d.ts.map +1 -0
  36. package/dist/browser/types.js +2 -0
  37. package/dist/browser/types.js.map +1 -0
  38. package/dist/browser/video-recorder.d.ts +25 -0
  39. package/dist/browser/video-recorder.d.ts.map +1 -0
  40. package/dist/browser/video-recorder.js +121 -0
  41. package/dist/browser/video-recorder.js.map +1 -0
  42. package/dist/browser/visitor.d.ts +9 -0
  43. package/dist/browser/visitor.d.ts.map +1 -0
  44. package/dist/browser/visitor.js +67 -0
  45. package/dist/browser/visitor.js.map +1 -0
  46. package/dist/client.d.ts +12 -0
  47. package/dist/client.d.ts.map +1 -0
  48. package/dist/client.js +81 -0
  49. package/dist/client.js.map +1 -0
  50. package/dist/index.browser.d.ts +13 -0
  51. package/dist/index.browser.d.ts.map +1 -0
  52. package/dist/index.browser.js +11 -0
  53. package/dist/index.browser.js.map +1 -0
  54. package/dist/index.d.ts +15 -0
  55. package/dist/index.d.ts.map +1 -0
  56. package/dist/index.js +53 -0
  57. package/dist/index.js.map +1 -0
  58. package/dist/types.d.ts +33 -0
  59. package/dist/types.d.ts.map +1 -0
  60. package/dist/types.js +2 -0
  61. package/dist/types.js.map +1 -0
  62. package/package.json +52 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"visitor.d.ts","sourceRoot":"","sources":["../../src/browser/visitor.ts"],"names":[],"mappings":"AA8BA,qBAAa,cAAc;IACzB,OAAO,CAAC,UAAU,CAAQ;IAC1B,OAAO,CAAC,UAAU,CAAQ;;IAqB1B,IAAI,SAAS,WAA6B;IAC1C,IAAI,SAAS,WAA6B;IAE1C,KAAK;CAGN"}
@@ -0,0 +1,67 @@
1
+ const VISITOR_KEY = 'sonar_visitor_id';
2
+ const SESSION_KEY = 'sonar_session_id';
3
+ const SESSION_ACTIVITY_KEY = 'sonar_session_activity';
4
+ const SESSION_TIMEOUT_MS = 30 * 60 * 1000;
5
+ function uuid() {
6
+ const hex = '0123456789abcdef';
7
+ const chars = new Array(36);
8
+ for (let i = 0; i < 36; i++) {
9
+ if (i === 8 || i === 13 || i === 18 || i === 23) {
10
+ chars[i] = '-';
11
+ }
12
+ else if (i === 14) {
13
+ chars[i] = '4';
14
+ }
15
+ else if (i === 19) {
16
+ chars[i] = hex[(Math.random() * 4) | 8];
17
+ }
18
+ else {
19
+ chars[i] = hex[(Math.random() * 16) | 0];
20
+ }
21
+ }
22
+ return chars.join('');
23
+ }
24
+ function getStorageItem(key) {
25
+ try {
26
+ return localStorage.getItem(key);
27
+ }
28
+ catch {
29
+ return null;
30
+ }
31
+ }
32
+ function setStorageItem(key, value) {
33
+ try {
34
+ localStorage.setItem(key, value);
35
+ }
36
+ catch { /* noop */ }
37
+ }
38
+ export class VisitorManager {
39
+ _visitorId;
40
+ _sessionId;
41
+ constructor() {
42
+ let vid = getStorageItem(VISITOR_KEY);
43
+ if (!vid) {
44
+ vid = uuid();
45
+ setStorageItem(VISITOR_KEY, vid);
46
+ }
47
+ this._visitorId = vid;
48
+ let sid = getStorageItem(SESSION_KEY);
49
+ const lastActivity = getStorageItem(SESSION_ACTIVITY_KEY);
50
+ const now = Date.now();
51
+ if (!sid || !lastActivity || (now - Number(lastActivity)) > SESSION_TIMEOUT_MS) {
52
+ sid = uuid();
53
+ setStorageItem(SESSION_KEY, sid);
54
+ }
55
+ this._sessionId = sid;
56
+ setStorageItem(SESSION_ACTIVITY_KEY, String(now));
57
+ }
58
+ get visitorId() { return this._visitorId; }
59
+ get sessionId() { return this._sessionId; }
60
+ touch() {
61
+ try {
62
+ localStorage.setItem(SESSION_ACTIVITY_KEY, String(Date.now()));
63
+ }
64
+ catch { /* noop */ }
65
+ }
66
+ }
67
+ //# sourceMappingURL=visitor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"visitor.js","sourceRoot":"","sources":["../../src/browser/visitor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { SonarOptions, CaptureErrorPayload, RecordDeploymentOptions, IngestResponse } from './types';
2
+ export declare class SonarClient {
3
+ private environment;
4
+ private endpoint;
5
+ private token;
6
+ constructor(options: SonarOptions);
7
+ setToken(token: string): void;
8
+ private get authHeaders();
9
+ ingestError(payload: CaptureErrorPayload): Promise<IngestResponse>;
10
+ recordDeployment(payload: RecordDeploymentOptions): Promise<IngestResponse>;
11
+ }
12
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAIzG,qBAAa,WAAW;IACtB,OAAO,CAAC,WAAW,CAAQ;IAC3B,OAAO,CAAC,QAAQ,CAAQ;IACxB,OAAO,CAAC,KAAK,CAAsB;gBAEvB,OAAO,EAAE,YAAY;IAMjC,QAAQ,CAAC,KAAK,EAAE,MAAM;IAItB,OAAO,KAAK,WAAW,GAQtB;IAEK,WAAW,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,cAAc,CAAC;IA2BlE,gBAAgB,CAAC,OAAO,EAAE,uBAAuB,GAAG,OAAO,CAAC,cAAc,CAAC;CA6BlF"}
package/dist/client.js ADDED
@@ -0,0 +1,81 @@
1
+ const DEFAULT_ENDPOINT = 'https://sonar-api-xi.vercel.app';
2
+ export class SonarClient {
3
+ environment;
4
+ endpoint;
5
+ token = null;
6
+ constructor(options) {
7
+ this.environment = options.environment;
8
+ this.endpoint = options.endpoint ?? DEFAULT_ENDPOINT;
9
+ this.token = options.apiKey;
10
+ }
11
+ setToken(token) {
12
+ this.token = token;
13
+ }
14
+ get authHeaders() {
15
+ const headers = {
16
+ 'Content-Type': 'application/json',
17
+ };
18
+ if (this.token) {
19
+ headers['Authorization'] = `Bearer ${this.token}`;
20
+ }
21
+ return headers;
22
+ }
23
+ async ingestError(payload) {
24
+ const controller = new AbortController();
25
+ const timer = setTimeout(() => controller.abort(), 10_000);
26
+ try {
27
+ const res = await fetch(`${this.endpoint}/ingest/errors`, {
28
+ method: 'POST',
29
+ headers: this.authHeaders,
30
+ body: JSON.stringify({
31
+ ...payload,
32
+ metadata: payload.metadata ? JSON.stringify(payload.metadata) : undefined,
33
+ environmentKey: this.environment,
34
+ }),
35
+ signal: controller.signal,
36
+ });
37
+ if (!res.ok) {
38
+ const body = await res.json().catch(() => null);
39
+ const hint = res.status === 401
40
+ ? ' — check that SONAR_API_KEY is set and valid'
41
+ : '';
42
+ throw new Error(body?.message ?? `Failed to ingest error (${res.status})${hint}`);
43
+ }
44
+ return res.json();
45
+ }
46
+ finally {
47
+ clearTimeout(timer);
48
+ }
49
+ }
50
+ async recordDeployment(payload) {
51
+ const controller = new AbortController();
52
+ const timer = setTimeout(() => controller.abort(), 10_000);
53
+ try {
54
+ const res = await fetch(`${this.endpoint}/ingest/deployments`, {
55
+ method: 'POST',
56
+ headers: this.authHeaders,
57
+ body: JSON.stringify({
58
+ version: payload.version,
59
+ status: payload.status,
60
+ description: payload.description,
61
+ deployedBy: payload.deployedBy,
62
+ serviceId: payload.serviceId,
63
+ environmentKey: this.environment,
64
+ }),
65
+ signal: controller.signal,
66
+ });
67
+ if (!res.ok) {
68
+ const body = await res.json().catch(() => null);
69
+ const hint = res.status === 401
70
+ ? ' — check that SONAR_API_KEY is set and valid'
71
+ : '';
72
+ throw new Error(body?.message ?? `Failed to record deployment (${res.status})${hint}`);
73
+ }
74
+ return res.json();
75
+ }
76
+ finally {
77
+ clearTimeout(timer);
78
+ }
79
+ }
80
+ }
81
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ export { SonarWeb } from './browser/sonar-web';
2
+ export { ConsentManager } from './browser/consent';
3
+ export { BatchTransport } from './browser/transport';
4
+ export { VisitorManager } from './browser/visitor';
5
+ export { AutoTracker } from './browser/auto';
6
+ export { SmartScreenshotCapture } from './browser/screenshot';
7
+ export { VideoRecorder } from './browser/video-recorder';
8
+ export { SessionRecorder } from './browser/session-recorder';
9
+ export { FrustrationDetector } from './browser/frustration';
10
+ export type { SonarWebOptions, ConsentState, ConsentBannerOptions, AutoTrackOptions, SessionRecorderOptions, VideoRecorderOptions, ScreenshotOptions, AnalyticsEventPayload, AnalyticsSessionPayload, FrustrationOptions, SmartScreenshotOptions, IntelligenceOptions, } from './browser/types';
11
+ export { SonarClient } from './client';
12
+ export type { SonarOptions, CaptureErrorOptions, RecordDeploymentOptions } from './types';
13
+ //# sourceMappingURL=index.browser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.browser.d.ts","sourceRoot":"","sources":["../src/index.browser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAC5C,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAA;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAA;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAA;AAC3D,YAAY,EACV,eAAe,EACf,YAAY,EACZ,oBAAoB,EACpB,gBAAgB,EAChB,sBAAsB,EACtB,oBAAoB,EACpB,iBAAiB,EACjB,qBAAqB,EACrB,uBAAuB,EACvB,kBAAkB,EAClB,sBAAsB,EACtB,mBAAmB,GACpB,MAAM,iBAAiB,CAAA;AAExB,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AACtC,YAAY,EAAE,YAAY,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,MAAM,SAAS,CAAA"}
@@ -0,0 +1,11 @@
1
+ export { SonarWeb } from './browser/sonar-web';
2
+ export { ConsentManager } from './browser/consent';
3
+ export { BatchTransport } from './browser/transport';
4
+ export { VisitorManager } from './browser/visitor';
5
+ export { AutoTracker } from './browser/auto';
6
+ export { SmartScreenshotCapture } from './browser/screenshot';
7
+ export { VideoRecorder } from './browser/video-recorder';
8
+ export { SessionRecorder } from './browser/session-recorder';
9
+ export { FrustrationDetector } from './browser/frustration';
10
+ export { SonarClient } from './client';
11
+ //# sourceMappingURL=index.browser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.browser.js","sourceRoot":"","sources":["../src/index.browser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAC5C,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAA;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAA;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAA;AAgB3D,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA"}
@@ -0,0 +1,15 @@
1
+ import type { IncomingMessage, ServerResponse } from 'node:http';
2
+ import type { SonarOptions, CaptureErrorOptions, RecordDeploymentOptions, IngestResponse } from './types';
3
+ type NextFunction = (err?: unknown) => void;
4
+ export declare class Sonar {
5
+ private client;
6
+ private release?;
7
+ constructor(options: SonarOptions);
8
+ setToken(token: string): void;
9
+ captureError(error: Error, options?: CaptureErrorOptions): Promise<IngestResponse | undefined>;
10
+ recordDeployment(options: RecordDeploymentOptions): Promise<void>;
11
+ setupGlobalHandlers(): void;
12
+ middleware(): (err: Error, _req: IncomingMessage, _res: ServerResponse, next: NextFunction) => void;
13
+ }
14
+ export type { SonarOptions, CaptureErrorOptions, RecordDeploymentOptions };
15
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AAEhE,OAAO,KAAK,EACV,YAAY,EACZ,mBAAmB,EACnB,uBAAuB,EACvB,cAAc,EACf,MAAM,SAAS,CAAA;AAEhB,KAAK,YAAY,GAAG,CAAC,GAAG,CAAC,EAAE,OAAO,KAAK,IAAI,CAAA;AAE3C,qBAAa,KAAK;IAChB,OAAO,CAAC,MAAM,CAAa;IAC3B,OAAO,CAAC,OAAO,CAAC,CAAQ;gBAEZ,OAAO,EAAE,YAAY;IAKjC,QAAQ,CAAC,KAAK,EAAE,MAAM;IAIhB,YAAY,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,cAAc,GAAG,SAAS,CAAC;IAqB9F,gBAAgB,CAAC,OAAO,EAAE,uBAAuB;IAIvD,mBAAmB;IAenB,UAAU,KAEN,KAAK,KAAK,EACV,MAAM,eAAe,EACrB,MAAM,cAAc,EACpB,MAAM,YAAY;CAMvB;AAED,YAAY,EAAE,YAAY,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,CAAA"}
package/dist/index.js ADDED
@@ -0,0 +1,53 @@
1
+ import { SonarClient } from './client';
2
+ export class Sonar {
3
+ client;
4
+ release;
5
+ constructor(options) {
6
+ this.client = new SonarClient(options);
7
+ this.release = options.release;
8
+ }
9
+ setToken(token) {
10
+ this.client.setToken(token);
11
+ }
12
+ async captureError(error, options) {
13
+ const fingerprint = options?.fingerprint ??
14
+ `${error.constructor.name}: ${error.message}`;
15
+ const payload = {
16
+ fingerprint,
17
+ message: error.message,
18
+ stack: options?.stack ?? error.stack,
19
+ release: this.release,
20
+ metadata: options?.metadata,
21
+ };
22
+ try {
23
+ return await this.client.ingestError(payload);
24
+ }
25
+ catch (err) {
26
+ const msg = err instanceof Error ? err.message : String(err);
27
+ console.error(`[Sonar] ${msg}`);
28
+ }
29
+ }
30
+ async recordDeployment(options) {
31
+ await this.client.recordDeployment(options);
32
+ }
33
+ setupGlobalHandlers() {
34
+ if (typeof process !== 'undefined' && typeof process.on === 'function') {
35
+ process.on('uncaughtException', (error) => {
36
+ this.captureError(error, { fingerprint: 'UncaughtException' });
37
+ });
38
+ process.on('unhandledRejection', (reason) => {
39
+ const error = reason instanceof Error
40
+ ? reason
41
+ : new Error(String(reason));
42
+ this.captureError(error, { fingerprint: 'UnhandledRejection' });
43
+ });
44
+ }
45
+ }
46
+ middleware() {
47
+ return (err, _req, _res, next) => {
48
+ this.captureError(err);
49
+ next(err);
50
+ };
51
+ }
52
+ }
53
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AAUtC,MAAM,OAAO,KAAK;IACR,MAAM,CAAa;IACnB,OAAO,CAAS;IAExB,YAAY,OAAqB;QAC/B,IAAI,CAAC,MAAM,GAAG,IAAI,WAAW,CAAC,OAAO,CAAC,CAAA;QACtC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAA;IAChC,CAAC;IAED,QAAQ,CAAC,KAAa;QACpB,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;IAC7B,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,KAAY,EAAE,OAA6B;QAC5D,MAAM,WAAW,GACf,OAAO,EAAE,WAAW;YACpB,GAAG,KAAK,CAAC,WAAW,CAAC,IAAI,KAAK,KAAK,CAAC,OAAO,EAAE,CAAA;QAE/C,MAAM,OAAO,GAAG;YACd,WAAW;YACX,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,KAAK,EAAE,OAAO,EAAE,KAAK,IAAI,KAAK,CAAC,KAAK;YACpC,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,QAAQ,EAAE,OAAO,EAAE,QAAQ;SAC5B,CAAA;QAED,IAAI,CAAC;YACH,OAAO,MAAM,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAA;QAC/C,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;YAC5D,OAAO,CAAC,KAAK,CAAC,WAAW,GAAG,EAAE,CAAC,CAAA;QACjC,CAAC;IACH,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,OAAgC;QACrD,MAAM,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAA;IAC7C,CAAC;IAED,mBAAmB;QACjB,IAAI,OAAO,OAAO,KAAK,WAAW,IAAI,OAAO,OAAO,CAAC,EAAE,KAAK,UAAU,EAAE,CAAC;YACvE,OAAO,CAAC,EAAE,CAAC,mBAAmB,EAAE,CAAC,KAAY,EAAE,EAAE;gBAC/C,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,EAAE,WAAW,EAAE,mBAAmB,EAAE,CAAC,CAAA;YAChE,CAAC,CAAC,CAAA;YACF,OAAO,CAAC,EAAE,CAAC,oBAAoB,EAAE,CAAC,MAAe,EAAE,EAAE;gBACnD,MAAM,KAAK,GACT,MAAM,YAAY,KAAK;oBACrB,CAAC,CAAC,MAAM;oBACR,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAA;gBAC/B,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,EAAE,WAAW,EAAE,oBAAoB,EAAE,CAAC,CAAA;YACjE,CAAC,CAAC,CAAA;QACJ,CAAC;IACH,CAAC;IAED,UAAU;QACR,OAAO,CACL,GAAU,EACV,IAAqB,EACrB,IAAoB,EACpB,IAAkB,EAClB,EAAE;YACF,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAA;YACtB,IAAI,CAAC,GAAG,CAAC,CAAA;QACX,CAAC,CAAA;IACH,CAAC;CACF"}
@@ -0,0 +1,33 @@
1
+ export type SonarOptions = {
2
+ apiKey: string;
3
+ environment: string;
4
+ release?: string;
5
+ endpoint?: string;
6
+ };
7
+ export type CaptureErrorOptions = {
8
+ fingerprint?: string;
9
+ metadata?: Record<string, unknown>;
10
+ stack?: string;
11
+ };
12
+ export type RecordDeploymentOptions = {
13
+ version: string;
14
+ status?: 'IN_PROGRESS' | 'SUCCEEDED' | 'FAILED' | 'ROLLED_BACK';
15
+ description?: string;
16
+ deployedBy?: string;
17
+ serviceId?: string;
18
+ };
19
+ export type CaptureErrorPayload = {
20
+ fingerprint: string;
21
+ message: string;
22
+ serviceId?: string;
23
+ stack?: string;
24
+ release?: string;
25
+ metadata?: Record<string, unknown>;
26
+ };
27
+ export type AuthResponse = {
28
+ token: string;
29
+ };
30
+ export type IngestResponse = {
31
+ id: string;
32
+ };
33
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,YAAY,GAAG;IACzB,MAAM,EAAE,MAAM,CAAA;IACd,WAAW,EAAE,MAAM,CAAA;IACnB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB,CAAA;AAED,MAAM,MAAM,mBAAmB,GAAG;IAChC,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAClC,KAAK,CAAC,EAAE,MAAM,CAAA;CACf,CAAA;AAED,MAAM,MAAM,uBAAuB,GAAG;IACpC,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,CAAC,EAAE,aAAa,GAAG,WAAW,GAAG,QAAQ,GAAG,aAAa,CAAA;IAC/D,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB,CAAA;AAED,MAAM,MAAM,mBAAmB,GAAG;IAChC,WAAW,EAAE,MAAM,CAAA;IACnB,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CACnC,CAAA;AAED,MAAM,MAAM,YAAY,GAAG;IACzB,KAAK,EAAE,MAAM,CAAA;CACd,CAAA;AAED,MAAM,MAAM,cAAc,GAAG;IAC3B,EAAE,EAAE,MAAM,CAAA;CACX,CAAA"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
package/package.json ADDED
@@ -0,0 +1,52 @@
1
+ {
2
+ "name": "sonar-sdk",
3
+ "version": "0.2.0",
4
+ "description": "Sonar SDK — error capture, deploy tracking, uptime monitoring, and web analytics.",
5
+ "license": "MIT",
6
+ "type": "module",
7
+ "main": "./dist/index.js",
8
+ "module": "./dist/index.js",
9
+ "types": "./dist/index.d.ts",
10
+ "exports": {
11
+ ".": {
12
+ "browser": {
13
+ "import": "./dist/index.browser.js",
14
+ "types": "./dist/index.browser.d.ts"
15
+ },
16
+ "import": "./dist/index.js",
17
+ "types": "./dist/index.d.ts"
18
+ },
19
+ "./browser": {
20
+ "import": "./dist/index.browser.js",
21
+ "types": "./dist/index.browser.d.ts"
22
+ }
23
+ },
24
+ "files": [
25
+ "dist"
26
+ ],
27
+ "engines": {
28
+ "node": ">=18"
29
+ },
30
+ "scripts": {
31
+ "build": "tsc && tsc -p tsconfig.browser.json",
32
+ "prepublishOnly": "npm run build",
33
+ "typecheck": "tsc --noEmit"
34
+ },
35
+ "keywords": [
36
+ "sonar",
37
+ "observability",
38
+ "monitoring",
39
+ "errors",
40
+ "web-analytics",
41
+ "sdk"
42
+ ],
43
+ "devDependencies": {
44
+ "@types/node": "^25.9.1",
45
+ "typescript": "^5.5.0"
46
+ },
47
+ "repository": {
48
+ "type": "git",
49
+ "url": "https://github.com/jasonamadi/sonar.git",
50
+ "directory": "packages/sdk"
51
+ }
52
+ }