@syswatch/core 1.0.2 → 1.0.4

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/index.d.mts CHANGED
@@ -27,57 +27,74 @@ interface CreateMetricDto {
27
27
  tags?: string[];
28
28
  unit?: string;
29
29
  }
30
+ interface CreateLogBatchDto {
31
+ logs: CreateLogDto[];
32
+ }
33
+ interface CreateMetricBatchDto {
34
+ metrics: CreateMetricDto[];
35
+ }
30
36
 
31
37
  type LogOptions = Omit<CreateLogDto, "level" | "message" | "type"> & {
32
38
  type?: string;
33
39
  };
34
40
  declare class Logs {
35
41
  private sendLog;
36
- constructor(sendLog: (log: CreateLogDto) => Promise<void>);
42
+ private sendLogBatch;
43
+ constructor(sendLog: (log: CreateLogDto) => Promise<void>, sendLogBatch: (logs: CreateLogDto[]) => Promise<void>);
44
+ /**
45
+ * Send multiple logs in batch
46
+ * @param logs Array of log entries
47
+ */
48
+ batch(logs: CreateLogDto[]): Promise<void>;
37
49
  /**
38
50
  * Send a DEBUG log
39
51
  * @param message Log message
40
52
  * @param options Additional options (meta, tags, etc.)
41
53
  */
42
- debug(message: string, options?: LogOptions): Promise<void>;
54
+ debug(type: string, message: string, options?: LogOptions): Promise<void>;
55
+ debug(type: string, options?: LogOptions): Promise<void>;
43
56
  /**
44
57
  * Send an INFO log
45
58
  * @param message Log message
46
59
  * @param options Additional options (meta, tags, etc.)
47
60
  */
48
- info(message: string, options?: LogOptions): Promise<void>;
61
+ info(type: string, message: string, options?: LogOptions): Promise<void>;
62
+ info(type: string, options?: LogOptions): Promise<void>;
49
63
  /**
50
64
  * Send a SUCCESS log
51
65
  * @param message Log message
52
66
  * @param options Additional options (meta, tags, etc.)
53
67
  */
54
- success(message: string, options?: LogOptions): Promise<void>;
68
+ success(type: string, message: string, options?: LogOptions): Promise<void>;
69
+ success(type: string, options?: LogOptions): Promise<void>;
55
70
  /**
56
71
  * Send a FAILURE log
57
72
  * @param message Log message
58
73
  * @param options Additional options (meta, tags, etc.)
59
74
  */
60
- failure(message: string, options?: LogOptions): Promise<void>;
75
+ failure(type: string, message: string, options?: LogOptions): Promise<void>;
76
+ failure(type: string, options?: LogOptions): Promise<void>;
61
77
  /**
62
78
  * Send a WARN log
63
79
  * @param message Log message
64
80
  * @param options Additional options (meta, tags, etc.)
65
81
  */
66
- warn(message: string, options?: LogOptions): Promise<void>;
82
+ warn(type: string, message: string, options?: LogOptions): Promise<void>;
83
+ warn(type: string, options?: LogOptions): Promise<void>;
67
84
  /**
68
85
  * Send an ERROR log with smart error handling
69
86
  * @param message Log message
70
87
  * @param errorOrOptions Error object or options object
71
88
  */
72
- error(message: string, errorOrOptions?: Error | (Omit<CreateLogDto, "level" | "message" | "type"> & {
73
- type?: string;
74
- })): Promise<void>;
89
+ error(type: string, message: string, errorOrOptions?: Error | LogOptions): Promise<void>;
90
+ error(type: string, errorOrOptions?: Error | LogOptions): Promise<void>;
75
91
  /**
76
92
  * Send a CRITICAL log
77
93
  * @param message Log message
78
94
  * @param options Additional options (meta, tags, etc.)
79
95
  */
80
- critical(message: string, options?: LogOptions): Promise<void>;
96
+ critical(type: string, message: string, options?: LogOptions): Promise<void>;
97
+ critical(type: string, options?: LogOptions): Promise<void>;
81
98
  }
82
99
 
83
100
  interface SysWatchConfig {
@@ -90,14 +107,22 @@ declare class SysWatch {
90
107
  private baseUrl;
91
108
  private defaultMeta;
92
109
  private defaultTags;
110
+ private authorized;
93
111
  log: Logs;
94
112
  constructor(config: SysWatchConfig);
113
+ init(): Promise<this>;
114
+ static create(config: SysWatchConfig): Promise<SysWatch>;
95
115
  private request;
96
116
  /**
97
117
  * Send a log entry to SysWatch
98
118
  * @param data Log data
99
119
  */
100
- sendLog(data: CreateLogDto): Promise<any>;
120
+ private sendLog;
121
+ /**
122
+ * Send multiple log entries to SysWatch in batch
123
+ * @param logs Array of log data
124
+ */
125
+ private sendLogBatch;
101
126
  /**
102
127
  * Track a metric value
103
128
  * @param type Metric type key
@@ -106,6 +131,11 @@ declare class SysWatch {
106
131
  * @param options Additional options
107
132
  */
108
133
  trackMetric(type: string, value: number, unit?: string, options?: Omit<CreateMetricDto, "type" | "value" | "unit">): Promise<any>;
134
+ /**
135
+ * Track multiple metric values in batch
136
+ * @param metrics Array of metric data
137
+ */
138
+ trackMetricBatch(metrics: CreateMetricDto[]): Promise<any>;
109
139
  }
110
140
 
111
- export { type CreateLogDto, type CreateMetricDto, LogLevel, SysWatch, type SysWatchConfig };
141
+ export { type CreateLogBatchDto, type CreateLogDto, type CreateMetricBatchDto, type CreateMetricDto, LogLevel, SysWatch, type SysWatchConfig };
package/dist/index.d.ts CHANGED
@@ -27,57 +27,74 @@ interface CreateMetricDto {
27
27
  tags?: string[];
28
28
  unit?: string;
29
29
  }
30
+ interface CreateLogBatchDto {
31
+ logs: CreateLogDto[];
32
+ }
33
+ interface CreateMetricBatchDto {
34
+ metrics: CreateMetricDto[];
35
+ }
30
36
 
31
37
  type LogOptions = Omit<CreateLogDto, "level" | "message" | "type"> & {
32
38
  type?: string;
33
39
  };
34
40
  declare class Logs {
35
41
  private sendLog;
36
- constructor(sendLog: (log: CreateLogDto) => Promise<void>);
42
+ private sendLogBatch;
43
+ constructor(sendLog: (log: CreateLogDto) => Promise<void>, sendLogBatch: (logs: CreateLogDto[]) => Promise<void>);
44
+ /**
45
+ * Send multiple logs in batch
46
+ * @param logs Array of log entries
47
+ */
48
+ batch(logs: CreateLogDto[]): Promise<void>;
37
49
  /**
38
50
  * Send a DEBUG log
39
51
  * @param message Log message
40
52
  * @param options Additional options (meta, tags, etc.)
41
53
  */
42
- debug(message: string, options?: LogOptions): Promise<void>;
54
+ debug(type: string, message: string, options?: LogOptions): Promise<void>;
55
+ debug(type: string, options?: LogOptions): Promise<void>;
43
56
  /**
44
57
  * Send an INFO log
45
58
  * @param message Log message
46
59
  * @param options Additional options (meta, tags, etc.)
47
60
  */
48
- info(message: string, options?: LogOptions): Promise<void>;
61
+ info(type: string, message: string, options?: LogOptions): Promise<void>;
62
+ info(type: string, options?: LogOptions): Promise<void>;
49
63
  /**
50
64
  * Send a SUCCESS log
51
65
  * @param message Log message
52
66
  * @param options Additional options (meta, tags, etc.)
53
67
  */
54
- success(message: string, options?: LogOptions): Promise<void>;
68
+ success(type: string, message: string, options?: LogOptions): Promise<void>;
69
+ success(type: string, options?: LogOptions): Promise<void>;
55
70
  /**
56
71
  * Send a FAILURE log
57
72
  * @param message Log message
58
73
  * @param options Additional options (meta, tags, etc.)
59
74
  */
60
- failure(message: string, options?: LogOptions): Promise<void>;
75
+ failure(type: string, message: string, options?: LogOptions): Promise<void>;
76
+ failure(type: string, options?: LogOptions): Promise<void>;
61
77
  /**
62
78
  * Send a WARN log
63
79
  * @param message Log message
64
80
  * @param options Additional options (meta, tags, etc.)
65
81
  */
66
- warn(message: string, options?: LogOptions): Promise<void>;
82
+ warn(type: string, message: string, options?: LogOptions): Promise<void>;
83
+ warn(type: string, options?: LogOptions): Promise<void>;
67
84
  /**
68
85
  * Send an ERROR log with smart error handling
69
86
  * @param message Log message
70
87
  * @param errorOrOptions Error object or options object
71
88
  */
72
- error(message: string, errorOrOptions?: Error | (Omit<CreateLogDto, "level" | "message" | "type"> & {
73
- type?: string;
74
- })): Promise<void>;
89
+ error(type: string, message: string, errorOrOptions?: Error | LogOptions): Promise<void>;
90
+ error(type: string, errorOrOptions?: Error | LogOptions): Promise<void>;
75
91
  /**
76
92
  * Send a CRITICAL log
77
93
  * @param message Log message
78
94
  * @param options Additional options (meta, tags, etc.)
79
95
  */
80
- critical(message: string, options?: LogOptions): Promise<void>;
96
+ critical(type: string, message: string, options?: LogOptions): Promise<void>;
97
+ critical(type: string, options?: LogOptions): Promise<void>;
81
98
  }
82
99
 
83
100
  interface SysWatchConfig {
@@ -90,14 +107,22 @@ declare class SysWatch {
90
107
  private baseUrl;
91
108
  private defaultMeta;
92
109
  private defaultTags;
110
+ private authorized;
93
111
  log: Logs;
94
112
  constructor(config: SysWatchConfig);
113
+ init(): Promise<this>;
114
+ static create(config: SysWatchConfig): Promise<SysWatch>;
95
115
  private request;
96
116
  /**
97
117
  * Send a log entry to SysWatch
98
118
  * @param data Log data
99
119
  */
100
- sendLog(data: CreateLogDto): Promise<any>;
120
+ private sendLog;
121
+ /**
122
+ * Send multiple log entries to SysWatch in batch
123
+ * @param logs Array of log data
124
+ */
125
+ private sendLogBatch;
101
126
  /**
102
127
  * Track a metric value
103
128
  * @param type Metric type key
@@ -106,6 +131,11 @@ declare class SysWatch {
106
131
  * @param options Additional options
107
132
  */
108
133
  trackMetric(type: string, value: number, unit?: string, options?: Omit<CreateMetricDto, "type" | "value" | "unit">): Promise<any>;
134
+ /**
135
+ * Track multiple metric values in batch
136
+ * @param metrics Array of metric data
137
+ */
138
+ trackMetricBatch(metrics: CreateMetricDto[]): Promise<any>;
109
139
  }
110
140
 
111
- export { type CreateLogDto, type CreateMetricDto, LogLevel, SysWatch, type SysWatchConfig };
141
+ export { type CreateLogBatchDto, type CreateLogDto, type CreateMetricBatchDto, type CreateMetricDto, LogLevel, SysWatch, type SysWatchConfig };
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";var o=Object.defineProperty;var p=Object.getOwnPropertyDescriptor;var u=Object.getOwnPropertyNames;var y=Object.prototype.hasOwnProperty;var m=(a,t)=>{for(var e in t)o(a,e,{get:t[e],enumerable:!0})},d=(a,t,e,s)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of u(t))!y.call(a,r)&&r!==e&&o(a,r,{get:()=>t[r],enumerable:!(s=p(t,r))||s.enumerable});return a};var h=a=>d(o({},"__esModule",{value:!0}),a);var f={};m(f,{LogLevel:()=>g,SysWatch:()=>l});module.exports=h(f);var g=(i=>(i.DEBUG="DEBUG",i.INFO="INFO",i.SUCCESS="SUCCESS",i.FAILURE="FAILURE",i.WARN="WARN",i.ERROR="ERROR",i.CRITICAL="CRITICAL",i))(g||{});var n=class{constructor(t){this.sendLog=t}async debug(t,e){return this.sendLog({type:"debug",level:"DEBUG",message:t,...e})}async info(t,e){return this.sendLog({type:"info",level:"INFO",message:t,...e})}async success(t,e){return this.sendLog({type:"success",level:"SUCCESS",message:t,...e})}async failure(t,e){return this.sendLog({type:"failure",level:"FAILURE",message:t,...e})}async warn(t,e){return this.sendLog({type:"warn",level:"WARN",message:t,...e})}async error(t,e){let s={},r={};return e instanceof Error?s={error:{name:e.name,message:e.message,stack:e.stack}}:e&&(r=e),this.sendLog({type:"error",level:"ERROR",message:t,...r,meta:{...s,...r.meta||{}}})}async critical(t,e){return this.sendLog({type:"critical",level:"CRITICAL",message:t,...e})}};var l=class{constructor(t){this.apiKey=t.apiKey,this.baseUrl="https://syswatchapp.discloud.app/v1",this.defaultMeta=t.defaultMeta||{},this.defaultTags=t.defaultTags||[],this.baseUrl.endsWith("/")&&(this.baseUrl=this.baseUrl.slice(0,-1)),this.log=new n(this.sendLog.bind(this))}async request(t,e){try{let s=await fetch(`${this.baseUrl}${t}`,{method:"POST",headers:{"Content-Type":"application/json","x-api-key":this.apiKey,"user-agent":"NodeJS SysWatch SDK "},body:JSON.stringify(e)});if(!s.ok){let r=await s.text();throw new Error(`SysWatch API Error: ${s.status} ${s.statusText} - ${r}`)}return await s.json()}catch(s){throw s}}async sendLog(t){let e={...t,meta:{...this.defaultMeta,...t.meta},tags:[...this.defaultTags,...t.tags||[]]};return this.request("/logs",e)}async trackMetric(t,e,s,r){let c={type:t,value:e,unit:s,...r,meta:{...this.defaultMeta,...r?.meta},tags:[...this.defaultTags,...r?.tags||[]]};return this.request("/metrics",c)}};0&&(module.exports={LogLevel,SysWatch});
1
+ "use strict";var g=Object.defineProperty;var l=Object.getOwnPropertyDescriptor;var u=Object.getOwnPropertyNames;var f=Object.prototype.hasOwnProperty;var y=(o,t)=>{for(var e in t)g(o,e,{get:t[e],enumerable:!0})},h=(o,t,e,s)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of u(t))!f.call(o,i)&&i!==e&&g(o,i,{get:()=>t[i],enumerable:!(s=l(t,i))||s.enumerable});return o};var m=o=>h(g({},"__esModule",{value:!0}),o);var L={};y(L,{LogLevel:()=>p,SysWatch:()=>d});module.exports=m(L);var p=(n=>(n.DEBUG="DEBUG",n.INFO="INFO",n.SUCCESS="SUCCESS",n.FAILURE="FAILURE",n.WARN="WARN",n.ERROR="ERROR",n.CRITICAL="CRITICAL",n))(p||{});var a=class{constructor(t,e){this.sendLog=t;this.sendLogBatch=e}async batch(t){return this.sendLogBatch(t)}async debug(t,e,s){let i,r;return typeof e=="string"?(i=e,r=s):r=e,this.sendLog({level:"DEBUG",type:t,message:i,...r})}async info(t,e,s){let i,r;return typeof e=="string"?(i=e,r=s):r=e,this.sendLog({type:t,level:"INFO",message:i,...r})}async success(t,e,s){let i,r;return typeof e=="string"?(i=e,r=s):r=e,this.sendLog({type:t,level:"SUCCESS",message:i,...r})}async failure(t,e,s){let i,r;return typeof e=="string"?(i=e,r=s):r=e,this.sendLog({type:t,level:"FAILURE",message:i,...r})}async warn(t,e,s){let i,r;return typeof e=="string"?(i=e,r=s):r=e,this.sendLog({type:t,level:"WARN",message:i,...r})}async error(t,e,s){let i,r;typeof e=="string"?(i=e,r=s):r=e;let c={},n={};return r instanceof Error?c={error:{name:r.name,message:r.message,stack:r.stack}}:r&&(n=r),this.sendLog({type:t,level:"ERROR",message:i,...n,meta:{...c,...n.meta||{}}})}async critical(t,e,s){let i,r;return typeof e=="string"?(i=e,r=s):r=e,this.sendLog({type:t,level:"CRITICAL",message:i,...r})}};var d=class o{constructor(t){this.authorized=!1;this.apiKey=t.apiKey,this.baseUrl="https://syswatchapp.discloud.app/v1",this.defaultMeta=t.defaultMeta||{},this.defaultTags=t.defaultTags||[],this.baseUrl.endsWith("/")&&(this.baseUrl=this.baseUrl.slice(0,-1)),this.log=new a(this.sendLog.bind(this),this.sendLogBatch.bind(this))}async init(){try{let t=await fetch(`${this.baseUrl}/systems/validate-api-key/${this.apiKey}`,{method:"GET",headers:{"Content-Type":"application/json","user-agent":"NodeJS SysWatch SDK"}});if(!t.ok)throw new Error("Failed to validate API Key");if(!(await t.json()).valid)throw new Error("Invalid API Key");return this.authorized=!0,this}catch(t){throw this.authorized=!1,new Error(`SysWatch Initialization Error: ${t instanceof Error?t.message:"Unknown error"}`)}}static async create(t){let e=new o(t);return await e.init(),e}async request(t,e){if(!this.authorized){console.warn("SysWatch: API Key not authorized. Request blocked. Make sure to call init() and that the key is valid.");return}try{let s=await fetch(`${this.baseUrl}${t}`,{method:"POST",headers:{"Content-Type":"application/json","x-api-key":this.apiKey,"user-agent":"NodeJS SysWatch SDK"},body:JSON.stringify(e)});if(!s.ok){let i=await s.text();throw new Error(`SysWatch API Error: ${s.status} ${s.statusText} - ${i}`)}return await s.json()}catch(s){throw s}}async sendLog(t){let e={...t,...(this.defaultMeta||t?.meta)&&{meta:{...this.defaultMeta,...t?.meta}},...(this.defaultTags||t?.tags)&&{tags:[...this.defaultTags,...t?.tags||[]]}};return this.request("/logs",e)}async sendLogBatch(t){let e=t.map(s=>({...s,...(this.defaultMeta||s.meta)&&{meta:{...this.defaultMeta,...s.meta}},...(this.defaultTags||s.tags)&&{tags:[...this.defaultTags,...s.tags||[]]}}));return this.request("/logs/batch",{logs:e})}async trackMetric(t,e,s,i){let r={type:t,value:e,unit:s,...i,...(this.defaultMeta||i?.meta)&&{meta:{...this.defaultMeta,...i?.meta}},...(this.defaultTags||i?.tags)&&{tags:[...this.defaultTags,...i?.tags||[]]}};return this.request("/metrics",r)}async trackMetricBatch(t){let e=t.map(s=>({...s,...(this.defaultMeta||s.meta)&&{meta:{...this.defaultMeta,...s.meta}},...(this.defaultTags||s.tags)&&{tags:[...this.defaultTags,...s.tags||[]]}}));return this.request("/metrics/batch",{metrics:e})}};0&&(module.exports={LogLevel,SysWatch});
2
2
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/types.ts","../src/logs.ts","../src/client.ts"],"sourcesContent":["export * from './types';\nexport * from './client';\n","export enum LogLevel {\n DEBUG = 'DEBUG',\n INFO = 'INFO',\n SUCCESS = 'SUCCESS',\n FAILURE = 'FAILURE',\n WARN = 'WARN',\n ERROR = 'ERROR',\n CRITICAL = 'CRITICAL',\n}\n\nexport interface CreateLogDto {\n type: string;\n level: LogLevel;\n message?: string;\n meta?: Record<string, any>;\n environment?: string;\n userId?: string;\n ip?: string;\n timestamp?: Date | string;\n tags?: string[];\n}\n\nexport interface CreateMetricDto {\n type: string;\n value: number;\n meta?: Record<string, any>;\n environment?: string;\n timestamp?: Date | string;\n tags?: string[];\n unit?: string;\n}\n","import { CreateLogDto, LogLevel } from \"./types\";\n\ntype LogOptions = Omit<CreateLogDto, \"level\" | \"message\" | \"type\"> & {\n type?: string;\n};\n\nexport class Logs {\n constructor(private sendLog: (log: CreateLogDto) => Promise<void>) {}\n\n /**\n * Send a DEBUG log\n * @param message Log message\n * @param options Additional options (meta, tags, etc.)\n */\n async debug(message: string, options?: LogOptions) {\n return this.sendLog({\n type: \"debug\",\n level: LogLevel.DEBUG,\n message,\n ...options,\n });\n }\n\n /**\n * Send an INFO log\n * @param message Log message\n * @param options Additional options (meta, tags, etc.)\n */\n async info(message: string, options?: LogOptions) {\n return this.sendLog({\n type: \"info\",\n level: LogLevel.INFO,\n message,\n ...options,\n });\n }\n\n /**\n * Send a SUCCESS log\n * @param message Log message\n * @param options Additional options (meta, tags, etc.)\n */\n async success(message: string, options?: LogOptions) {\n return this.sendLog({\n type: \"success\",\n level: LogLevel.SUCCESS,\n message,\n ...options,\n });\n }\n /**\n * Send a FAILURE log\n * @param message Log message\n * @param options Additional options (meta, tags, etc.)\n */\n async failure(message: string, options?: LogOptions) {\n return this.sendLog({\n type: \"failure\",\n level: LogLevel.FAILURE,\n message,\n ...options,\n });\n }\n\n /**\n * Send a WARN log\n * @param message Log message\n * @param options Additional options (meta, tags, etc.)\n */\n async warn(message: string, options?: LogOptions) {\n return this.sendLog({\n type: \"warn\",\n level: LogLevel.WARN,\n message,\n ...options,\n });\n }\n\n /**\n * Send an ERROR log with smart error handling\n * @param message Log message\n * @param errorOrOptions Error object or options object\n */\n async error(\n message: string,\n errorOrOptions?:\n | Error\n | (Omit<CreateLogDto, \"level\" | \"message\" | \"type\"> & { type?: string })\n ) {\n let meta = {};\n let options: Partial<CreateLogDto> = {};\n\n if (errorOrOptions instanceof Error) {\n meta = {\n error: {\n name: errorOrOptions.name,\n message: errorOrOptions.message,\n stack: errorOrOptions.stack,\n },\n };\n } else if (errorOrOptions) {\n options = errorOrOptions;\n }\n\n return this.sendLog({\n type: \"error\",\n level: LogLevel.ERROR,\n message,\n ...options,\n meta: { ...meta, ...(options.meta || {}) },\n });\n }\n\n /**\n * Send a CRITICAL log\n * @param message Log message\n * @param options Additional options (meta, tags, etc.)\n */\n async critical(message: string, options?: LogOptions) {\n return this.sendLog({\n type: \"critical\",\n level: LogLevel.CRITICAL,\n message,\n ...options,\n });\n }\n}\n","import { Logs } from \"./logs\";\nimport { CreateLogDto, CreateMetricDto } from \"./types\";\n\nexport interface SysWatchConfig {\n apiKey: string;\n defaultMeta?: Record<string, any>;\n defaultTags?: string[];\n}\n\nexport class SysWatch {\n private apiKey: string;\n private baseUrl: string;\n private defaultMeta: Record<string, any>;\n private defaultTags: string[];\n\n public log: Logs;\n\n constructor(config: SysWatchConfig) {\n this.apiKey = config.apiKey;\n this.baseUrl = \"https://syswatchapp.discloud.app/v1\";\n this.defaultMeta = config.defaultMeta || {};\n this.defaultTags = config.defaultTags || [];\n\n if (this.baseUrl.endsWith(\"/\")) {\n this.baseUrl = this.baseUrl.slice(0, -1);\n }\n\n this.log = new Logs(this.sendLog.bind(this));\n }\n\n private async request(path: string, body: any) {\n try {\n const response = await fetch(`${this.baseUrl}${path}`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"x-api-key\": this.apiKey,\n \"user-agent\": \"NodeJS SysWatch SDK \",\n },\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(\n `SysWatch API Error: ${response.status} ${response.statusText} - ${errorText}`\n );\n }\n\n return await response.json();\n } catch (error) {\n // Re-throw the error to let the caller handle it\n throw error;\n }\n }\n\n /**\n * Send a log entry to SysWatch\n * @param data Log data\n */\n async sendLog(data: CreateLogDto) {\n const payload: CreateLogDto = {\n ...data,\n meta: { ...this.defaultMeta, ...data.meta },\n tags: [...this.defaultTags, ...(data.tags || [])],\n };\n return this.request(\"/logs\", payload);\n }\n\n /**\n * Track a metric value\n * @param type Metric type key\n * @param value Metric value\n * @param unit Unit of measurement (optional)\n * @param options Additional options\n */\n async trackMetric(\n type: string,\n value: number,\n unit?: string,\n options?: Omit<CreateMetricDto, \"type\" | \"value\" | \"unit\">\n ) {\n const payload: CreateMetricDto = {\n type,\n value,\n unit,\n ...options,\n meta: { ...this.defaultMeta, ...options?.meta },\n tags: [...this.defaultTags, ...(options?.tags || [])],\n };\n return this.request(\"/metrics\", payload);\n }\n}\n"],"mappings":"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","names":["index_exports","__export","LogLevel","SysWatch","__toCommonJS","LogLevel","Logs","sendLog","message","options","errorOrOptions","meta","SysWatch","config","Logs","path","body","response","errorText","error","data","payload","type","value","unit","options"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/types.ts","../src/logs.ts","../src/client.ts"],"sourcesContent":["export * from './types';\nexport * from './client';\n","export enum LogLevel {\n DEBUG = 'DEBUG',\n INFO = 'INFO',\n SUCCESS = 'SUCCESS',\n FAILURE = 'FAILURE',\n WARN = 'WARN',\n ERROR = 'ERROR',\n CRITICAL = 'CRITICAL',\n}\n\nexport interface CreateLogDto {\n type: string;\n level: LogLevel;\n message?: string;\n meta?: Record<string, any>;\n environment?: string;\n userId?: string;\n ip?: string;\n timestamp?: Date | string;\n tags?: string[];\n}\n\nexport interface CreateMetricDto {\n type: string;\n value: number;\n meta?: Record<string, any>;\n environment?: string;\n timestamp?: Date | string;\n tags?: string[];\n unit?: string;\n}\n\nexport interface CreateLogBatchDto {\n logs: CreateLogDto[];\n}\n\nexport interface CreateMetricBatchDto {\n metrics: CreateMetricDto[];\n}\n","import { CreateLogDto, LogLevel } from \"./types\";\n\ntype LogOptions = Omit<CreateLogDto, \"level\" | \"message\" | \"type\"> & {\n type?: string;\n};\n\nexport class Logs {\n constructor(\n private sendLog: (log: CreateLogDto) => Promise<void>,\n private sendLogBatch: (logs: CreateLogDto[]) => Promise<void>,\n ) {}\n\n /**\n * Send multiple logs in batch\n * @param logs Array of log entries\n */\n async batch(logs: CreateLogDto[]) {\n return this.sendLogBatch(logs);\n }\n\n /**\n * Send a DEBUG log\n * @param message Log message\n * @param options Additional options (meta, tags, etc.)\n */\n async debug(type: string, message: string, options?: LogOptions): Promise<void>;\n async debug(type: string, options?: LogOptions): Promise<void>;\n async debug(\n type: string,\n messageOrOptions?: string | LogOptions,\n options?: LogOptions,\n ) {\n let message: string | undefined;\n let finalOptions: LogOptions | undefined;\n\n if (typeof messageOrOptions === \"string\") {\n message = messageOrOptions;\n finalOptions = options;\n } else {\n finalOptions = messageOrOptions;\n }\n\n return this.sendLog({\n level: LogLevel.DEBUG,\n type,\n message,\n ...finalOptions,\n });\n }\n\n /**\n * Send an INFO log\n * @param message Log message\n * @param options Additional options (meta, tags, etc.)\n */\n async info(type: string, message: string, options?: LogOptions): Promise<void>;\n async info(type: string, options?: LogOptions): Promise<void>;\n async info(\n type: string,\n messageOrOptions?: string | LogOptions,\n options?: LogOptions,\n ) {\n let message: string | undefined;\n let finalOptions: LogOptions | undefined;\n\n if (typeof messageOrOptions === \"string\") {\n message = messageOrOptions;\n finalOptions = options;\n } else {\n finalOptions = messageOrOptions;\n }\n\n return this.sendLog({\n type,\n level: LogLevel.INFO,\n message,\n ...finalOptions,\n });\n }\n\n /**\n * Send a SUCCESS log\n * @param message Log message\n * @param options Additional options (meta, tags, etc.)\n */\n async success(type: string, message: string, options?: LogOptions): Promise<void>;\n async success(type: string, options?: LogOptions): Promise<void>;\n async success(\n type: string,\n messageOrOptions?: string | LogOptions,\n options?: LogOptions,\n ) {\n let message: string | undefined;\n let finalOptions: LogOptions | undefined;\n\n if (typeof messageOrOptions === \"string\") {\n message = messageOrOptions;\n finalOptions = options;\n } else {\n finalOptions = messageOrOptions;\n }\n\n return this.sendLog({\n type,\n level: LogLevel.SUCCESS,\n message,\n ...finalOptions,\n });\n }\n /**\n * Send a FAILURE log\n * @param message Log message\n * @param options Additional options (meta, tags, etc.)\n */\n async failure(type: string, message: string, options?: LogOptions): Promise<void>;\n async failure(type: string, options?: LogOptions): Promise<void>;\n async failure(\n type: string,\n messageOrOptions?: string | LogOptions,\n options?: LogOptions,\n ) {\n let message: string | undefined;\n let finalOptions: LogOptions | undefined;\n\n if (typeof messageOrOptions === \"string\") {\n message = messageOrOptions;\n finalOptions = options;\n } else {\n finalOptions = messageOrOptions;\n }\n\n return this.sendLog({\n type,\n level: LogLevel.FAILURE,\n message,\n ...finalOptions,\n });\n }\n\n /**\n * Send a WARN log\n * @param message Log message\n * @param options Additional options (meta, tags, etc.)\n */\n async warn(type: string, message: string, options?: LogOptions): Promise<void>;\n async warn(type: string, options?: LogOptions): Promise<void>;\n async warn(\n type: string,\n messageOrOptions?: string | LogOptions,\n options?: LogOptions,\n ) {\n let message: string | undefined;\n let finalOptions: LogOptions | undefined;\n\n if (typeof messageOrOptions === \"string\") {\n message = messageOrOptions;\n finalOptions = options;\n } else {\n finalOptions = messageOrOptions;\n }\n\n return this.sendLog({\n type,\n level: LogLevel.WARN,\n message,\n ...finalOptions,\n });\n }\n\n /**\n * Send an ERROR log with smart error handling\n * @param message Log message\n * @param errorOrOptions Error object or options object\n */\n async error(\n type: string,\n message: string,\n errorOrOptions?: Error | LogOptions,\n ): Promise<void>;\n async error(type: string, errorOrOptions?: Error | LogOptions): Promise<void>;\n async error(\n type: string,\n messageOrErrorOrOptions?: string | Error | LogOptions,\n errorOrOptions?: Error | LogOptions,\n ) {\n let message: string | undefined;\n let finalErrorOrOptions: Error | LogOptions | undefined;\n\n if (typeof messageOrErrorOrOptions === \"string\") {\n message = messageOrErrorOrOptions;\n finalErrorOrOptions = errorOrOptions;\n } else {\n finalErrorOrOptions = messageOrErrorOrOptions as Error | LogOptions;\n }\n\n let meta = {};\n let options: Partial<CreateLogDto> = {};\n\n if (finalErrorOrOptions instanceof Error) {\n meta = {\n error: {\n name: finalErrorOrOptions.name,\n message: finalErrorOrOptions.message,\n stack: finalErrorOrOptions.stack,\n },\n };\n } else if (finalErrorOrOptions) {\n options = finalErrorOrOptions;\n }\n\n return this.sendLog({\n type,\n level: LogLevel.ERROR,\n message,\n ...options,\n meta: { ...meta, ...(options.meta || {}) },\n });\n }\n\n /**\n * Send a CRITICAL log\n * @param message Log message\n * @param options Additional options (meta, tags, etc.)\n */\n async critical(type: string, message: string, options?: LogOptions): Promise<void>;\n async critical(type: string, options?: LogOptions): Promise<void>;\n async critical(\n type: string,\n messageOrOptions?: string | LogOptions,\n options?: LogOptions,\n ) {\n let message: string | undefined;\n let finalOptions: LogOptions | undefined;\n\n if (typeof messageOrOptions === \"string\") {\n message = messageOrOptions;\n finalOptions = options;\n } else {\n finalOptions = messageOrOptions;\n }\n\n return this.sendLog({\n type,\n level: LogLevel.CRITICAL,\n message,\n ...finalOptions,\n });\n }\n}\n","import { Logs } from \"./logs\";\nimport { CreateLogDto, CreateMetricDto } from \"./types\";\n\nexport interface SysWatchConfig {\n apiKey: string;\n defaultMeta?: Record<string, any>;\n defaultTags?: string[];\n}\n\nexport class SysWatch {\n private apiKey: string;\n private baseUrl: string;\n private defaultMeta: Record<string, any>;\n private defaultTags: string[];\n private authorized: boolean = false;\n\n public log: Logs;\n\n constructor(config: SysWatchConfig) {\n this.apiKey = config.apiKey;\n this.baseUrl = \"https://syswatchapp.discloud.app/v1\";\n this.defaultMeta = config.defaultMeta || {};\n this.defaultTags = config.defaultTags || [];\n\n if (this.baseUrl.endsWith(\"/\")) {\n this.baseUrl = this.baseUrl.slice(0, -1);\n }\n\n this.log = new Logs(this.sendLog.bind(this), this.sendLogBatch.bind(this));\n }\n\n async init() {\n try {\n const response = await fetch(\n `${this.baseUrl}/systems/validate-api-key/${this.apiKey}`,\n {\n method: \"GET\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"user-agent\": \"NodeJS SysWatch SDK\",\n },\n },\n );\n\n if (!response.ok) {\n throw new Error(\"Failed to validate API Key\");\n }\n\n const data = await response.json();\n if (!data.valid) {\n throw new Error(\"Invalid API Key\");\n }\n\n this.authorized = true;\n\n return this;\n } catch (error) {\n this.authorized = false;\n throw new Error(\n `SysWatch Initialization Error: ${\n error instanceof Error ? error.message : \"Unknown error\"\n }`,\n );\n }\n }\n\n static async create(config: SysWatchConfig) {\n const instance = new SysWatch(config);\n await instance.init();\n return instance;\n }\n\n private async request(path: string, body: any) {\n if (!this.authorized) {\n console.warn(\n \"SysWatch: API Key not authorized. Request blocked. Make sure to call init() and that the key is valid.\",\n );\n return;\n }\n\n try {\n const response = await fetch(`${this.baseUrl}${path}`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"x-api-key\": this.apiKey,\n \"user-agent\": \"NodeJS SysWatch SDK\",\n },\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(\n `SysWatch API Error: ${response.status} ${response.statusText} - ${errorText}`,\n );\n }\n\n return await response.json();\n } catch (error) {\n throw error;\n }\n }\n\n /**\n * Send a log entry to SysWatch\n * @param data Log data\n */\n private async sendLog(data: CreateLogDto) {\n const payload: CreateLogDto = {\n ...data,\n ...((this.defaultMeta || data?.meta) && {\n meta: { ...this.defaultMeta, ...data?.meta },\n }),\n ...((this.defaultTags || data?.tags) && {\n tags: [...this.defaultTags, ...(data?.tags || [])],\n }),\n };\n return this.request(\"/logs\", payload);\n }\n\n /**\n * Send multiple log entries to SysWatch in batch\n * @param logs Array of log data\n */\n private async sendLogBatch(logs: CreateLogDto[]) {\n const processedLogs = logs.map((log) => ({\n ...log,\n ...((this.defaultMeta || log.meta) && {\n meta: { ...this.defaultMeta, ...log.meta },\n }),\n ...((this.defaultTags || log.tags) && {\n tags: [...this.defaultTags, ...(log.tags || [])],\n }),\n }));\n\n return this.request(\"/logs/batch\", { logs: processedLogs });\n }\n\n /**\n * Track a metric value\n * @param type Metric type key\n * @param value Metric value\n * @param unit Unit of measurement (optional)\n * @param options Additional options\n */\n async trackMetric(\n type: string,\n value: number,\n unit?: string,\n options?: Omit<CreateMetricDto, \"type\" | \"value\" | \"unit\">,\n ) {\n const payload: CreateMetricDto = {\n type,\n value,\n unit,\n ...options,\n ...((this.defaultMeta || options?.meta) && {\n meta: { ...this.defaultMeta, ...options?.meta },\n }),\n ...((this.defaultTags || options?.tags) && {\n tags: [...this.defaultTags, ...(options?.tags || [])],\n }),\n };\n return this.request(\"/metrics\", payload);\n }\n\n /**\n * Track multiple metric values in batch\n * @param metrics Array of metric data\n */\n async trackMetricBatch(metrics: CreateMetricDto[]) {\n const processedMetrics = metrics.map((metric) => ({\n ...metric,\n ...((this.defaultMeta || metric.meta) && {\n meta: { ...this.defaultMeta, ...metric.meta },\n }),\n ...((this.defaultTags || metric.tags) && {\n tags: [...this.defaultTags, ...(metric.tags || [])],\n }),\n }));\n\n return this.request(\"/metrics/batch\", { metrics: processedMetrics });\n }\n}\n"],"mappings":"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","names":["index_exports","__export","LogLevel","SysWatch","__toCommonJS","LogLevel","Logs","sendLog","sendLogBatch","logs","type","messageOrOptions","options","message","finalOptions","messageOrErrorOrOptions","errorOrOptions","finalErrorOrOptions","meta","SysWatch","_SysWatch","config","Logs","response","error","instance","path","body","errorText","data","payload","logs","processedLogs","log","type","value","unit","options","metrics","processedMetrics","metric"]}
package/dist/index.mjs CHANGED
@@ -1,2 +1,2 @@
1
- var n=(a=>(a.DEBUG="DEBUG",a.INFO="INFO",a.SUCCESS="SUCCESS",a.FAILURE="FAILURE",a.WARN="WARN",a.ERROR="ERROR",a.CRITICAL="CRITICAL",a))(n||{});var i=class{constructor(t){this.sendLog=t}async debug(t,e){return this.sendLog({type:"debug",level:"DEBUG",message:t,...e})}async info(t,e){return this.sendLog({type:"info",level:"INFO",message:t,...e})}async success(t,e){return this.sendLog({type:"success",level:"SUCCESS",message:t,...e})}async failure(t,e){return this.sendLog({type:"failure",level:"FAILURE",message:t,...e})}async warn(t,e){return this.sendLog({type:"warn",level:"WARN",message:t,...e})}async error(t,e){let s={},r={};return e instanceof Error?s={error:{name:e.name,message:e.message,stack:e.stack}}:e&&(r=e),this.sendLog({type:"error",level:"ERROR",message:t,...r,meta:{...s,...r.meta||{}}})}async critical(t,e){return this.sendLog({type:"critical",level:"CRITICAL",message:t,...e})}};var o=class{constructor(t){this.apiKey=t.apiKey,this.baseUrl="https://syswatchapp.discloud.app/v1",this.defaultMeta=t.defaultMeta||{},this.defaultTags=t.defaultTags||[],this.baseUrl.endsWith("/")&&(this.baseUrl=this.baseUrl.slice(0,-1)),this.log=new i(this.sendLog.bind(this))}async request(t,e){try{let s=await fetch(`${this.baseUrl}${t}`,{method:"POST",headers:{"Content-Type":"application/json","x-api-key":this.apiKey,"user-agent":"NodeJS SysWatch SDK "},body:JSON.stringify(e)});if(!s.ok){let r=await s.text();throw new Error(`SysWatch API Error: ${s.status} ${s.statusText} - ${r}`)}return await s.json()}catch(s){throw s}}async sendLog(t){let e={...t,meta:{...this.defaultMeta,...t.meta},tags:[...this.defaultTags,...t.tags||[]]};return this.request("/logs",e)}async trackMetric(t,e,s,r){let l={type:t,value:e,unit:s,...r,meta:{...this.defaultMeta,...r?.meta},tags:[...this.defaultTags,...r?.tags||[]]};return this.request("/metrics",l)}};export{n as LogLevel,o as SysWatch};
1
+ var p=(n=>(n.DEBUG="DEBUG",n.INFO="INFO",n.SUCCESS="SUCCESS",n.FAILURE="FAILURE",n.WARN="WARN",n.ERROR="ERROR",n.CRITICAL="CRITICAL",n))(p||{});var o=class{constructor(t,e){this.sendLog=t;this.sendLogBatch=e}async batch(t){return this.sendLogBatch(t)}async debug(t,e,s){let r,i;return typeof e=="string"?(r=e,i=s):i=e,this.sendLog({level:"DEBUG",type:t,message:r,...i})}async info(t,e,s){let r,i;return typeof e=="string"?(r=e,i=s):i=e,this.sendLog({type:t,level:"INFO",message:r,...i})}async success(t,e,s){let r,i;return typeof e=="string"?(r=e,i=s):i=e,this.sendLog({type:t,level:"SUCCESS",message:r,...i})}async failure(t,e,s){let r,i;return typeof e=="string"?(r=e,i=s):i=e,this.sendLog({type:t,level:"FAILURE",message:r,...i})}async warn(t,e,s){let r,i;return typeof e=="string"?(r=e,i=s):i=e,this.sendLog({type:t,level:"WARN",message:r,...i})}async error(t,e,s){let r,i;typeof e=="string"?(r=e,i=s):i=e;let g={},n={};return i instanceof Error?g={error:{name:i.name,message:i.message,stack:i.stack}}:i&&(n=i),this.sendLog({type:t,level:"ERROR",message:r,...n,meta:{...g,...n.meta||{}}})}async critical(t,e,s){let r,i;return typeof e=="string"?(r=e,i=s):i=e,this.sendLog({type:t,level:"CRITICAL",message:r,...i})}};var d=class a{constructor(t){this.authorized=!1;this.apiKey=t.apiKey,this.baseUrl="https://syswatchapp.discloud.app/v1",this.defaultMeta=t.defaultMeta||{},this.defaultTags=t.defaultTags||[],this.baseUrl.endsWith("/")&&(this.baseUrl=this.baseUrl.slice(0,-1)),this.log=new o(this.sendLog.bind(this),this.sendLogBatch.bind(this))}async init(){try{let t=await fetch(`${this.baseUrl}/systems/validate-api-key/${this.apiKey}`,{method:"GET",headers:{"Content-Type":"application/json","user-agent":"NodeJS SysWatch SDK"}});if(!t.ok)throw new Error("Failed to validate API Key");if(!(await t.json()).valid)throw new Error("Invalid API Key");return this.authorized=!0,this}catch(t){throw this.authorized=!1,new Error(`SysWatch Initialization Error: ${t instanceof Error?t.message:"Unknown error"}`)}}static async create(t){let e=new a(t);return await e.init(),e}async request(t,e){if(!this.authorized){console.warn("SysWatch: API Key not authorized. Request blocked. Make sure to call init() and that the key is valid.");return}try{let s=await fetch(`${this.baseUrl}${t}`,{method:"POST",headers:{"Content-Type":"application/json","x-api-key":this.apiKey,"user-agent":"NodeJS SysWatch SDK"},body:JSON.stringify(e)});if(!s.ok){let r=await s.text();throw new Error(`SysWatch API Error: ${s.status} ${s.statusText} - ${r}`)}return await s.json()}catch(s){throw s}}async sendLog(t){let e={...t,...(this.defaultMeta||t?.meta)&&{meta:{...this.defaultMeta,...t?.meta}},...(this.defaultTags||t?.tags)&&{tags:[...this.defaultTags,...t?.tags||[]]}};return this.request("/logs",e)}async sendLogBatch(t){let e=t.map(s=>({...s,...(this.defaultMeta||s.meta)&&{meta:{...this.defaultMeta,...s.meta}},...(this.defaultTags||s.tags)&&{tags:[...this.defaultTags,...s.tags||[]]}}));return this.request("/logs/batch",{logs:e})}async trackMetric(t,e,s,r){let i={type:t,value:e,unit:s,...r,...(this.defaultMeta||r?.meta)&&{meta:{...this.defaultMeta,...r?.meta}},...(this.defaultTags||r?.tags)&&{tags:[...this.defaultTags,...r?.tags||[]]}};return this.request("/metrics",i)}async trackMetricBatch(t){let e=t.map(s=>({...s,...(this.defaultMeta||s.meta)&&{meta:{...this.defaultMeta,...s.meta}},...(this.defaultTags||s.tags)&&{tags:[...this.defaultTags,...s.tags||[]]}}));return this.request("/metrics/batch",{metrics:e})}};export{p as LogLevel,d as SysWatch};
2
2
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/types.ts","../src/logs.ts","../src/client.ts"],"sourcesContent":["export enum LogLevel {\n DEBUG = 'DEBUG',\n INFO = 'INFO',\n SUCCESS = 'SUCCESS',\n FAILURE = 'FAILURE',\n WARN = 'WARN',\n ERROR = 'ERROR',\n CRITICAL = 'CRITICAL',\n}\n\nexport interface CreateLogDto {\n type: string;\n level: LogLevel;\n message?: string;\n meta?: Record<string, any>;\n environment?: string;\n userId?: string;\n ip?: string;\n timestamp?: Date | string;\n tags?: string[];\n}\n\nexport interface CreateMetricDto {\n type: string;\n value: number;\n meta?: Record<string, any>;\n environment?: string;\n timestamp?: Date | string;\n tags?: string[];\n unit?: string;\n}\n","import { CreateLogDto, LogLevel } from \"./types\";\n\ntype LogOptions = Omit<CreateLogDto, \"level\" | \"message\" | \"type\"> & {\n type?: string;\n};\n\nexport class Logs {\n constructor(private sendLog: (log: CreateLogDto) => Promise<void>) {}\n\n /**\n * Send a DEBUG log\n * @param message Log message\n * @param options Additional options (meta, tags, etc.)\n */\n async debug(message: string, options?: LogOptions) {\n return this.sendLog({\n type: \"debug\",\n level: LogLevel.DEBUG,\n message,\n ...options,\n });\n }\n\n /**\n * Send an INFO log\n * @param message Log message\n * @param options Additional options (meta, tags, etc.)\n */\n async info(message: string, options?: LogOptions) {\n return this.sendLog({\n type: \"info\",\n level: LogLevel.INFO,\n message,\n ...options,\n });\n }\n\n /**\n * Send a SUCCESS log\n * @param message Log message\n * @param options Additional options (meta, tags, etc.)\n */\n async success(message: string, options?: LogOptions) {\n return this.sendLog({\n type: \"success\",\n level: LogLevel.SUCCESS,\n message,\n ...options,\n });\n }\n /**\n * Send a FAILURE log\n * @param message Log message\n * @param options Additional options (meta, tags, etc.)\n */\n async failure(message: string, options?: LogOptions) {\n return this.sendLog({\n type: \"failure\",\n level: LogLevel.FAILURE,\n message,\n ...options,\n });\n }\n\n /**\n * Send a WARN log\n * @param message Log message\n * @param options Additional options (meta, tags, etc.)\n */\n async warn(message: string, options?: LogOptions) {\n return this.sendLog({\n type: \"warn\",\n level: LogLevel.WARN,\n message,\n ...options,\n });\n }\n\n /**\n * Send an ERROR log with smart error handling\n * @param message Log message\n * @param errorOrOptions Error object or options object\n */\n async error(\n message: string,\n errorOrOptions?:\n | Error\n | (Omit<CreateLogDto, \"level\" | \"message\" | \"type\"> & { type?: string })\n ) {\n let meta = {};\n let options: Partial<CreateLogDto> = {};\n\n if (errorOrOptions instanceof Error) {\n meta = {\n error: {\n name: errorOrOptions.name,\n message: errorOrOptions.message,\n stack: errorOrOptions.stack,\n },\n };\n } else if (errorOrOptions) {\n options = errorOrOptions;\n }\n\n return this.sendLog({\n type: \"error\",\n level: LogLevel.ERROR,\n message,\n ...options,\n meta: { ...meta, ...(options.meta || {}) },\n });\n }\n\n /**\n * Send a CRITICAL log\n * @param message Log message\n * @param options Additional options (meta, tags, etc.)\n */\n async critical(message: string, options?: LogOptions) {\n return this.sendLog({\n type: \"critical\",\n level: LogLevel.CRITICAL,\n message,\n ...options,\n });\n }\n}\n","import { Logs } from \"./logs\";\nimport { CreateLogDto, CreateMetricDto } from \"./types\";\n\nexport interface SysWatchConfig {\n apiKey: string;\n defaultMeta?: Record<string, any>;\n defaultTags?: string[];\n}\n\nexport class SysWatch {\n private apiKey: string;\n private baseUrl: string;\n private defaultMeta: Record<string, any>;\n private defaultTags: string[];\n\n public log: Logs;\n\n constructor(config: SysWatchConfig) {\n this.apiKey = config.apiKey;\n this.baseUrl = \"https://syswatchapp.discloud.app/v1\";\n this.defaultMeta = config.defaultMeta || {};\n this.defaultTags = config.defaultTags || [];\n\n if (this.baseUrl.endsWith(\"/\")) {\n this.baseUrl = this.baseUrl.slice(0, -1);\n }\n\n this.log = new Logs(this.sendLog.bind(this));\n }\n\n private async request(path: string, body: any) {\n try {\n const response = await fetch(`${this.baseUrl}${path}`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"x-api-key\": this.apiKey,\n \"user-agent\": \"NodeJS SysWatch SDK \",\n },\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(\n `SysWatch API Error: ${response.status} ${response.statusText} - ${errorText}`\n );\n }\n\n return await response.json();\n } catch (error) {\n // Re-throw the error to let the caller handle it\n throw error;\n }\n }\n\n /**\n * Send a log entry to SysWatch\n * @param data Log data\n */\n async sendLog(data: CreateLogDto) {\n const payload: CreateLogDto = {\n ...data,\n meta: { ...this.defaultMeta, ...data.meta },\n tags: [...this.defaultTags, ...(data.tags || [])],\n };\n return this.request(\"/logs\", payload);\n }\n\n /**\n * Track a metric value\n * @param type Metric type key\n * @param value Metric value\n * @param unit Unit of measurement (optional)\n * @param options Additional options\n */\n async trackMetric(\n type: string,\n value: number,\n unit?: string,\n options?: Omit<CreateMetricDto, \"type\" | \"value\" | \"unit\">\n ) {\n const payload: CreateMetricDto = {\n type,\n value,\n unit,\n ...options,\n meta: { ...this.defaultMeta, ...options?.meta },\n tags: [...this.defaultTags, ...(options?.tags || [])],\n };\n return this.request(\"/metrics\", payload);\n }\n}\n"],"mappings":"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","names":["LogLevel","Logs","sendLog","message","options","errorOrOptions","meta","SysWatch","config","Logs","path","body","response","errorText","error","data","payload","type","value","unit","options"]}
1
+ {"version":3,"sources":["../src/types.ts","../src/logs.ts","../src/client.ts"],"sourcesContent":["export enum LogLevel {\n DEBUG = 'DEBUG',\n INFO = 'INFO',\n SUCCESS = 'SUCCESS',\n FAILURE = 'FAILURE',\n WARN = 'WARN',\n ERROR = 'ERROR',\n CRITICAL = 'CRITICAL',\n}\n\nexport interface CreateLogDto {\n type: string;\n level: LogLevel;\n message?: string;\n meta?: Record<string, any>;\n environment?: string;\n userId?: string;\n ip?: string;\n timestamp?: Date | string;\n tags?: string[];\n}\n\nexport interface CreateMetricDto {\n type: string;\n value: number;\n meta?: Record<string, any>;\n environment?: string;\n timestamp?: Date | string;\n tags?: string[];\n unit?: string;\n}\n\nexport interface CreateLogBatchDto {\n logs: CreateLogDto[];\n}\n\nexport interface CreateMetricBatchDto {\n metrics: CreateMetricDto[];\n}\n","import { CreateLogDto, LogLevel } from \"./types\";\n\ntype LogOptions = Omit<CreateLogDto, \"level\" | \"message\" | \"type\"> & {\n type?: string;\n};\n\nexport class Logs {\n constructor(\n private sendLog: (log: CreateLogDto) => Promise<void>,\n private sendLogBatch: (logs: CreateLogDto[]) => Promise<void>,\n ) {}\n\n /**\n * Send multiple logs in batch\n * @param logs Array of log entries\n */\n async batch(logs: CreateLogDto[]) {\n return this.sendLogBatch(logs);\n }\n\n /**\n * Send a DEBUG log\n * @param message Log message\n * @param options Additional options (meta, tags, etc.)\n */\n async debug(type: string, message: string, options?: LogOptions): Promise<void>;\n async debug(type: string, options?: LogOptions): Promise<void>;\n async debug(\n type: string,\n messageOrOptions?: string | LogOptions,\n options?: LogOptions,\n ) {\n let message: string | undefined;\n let finalOptions: LogOptions | undefined;\n\n if (typeof messageOrOptions === \"string\") {\n message = messageOrOptions;\n finalOptions = options;\n } else {\n finalOptions = messageOrOptions;\n }\n\n return this.sendLog({\n level: LogLevel.DEBUG,\n type,\n message,\n ...finalOptions,\n });\n }\n\n /**\n * Send an INFO log\n * @param message Log message\n * @param options Additional options (meta, tags, etc.)\n */\n async info(type: string, message: string, options?: LogOptions): Promise<void>;\n async info(type: string, options?: LogOptions): Promise<void>;\n async info(\n type: string,\n messageOrOptions?: string | LogOptions,\n options?: LogOptions,\n ) {\n let message: string | undefined;\n let finalOptions: LogOptions | undefined;\n\n if (typeof messageOrOptions === \"string\") {\n message = messageOrOptions;\n finalOptions = options;\n } else {\n finalOptions = messageOrOptions;\n }\n\n return this.sendLog({\n type,\n level: LogLevel.INFO,\n message,\n ...finalOptions,\n });\n }\n\n /**\n * Send a SUCCESS log\n * @param message Log message\n * @param options Additional options (meta, tags, etc.)\n */\n async success(type: string, message: string, options?: LogOptions): Promise<void>;\n async success(type: string, options?: LogOptions): Promise<void>;\n async success(\n type: string,\n messageOrOptions?: string | LogOptions,\n options?: LogOptions,\n ) {\n let message: string | undefined;\n let finalOptions: LogOptions | undefined;\n\n if (typeof messageOrOptions === \"string\") {\n message = messageOrOptions;\n finalOptions = options;\n } else {\n finalOptions = messageOrOptions;\n }\n\n return this.sendLog({\n type,\n level: LogLevel.SUCCESS,\n message,\n ...finalOptions,\n });\n }\n /**\n * Send a FAILURE log\n * @param message Log message\n * @param options Additional options (meta, tags, etc.)\n */\n async failure(type: string, message: string, options?: LogOptions): Promise<void>;\n async failure(type: string, options?: LogOptions): Promise<void>;\n async failure(\n type: string,\n messageOrOptions?: string | LogOptions,\n options?: LogOptions,\n ) {\n let message: string | undefined;\n let finalOptions: LogOptions | undefined;\n\n if (typeof messageOrOptions === \"string\") {\n message = messageOrOptions;\n finalOptions = options;\n } else {\n finalOptions = messageOrOptions;\n }\n\n return this.sendLog({\n type,\n level: LogLevel.FAILURE,\n message,\n ...finalOptions,\n });\n }\n\n /**\n * Send a WARN log\n * @param message Log message\n * @param options Additional options (meta, tags, etc.)\n */\n async warn(type: string, message: string, options?: LogOptions): Promise<void>;\n async warn(type: string, options?: LogOptions): Promise<void>;\n async warn(\n type: string,\n messageOrOptions?: string | LogOptions,\n options?: LogOptions,\n ) {\n let message: string | undefined;\n let finalOptions: LogOptions | undefined;\n\n if (typeof messageOrOptions === \"string\") {\n message = messageOrOptions;\n finalOptions = options;\n } else {\n finalOptions = messageOrOptions;\n }\n\n return this.sendLog({\n type,\n level: LogLevel.WARN,\n message,\n ...finalOptions,\n });\n }\n\n /**\n * Send an ERROR log with smart error handling\n * @param message Log message\n * @param errorOrOptions Error object or options object\n */\n async error(\n type: string,\n message: string,\n errorOrOptions?: Error | LogOptions,\n ): Promise<void>;\n async error(type: string, errorOrOptions?: Error | LogOptions): Promise<void>;\n async error(\n type: string,\n messageOrErrorOrOptions?: string | Error | LogOptions,\n errorOrOptions?: Error | LogOptions,\n ) {\n let message: string | undefined;\n let finalErrorOrOptions: Error | LogOptions | undefined;\n\n if (typeof messageOrErrorOrOptions === \"string\") {\n message = messageOrErrorOrOptions;\n finalErrorOrOptions = errorOrOptions;\n } else {\n finalErrorOrOptions = messageOrErrorOrOptions as Error | LogOptions;\n }\n\n let meta = {};\n let options: Partial<CreateLogDto> = {};\n\n if (finalErrorOrOptions instanceof Error) {\n meta = {\n error: {\n name: finalErrorOrOptions.name,\n message: finalErrorOrOptions.message,\n stack: finalErrorOrOptions.stack,\n },\n };\n } else if (finalErrorOrOptions) {\n options = finalErrorOrOptions;\n }\n\n return this.sendLog({\n type,\n level: LogLevel.ERROR,\n message,\n ...options,\n meta: { ...meta, ...(options.meta || {}) },\n });\n }\n\n /**\n * Send a CRITICAL log\n * @param message Log message\n * @param options Additional options (meta, tags, etc.)\n */\n async critical(type: string, message: string, options?: LogOptions): Promise<void>;\n async critical(type: string, options?: LogOptions): Promise<void>;\n async critical(\n type: string,\n messageOrOptions?: string | LogOptions,\n options?: LogOptions,\n ) {\n let message: string | undefined;\n let finalOptions: LogOptions | undefined;\n\n if (typeof messageOrOptions === \"string\") {\n message = messageOrOptions;\n finalOptions = options;\n } else {\n finalOptions = messageOrOptions;\n }\n\n return this.sendLog({\n type,\n level: LogLevel.CRITICAL,\n message,\n ...finalOptions,\n });\n }\n}\n","import { Logs } from \"./logs\";\nimport { CreateLogDto, CreateMetricDto } from \"./types\";\n\nexport interface SysWatchConfig {\n apiKey: string;\n defaultMeta?: Record<string, any>;\n defaultTags?: string[];\n}\n\nexport class SysWatch {\n private apiKey: string;\n private baseUrl: string;\n private defaultMeta: Record<string, any>;\n private defaultTags: string[];\n private authorized: boolean = false;\n\n public log: Logs;\n\n constructor(config: SysWatchConfig) {\n this.apiKey = config.apiKey;\n this.baseUrl = \"https://syswatchapp.discloud.app/v1\";\n this.defaultMeta = config.defaultMeta || {};\n this.defaultTags = config.defaultTags || [];\n\n if (this.baseUrl.endsWith(\"/\")) {\n this.baseUrl = this.baseUrl.slice(0, -1);\n }\n\n this.log = new Logs(this.sendLog.bind(this), this.sendLogBatch.bind(this));\n }\n\n async init() {\n try {\n const response = await fetch(\n `${this.baseUrl}/systems/validate-api-key/${this.apiKey}`,\n {\n method: \"GET\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"user-agent\": \"NodeJS SysWatch SDK\",\n },\n },\n );\n\n if (!response.ok) {\n throw new Error(\"Failed to validate API Key\");\n }\n\n const data = await response.json();\n if (!data.valid) {\n throw new Error(\"Invalid API Key\");\n }\n\n this.authorized = true;\n\n return this;\n } catch (error) {\n this.authorized = false;\n throw new Error(\n `SysWatch Initialization Error: ${\n error instanceof Error ? error.message : \"Unknown error\"\n }`,\n );\n }\n }\n\n static async create(config: SysWatchConfig) {\n const instance = new SysWatch(config);\n await instance.init();\n return instance;\n }\n\n private async request(path: string, body: any) {\n if (!this.authorized) {\n console.warn(\n \"SysWatch: API Key not authorized. Request blocked. Make sure to call init() and that the key is valid.\",\n );\n return;\n }\n\n try {\n const response = await fetch(`${this.baseUrl}${path}`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"x-api-key\": this.apiKey,\n \"user-agent\": \"NodeJS SysWatch SDK\",\n },\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(\n `SysWatch API Error: ${response.status} ${response.statusText} - ${errorText}`,\n );\n }\n\n return await response.json();\n } catch (error) {\n throw error;\n }\n }\n\n /**\n * Send a log entry to SysWatch\n * @param data Log data\n */\n private async sendLog(data: CreateLogDto) {\n const payload: CreateLogDto = {\n ...data,\n ...((this.defaultMeta || data?.meta) && {\n meta: { ...this.defaultMeta, ...data?.meta },\n }),\n ...((this.defaultTags || data?.tags) && {\n tags: [...this.defaultTags, ...(data?.tags || [])],\n }),\n };\n return this.request(\"/logs\", payload);\n }\n\n /**\n * Send multiple log entries to SysWatch in batch\n * @param logs Array of log data\n */\n private async sendLogBatch(logs: CreateLogDto[]) {\n const processedLogs = logs.map((log) => ({\n ...log,\n ...((this.defaultMeta || log.meta) && {\n meta: { ...this.defaultMeta, ...log.meta },\n }),\n ...((this.defaultTags || log.tags) && {\n tags: [...this.defaultTags, ...(log.tags || [])],\n }),\n }));\n\n return this.request(\"/logs/batch\", { logs: processedLogs });\n }\n\n /**\n * Track a metric value\n * @param type Metric type key\n * @param value Metric value\n * @param unit Unit of measurement (optional)\n * @param options Additional options\n */\n async trackMetric(\n type: string,\n value: number,\n unit?: string,\n options?: Omit<CreateMetricDto, \"type\" | \"value\" | \"unit\">,\n ) {\n const payload: CreateMetricDto = {\n type,\n value,\n unit,\n ...options,\n ...((this.defaultMeta || options?.meta) && {\n meta: { ...this.defaultMeta, ...options?.meta },\n }),\n ...((this.defaultTags || options?.tags) && {\n tags: [...this.defaultTags, ...(options?.tags || [])],\n }),\n };\n return this.request(\"/metrics\", payload);\n }\n\n /**\n * Track multiple metric values in batch\n * @param metrics Array of metric data\n */\n async trackMetricBatch(metrics: CreateMetricDto[]) {\n const processedMetrics = metrics.map((metric) => ({\n ...metric,\n ...((this.defaultMeta || metric.meta) && {\n meta: { ...this.defaultMeta, ...metric.meta },\n }),\n ...((this.defaultTags || metric.tags) && {\n tags: [...this.defaultTags, ...(metric.tags || [])],\n }),\n }));\n\n return this.request(\"/metrics/batch\", { metrics: processedMetrics });\n }\n}\n"],"mappings":"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","names":["LogLevel","Logs","sendLog","sendLogBatch","logs","type","messageOrOptions","options","message","finalOptions","messageOrErrorOrOptions","errorOrOptions","finalErrorOrOptions","meta","SysWatch","_SysWatch","config","Logs","response","error","instance","path","body","errorText","data","payload","logs","processedLogs","log","type","value","unit","options","metrics","processedMetrics","metric"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@syswatch/core",
3
- "version": "1.0.2",
3
+ "version": "1.0.4",
4
4
  "main": "dist/index.js",
5
5
  "module": "dist/index.mjs",
6
6
  "types": "dist/index.d.ts",
@@ -11,6 +11,9 @@
11
11
  "import": "./dist/index.mjs"
12
12
  }
13
13
  },
14
+ "files": [
15
+ "dist"
16
+ ],
14
17
  "publishConfig": {
15
18
  "access": "public"
16
19
  },
package/CHANGELOG.md DELETED
@@ -1,7 +0,0 @@
1
- # @syswatch/core
2
-
3
- ## 1.0.1
4
-
5
- ### Patch Changes
6
-
7
- - 3ff9f37: correction type
package/jest.config.ts DELETED
@@ -1,9 +0,0 @@
1
- import type { Config } from "jest";
2
-
3
- const config: Config = {
4
- preset: "ts-jest",
5
- testEnvironment: "node",
6
- testMatch: ["**/*.spec.ts"],
7
- };
8
-
9
- export default config;
@@ -1,164 +0,0 @@
1
- import { SysWatch } from "./client";
2
- import { Logs } from "./logs";
3
-
4
- // Mock global fetch
5
- const mockFetch = jest.fn();
6
- global.fetch = mockFetch;
7
-
8
- describe("SysWatch", () => {
9
- const apiKey = "test-api-key";
10
- const defaultBaseUrl = "https://syswatchapp.discloud.app/v1";
11
-
12
- beforeEach(() => {
13
- mockFetch.mockClear();
14
- mockFetch.mockResolvedValue({
15
- ok: true,
16
- json: async () => ({ success: true }),
17
- });
18
- });
19
-
20
- describe("Constructor", () => {
21
- it("should initialize with default base URL", () => {
22
- const client = new SysWatch({ apiKey });
23
- expect(client["baseUrl"]).toBe(defaultBaseUrl);
24
- expect(client.log).toBeInstanceOf(Logs);
25
- });
26
-
27
- it("should store default meta and tags", () => {
28
- const defaultMeta = { app: "test" };
29
- const defaultTags = ["test-env"];
30
- const client = new SysWatch({
31
- apiKey,
32
- defaultMeta,
33
- defaultTags,
34
- });
35
-
36
- expect(client["defaultMeta"]).toEqual(defaultMeta);
37
- expect(client["defaultTags"]).toEqual(defaultTags);
38
- });
39
- });
40
-
41
- describe("sendLog (via log property)", () => {
42
- let client: SysWatch;
43
-
44
- beforeEach(() => {
45
- client = new SysWatch({ apiKey });
46
- });
47
-
48
- it("should send info log", async () => {
49
- await client.log.info("Info message", { meta: { foo: "bar" } });
50
-
51
- expect(mockFetch).toHaveBeenCalledWith(
52
- `${defaultBaseUrl}/logs`,
53
- expect.objectContaining({
54
- method: "POST",
55
- headers: {
56
- "Content-Type": "application/json",
57
- "x-api-key": apiKey,
58
- "user-agent": "NodeJS SysWatch SDK ",
59
- },
60
- body: expect.stringContaining('"level":"INFO"'),
61
- })
62
- );
63
-
64
- const call = mockFetch.mock.calls[0];
65
- const body = JSON.parse(call[1].body);
66
- expect(body.type).toBe("info");
67
- expect(body.message).toBe("Info message");
68
- expect(body.meta).toEqual({ foo: "bar" });
69
- });
70
-
71
- it("should send error log from Error object", async () => {
72
- const error = new Error("Something went wrong");
73
- error.stack = "Error stack trace";
74
-
75
- await client.log.error("Failure", error);
76
-
77
- const call = mockFetch.mock.calls[0];
78
- const body = JSON.parse(call[1].body);
79
- expect(body.level).toBe("ERROR");
80
- expect(body.meta.error).toEqual({
81
- name: "Error",
82
- message: "Something went wrong",
83
- stack: "Error stack trace",
84
- });
85
- });
86
-
87
- it("should send error log from options object", async () => {
88
- await client.log.error("Failure", { meta: { code: 500 } });
89
-
90
- const call = mockFetch.mock.calls[0];
91
- const body = JSON.parse(call[1].body);
92
- expect(body.meta.code).toBe(500);
93
- expect(body.level).toBe("ERROR");
94
- });
95
- });
96
-
97
- describe("trackMetric", () => {
98
- let client: SysWatch;
99
-
100
- beforeEach(() => {
101
- client = new SysWatch({ apiKey });
102
- });
103
-
104
- it("should send metric request correctly", async () => {
105
- await client.trackMetric("cpu_usage", 80, "%");
106
-
107
- expect(mockFetch).toHaveBeenCalledWith(`${defaultBaseUrl}/metrics`, {
108
- method: "POST",
109
- headers: {
110
- "Content-Type": "application/json",
111
- "x-api-key": apiKey,
112
- "user-agent": "NodeJS SysWatch SDK ",
113
- },
114
- body: expect.any(String),
115
- });
116
-
117
- const call = mockFetch.mock.calls[0];
118
- const body = JSON.parse(call[1].body);
119
- expect(body).toEqual({
120
- type: "cpu_usage",
121
- value: 80,
122
- unit: "%",
123
- meta: {},
124
- tags: [],
125
- });
126
- });
127
-
128
- it("should merge default meta and tags for metrics", async () => {
129
- client = new SysWatch({
130
- apiKey,
131
- defaultMeta: { host: "server-1" },
132
- defaultTags: ["prod"],
133
- });
134
-
135
- await client.trackMetric("memory", 1024, "MB", { tags: ["worker"] });
136
-
137
- const call = mockFetch.mock.calls[0];
138
- const body = JSON.parse(call[1].body);
139
- expect(body.meta).toEqual({ host: "server-1" });
140
- expect(body.tags).toEqual(["prod", "worker"]);
141
- });
142
- });
143
-
144
- describe("Error Handling", () => {
145
- let client: SysWatch;
146
-
147
- beforeEach(() => {
148
- client = new SysWatch({ apiKey });
149
- });
150
-
151
- it("should throw error when API returns non-200", async () => {
152
- mockFetch.mockResolvedValue({
153
- ok: false,
154
- status: 401,
155
- statusText: "Unauthorized",
156
- text: async () => "Invalid API Key",
157
- });
158
-
159
- await expect(client.log.info("test")).rejects.toThrow(
160
- "SysWatch API Error: 401 Unauthorized - Invalid API Key"
161
- );
162
- });
163
- });
164
- });
package/src/client.ts DELETED
@@ -1,93 +0,0 @@
1
- import { Logs } from "./logs";
2
- import { CreateLogDto, CreateMetricDto } from "./types";
3
-
4
- export interface SysWatchConfig {
5
- apiKey: string;
6
- defaultMeta?: Record<string, any>;
7
- defaultTags?: string[];
8
- }
9
-
10
- export class SysWatch {
11
- private apiKey: string;
12
- private baseUrl: string;
13
- private defaultMeta: Record<string, any>;
14
- private defaultTags: string[];
15
-
16
- public log: Logs;
17
-
18
- constructor(config: SysWatchConfig) {
19
- this.apiKey = config.apiKey;
20
- this.baseUrl = "https://syswatchapp.discloud.app/v1";
21
- this.defaultMeta = config.defaultMeta || {};
22
- this.defaultTags = config.defaultTags || [];
23
-
24
- if (this.baseUrl.endsWith("/")) {
25
- this.baseUrl = this.baseUrl.slice(0, -1);
26
- }
27
-
28
- this.log = new Logs(this.sendLog.bind(this));
29
- }
30
-
31
- private async request(path: string, body: any) {
32
- try {
33
- const response = await fetch(`${this.baseUrl}${path}`, {
34
- method: "POST",
35
- headers: {
36
- "Content-Type": "application/json",
37
- "x-api-key": this.apiKey,
38
- "user-agent": "NodeJS SysWatch SDK ",
39
- },
40
- body: JSON.stringify(body),
41
- });
42
-
43
- if (!response.ok) {
44
- const errorText = await response.text();
45
- throw new Error(
46
- `SysWatch API Error: ${response.status} ${response.statusText} - ${errorText}`
47
- );
48
- }
49
-
50
- return await response.json();
51
- } catch (error) {
52
- // Re-throw the error to let the caller handle it
53
- throw error;
54
- }
55
- }
56
-
57
- /**
58
- * Send a log entry to SysWatch
59
- * @param data Log data
60
- */
61
- async sendLog(data: CreateLogDto) {
62
- const payload: CreateLogDto = {
63
- ...data,
64
- meta: { ...this.defaultMeta, ...data.meta },
65
- tags: [...this.defaultTags, ...(data.tags || [])],
66
- };
67
- return this.request("/logs", payload);
68
- }
69
-
70
- /**
71
- * Track a metric value
72
- * @param type Metric type key
73
- * @param value Metric value
74
- * @param unit Unit of measurement (optional)
75
- * @param options Additional options
76
- */
77
- async trackMetric(
78
- type: string,
79
- value: number,
80
- unit?: string,
81
- options?: Omit<CreateMetricDto, "type" | "value" | "unit">
82
- ) {
83
- const payload: CreateMetricDto = {
84
- type,
85
- value,
86
- unit,
87
- ...options,
88
- meta: { ...this.defaultMeta, ...options?.meta },
89
- tags: [...this.defaultTags, ...(options?.tags || [])],
90
- };
91
- return this.request("/metrics", payload);
92
- }
93
- }
package/src/index.ts DELETED
@@ -1,2 +0,0 @@
1
- export * from './types';
2
- export * from './client';
package/src/logs.ts DELETED
@@ -1,127 +0,0 @@
1
- import { CreateLogDto, LogLevel } from "./types";
2
-
3
- type LogOptions = Omit<CreateLogDto, "level" | "message" | "type"> & {
4
- type?: string;
5
- };
6
-
7
- export class Logs {
8
- constructor(private sendLog: (log: CreateLogDto) => Promise<void>) {}
9
-
10
- /**
11
- * Send a DEBUG log
12
- * @param message Log message
13
- * @param options Additional options (meta, tags, etc.)
14
- */
15
- async debug(message: string, options?: LogOptions) {
16
- return this.sendLog({
17
- type: "debug",
18
- level: LogLevel.DEBUG,
19
- message,
20
- ...options,
21
- });
22
- }
23
-
24
- /**
25
- * Send an INFO log
26
- * @param message Log message
27
- * @param options Additional options (meta, tags, etc.)
28
- */
29
- async info(message: string, options?: LogOptions) {
30
- return this.sendLog({
31
- type: "info",
32
- level: LogLevel.INFO,
33
- message,
34
- ...options,
35
- });
36
- }
37
-
38
- /**
39
- * Send a SUCCESS log
40
- * @param message Log message
41
- * @param options Additional options (meta, tags, etc.)
42
- */
43
- async success(message: string, options?: LogOptions) {
44
- return this.sendLog({
45
- type: "success",
46
- level: LogLevel.SUCCESS,
47
- message,
48
- ...options,
49
- });
50
- }
51
- /**
52
- * Send a FAILURE log
53
- * @param message Log message
54
- * @param options Additional options (meta, tags, etc.)
55
- */
56
- async failure(message: string, options?: LogOptions) {
57
- return this.sendLog({
58
- type: "failure",
59
- level: LogLevel.FAILURE,
60
- message,
61
- ...options,
62
- });
63
- }
64
-
65
- /**
66
- * Send a WARN log
67
- * @param message Log message
68
- * @param options Additional options (meta, tags, etc.)
69
- */
70
- async warn(message: string, options?: LogOptions) {
71
- return this.sendLog({
72
- type: "warn",
73
- level: LogLevel.WARN,
74
- message,
75
- ...options,
76
- });
77
- }
78
-
79
- /**
80
- * Send an ERROR log with smart error handling
81
- * @param message Log message
82
- * @param errorOrOptions Error object or options object
83
- */
84
- async error(
85
- message: string,
86
- errorOrOptions?:
87
- | Error
88
- | (Omit<CreateLogDto, "level" | "message" | "type"> & { type?: string })
89
- ) {
90
- let meta = {};
91
- let options: Partial<CreateLogDto> = {};
92
-
93
- if (errorOrOptions instanceof Error) {
94
- meta = {
95
- error: {
96
- name: errorOrOptions.name,
97
- message: errorOrOptions.message,
98
- stack: errorOrOptions.stack,
99
- },
100
- };
101
- } else if (errorOrOptions) {
102
- options = errorOrOptions;
103
- }
104
-
105
- return this.sendLog({
106
- type: "error",
107
- level: LogLevel.ERROR,
108
- message,
109
- ...options,
110
- meta: { ...meta, ...(options.meta || {}) },
111
- });
112
- }
113
-
114
- /**
115
- * Send a CRITICAL log
116
- * @param message Log message
117
- * @param options Additional options (meta, tags, etc.)
118
- */
119
- async critical(message: string, options?: LogOptions) {
120
- return this.sendLog({
121
- type: "critical",
122
- level: LogLevel.CRITICAL,
123
- message,
124
- ...options,
125
- });
126
- }
127
- }
package/src/types.ts DELETED
@@ -1,31 +0,0 @@
1
- export enum LogLevel {
2
- DEBUG = 'DEBUG',
3
- INFO = 'INFO',
4
- SUCCESS = 'SUCCESS',
5
- FAILURE = 'FAILURE',
6
- WARN = 'WARN',
7
- ERROR = 'ERROR',
8
- CRITICAL = 'CRITICAL',
9
- }
10
-
11
- export interface CreateLogDto {
12
- type: string;
13
- level: LogLevel;
14
- message?: string;
15
- meta?: Record<string, any>;
16
- environment?: string;
17
- userId?: string;
18
- ip?: string;
19
- timestamp?: Date | string;
20
- tags?: string[];
21
- }
22
-
23
- export interface CreateMetricDto {
24
- type: string;
25
- value: number;
26
- meta?: Record<string, any>;
27
- environment?: string;
28
- timestamp?: Date | string;
29
- tags?: string[];
30
- unit?: string;
31
- }
package/tsconfig.json DELETED
@@ -1,12 +0,0 @@
1
- {
2
- "compilerOptions": {
3
- "target": "ES2020",
4
- "module": "commonjs",
5
- "declaration": true,
6
- "outDir": "./dist",
7
- "strict": true,
8
- "esModuleInterop": true,
9
- "skipLibCheck": true
10
- },
11
- "include": ["src/**/*"]
12
- }
package/tsup.config.ts DELETED
@@ -1,10 +0,0 @@
1
- import { defineConfig } from "tsup";
2
-
3
- export default defineConfig({
4
- entry: ["src/index.ts"],
5
- format: ["cjs", "esm"],
6
- dts: true,
7
- clean: true,
8
- minify: true,
9
- sourcemap: true,
10
- });