@duckbug/js 0.1.1 → 0.1.3

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 (45) hide show
  1. package/README.md +195 -30
  2. package/dist/cjs/DuckBug/DuckBugProvider.cjs +19 -20
  3. package/dist/cjs/DuckBug/DuckBugService.cjs +59 -0
  4. package/dist/cjs/{Log → DuckBug}/index.cjs +4 -8
  5. package/dist/cjs/SDK/DuckSDK.cjs +12 -6
  6. package/dist/cjs/{Log → SDK}/LogLevel.cjs +2 -1
  7. package/dist/cjs/{Log → SDK}/LogProvider.cjs +2 -2
  8. package/dist/cjs/SDK/index.cjs +9 -1
  9. package/dist/cjs/index.cjs +12 -24
  10. package/dist/esm/DuckBug/DuckBugProvider.js +19 -20
  11. package/dist/esm/DuckBug/DuckBugService.js +25 -0
  12. package/dist/esm/DuckBug/index.js +2 -0
  13. package/dist/esm/SDK/DuckSDK.js +7 -1
  14. package/dist/esm/{Log → SDK}/LogLevel.js +2 -1
  15. package/dist/esm/{Log → SDK}/LogProvider.js +2 -2
  16. package/dist/esm/SDK/index.js +3 -1
  17. package/dist/esm/index.js +2 -4
  18. package/dist/types/DuckBug/DuckBugConfig.d.ts +3 -0
  19. package/dist/types/DuckBug/DuckBugProvider.d.ts +6 -6
  20. package/dist/types/DuckBug/DuckBugService.d.ts +12 -0
  21. package/dist/types/{Log → DuckBug}/Log.d.ts +2 -2
  22. package/dist/types/DuckBug/index.d.ts +2 -0
  23. package/dist/types/SDK/DuckSDK.d.ts +3 -2
  24. package/dist/types/SDK/LogLevel.d.ts +2 -0
  25. package/dist/types/{Log → SDK}/LogProvider.d.ts +1 -1
  26. package/dist/types/{Provider → SDK}/Provider.d.ts +2 -1
  27. package/dist/types/SDK/index.d.ts +5 -1
  28. package/dist/types/index.d.ts +2 -5
  29. package/package.json +11 -8
  30. package/dist/cjs/SDK/DuckConfig.cjs +0 -18
  31. package/dist/esm/Log/index.js +0 -3
  32. package/dist/esm/SDK/DuckConfig.js +0 -0
  33. package/dist/types/Log/LogLevel.d.ts +0 -2
  34. package/dist/types/Log/index.d.ts +0 -5
  35. package/dist/types/Provider/index.d.ts +0 -1
  36. package/dist/types/SDK/DuckConfig.d.ts +0 -3
  37. /package/dist/cjs/{Log/Log.cjs → DuckBug/DuckBugConfig.cjs} +0 -0
  38. /package/dist/cjs/{Log/LogProviderConfig.cjs → DuckBug/Log.cjs} +0 -0
  39. /package/dist/cjs/{Provider/Provider.cjs → SDK/LogProviderConfig.cjs} +0 -0
  40. /package/dist/cjs/{Provider/index.cjs → SDK/Provider.cjs} +0 -0
  41. /package/dist/esm/{Log/Log.js → DuckBug/DuckBugConfig.js} +0 -0
  42. /package/dist/esm/{Log/LogProviderConfig.js → DuckBug/Log.js} +0 -0
  43. /package/dist/esm/{Provider/Provider.js → SDK/LogProviderConfig.js} +0 -0
  44. /package/dist/esm/{Provider/index.js → SDK/Provider.js} +0 -0
  45. /package/dist/types/{Log → SDK}/LogProviderConfig.d.ts +0 -0
package/README.md CHANGED
@@ -1,30 +1,47 @@
1
- # Rsbuild project
1
+ # @duckbug/js
2
2
 
3
- ## Setup
3
+ [![npm version](https://badge.fury.io/js/@duckbug%2Fjs.svg)](https://www.npmjs.com/package/@duckbug/js)
4
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
4
5
 
5
- Install the dependencies:
6
+ The official JavaScript SDK for [DuckBug.io](https://duckbug.io) - a flexible logging and error tracking platform.
6
7
 
7
- ```bash
8
- yarn install
9
- ```
8
+ ## Features
10
9
 
11
- Build lib:
10
+ - 🦆 **Simple Integration**: Easy setup with DuckBug.io
11
+ - 🔌 **Provider Architecture**: Extensible plugin system for custom logging providers
12
+ - 📊 **Multiple Log Levels**: Support for debug, info, warn, and error levels
13
+ - 🎯 **TypeScript Support**: Full TypeScript support with type definitions
14
+ - 📦 **Dual Module Format**: Both CommonJS and ES Module support
15
+ - ⚡ **Lightweight**: Minimal dependencies and small bundle size
16
+
17
+ ## Installation
12
18
 
13
19
  ```bash
14
- yarn compile
20
+ # npm
21
+ npm install @duckbug/js
22
+
23
+ # yarn
24
+ yarn add @duckbug/js
25
+
26
+ # pnpm
27
+ pnpm add @duckbug/js
15
28
  ```
16
29
 
30
+ ## Quick Start
31
+
32
+ ### Basic Usage
17
33
 
18
- ## Example
34
+ ```typescript
35
+ import { DuckSDK, DuckBugProvider } from '@duckbug/js';
19
36
 
20
- ### Basic usage
21
- ```ts
37
+ // Initialize with DuckBug.io provider
22
38
  const providers = [
23
- new DuckBugPlugin({
24
- dsn: "123456",
39
+ new DuckBugProvider({
40
+ dsn: 'your-duckbug-dsn-here'
25
41
  })
26
- ]
42
+ ];
27
43
 
44
+ // Create SDK instance with optional configuration
28
45
  const duck = new DuckSDK(providers, {
29
46
  logReports: {
30
47
  log: false,
@@ -33,33 +50,181 @@ const duck = new DuckSDK(providers, {
33
50
  }
34
51
  });
35
52
 
36
- duck.log('Info message', { message: 'All good' })
37
- duck.debug('Debug message', { message: 'All fine' })
38
- duck.warn('Warn message', { message: 'So so' })
39
- duck.error('Error message', { message: 'Ay, Caramba!' })
53
+ // Start logging
54
+ duck.log('Info message', { userId: 123, action: 'user_login' });
55
+ duck.debug('Debug message', { debugInfo: 'Connection established' });
56
+ duck.warn('Warning message', { warning: 'Rate limit approaching' });
57
+ duck.error('Error message', { error: 'Database connection failed' });
58
+ duck.fatal('Fatal message', { error: 'Ay, caramba' });
59
+
60
+ //Send error
61
+ const testError = new Error("Integration test error");
62
+ testError.stack =
63
+ "Error: Integration test error\n at integration.test.ts:1:1";
64
+
65
+ // Use quack method directly on provider
66
+ duckBugProvider.quack("INTEGRATION_ERROR", testError);
40
67
  ```
41
68
 
42
- ### Create own plugin
43
- ```ts
44
- class TelegramProvider extends Providers {
69
+ ## API Reference
70
+
71
+ ### DuckSDK
72
+
73
+ The main SDK class that manages logging across multiple providers.
74
+
75
+ #### Constructor
76
+
77
+ ```typescript
78
+ new DuckSDK(providers: Provider[], config?: LogProviderConfig)
79
+ ```
80
+
81
+ - `providers`: Array of provider instances
82
+ - `config`: Optional configuration for log reporting levels
83
+
84
+ #### Methods
85
+
86
+ - `log(tag: string, payload?: object)`: Log an info-level message
87
+ - `debug(tag: string, payload?: object)`: Log a debug-level message
88
+ - `warn(tag: string, payload?: object)`: Log a warning-level message
89
+ - `error(tag: string, payload?: object)`: Log an error-level message
90
+ - `fatal(tag: string, payload?: object)`: Log an fatal-level message
91
+ - `quack(tag: string, error: Error)`: Report error
92
+
93
+ ### DuckBugProvider
94
+
95
+ The official DuckBug.io provider for sending logs to the DuckBug.io platform.
96
+
97
+ #### Constructor
98
+
99
+ ```typescript
100
+ new DuckBugProvider(config: DuckConfig)
101
+ ```
102
+
103
+ - `config.dsn`: Your DuckBug.io DSN (Data Source Name)
104
+
105
+ ### Log Provider Configuration
106
+
107
+ ```typescript
108
+ type LogProviderConfig = {
109
+ logReports: {
110
+ log?: boolean; // Enable/disable info logs (default: false)
111
+ warn?: boolean; // Enable/disable warning logs (default: true)
112
+ error?: boolean; // Enable/disable error logs (default: true)
113
+ }
114
+ }
115
+ ```
116
+
117
+ ## Custom Providers
118
+
119
+ You can create custom providers by implementing the `Provider` interface:
120
+
121
+ ```typescript
122
+ import { Provider, LogLevel } from '@duckbug/js';
123
+
124
+ class TelegramProvider implements Provider {
125
+ constructor(private botToken: string, private chatId: string) {}
126
+
45
127
  log(...args: unknown[]): void {
46
- //send to telegram log
128
+ this.sendToTelegram('📝', args);
47
129
  }
130
+
48
131
  warn(...args: unknown[]): void {
49
- //send to telegram warn
132
+ this.sendToTelegram('⚠️', args);
50
133
  }
134
+
51
135
  error(...args: unknown[]): void {
52
- //send to telegram error
136
+ this.sendToTelegram('🚨', args);
137
+ }
138
+
139
+ report(tag: string, level: LogLevel, payload?: object): void {
140
+ const emojiMap: Record<LogLevel, string> = {
141
+ INFO: '📝',
142
+ DEBUG: '🦆',
143
+ WARN: '⚠️',
144
+ ERROR: '🚨',
145
+ FATAL: '💀',
146
+ };
147
+ this.sendToTelegram(emojiMap[level], [tag, payload]);
148
+ }
149
+
150
+ quack(tag: string, error: Error): void {
151
+ this.sendToTelegram('💀', [tag, error.message]);
152
+ }
153
+
154
+ private sendToTelegram(emoji: string, args: unknown[]) {
155
+ const message = `${emoji} ${args.join(' ')}`;
156
+ // Implementation to send message to Telegram
157
+ fetch(`https://api.telegram.org/bot${this.botToken}/sendMessage`, {
158
+ method: 'POST',
159
+ headers: { 'Content-Type': 'application/json' },
160
+ body: JSON.stringify({
161
+ chat_id: this.chatId,
162
+ text: message
163
+ })
164
+ });
53
165
  }
54
166
  }
55
167
 
168
+ // Usage
56
169
  const providers = [
57
- new DuckBugProvider({
58
- dsn: "123456",
59
- }),
170
+ new DuckBugProvider({ dsn: 'your-dsn' }),
171
+ new TelegramProvider('your-bot-token', 'your-chat-id')
172
+ ];
173
+
174
+ const duck = new DuckSDK(providers);
175
+ ```
176
+
177
+ ## Development
178
+
179
+ ### Setup
180
+
181
+ Install dependencies:
182
+
183
+ ```bash
184
+ yarn install
185
+ ```
186
+
187
+ ### Build
188
+
189
+ Build the library:
60
190
 
61
- new TelegramProvider()
62
- ]
191
+ ```bash
192
+ yarn build
193
+ ```
194
+
195
+ ### Linting
196
+
197
+ Run linting:
198
+
199
+ ```bash
200
+ yarn lint
201
+ ```
202
+
203
+ ## TypeScript Support
204
+
205
+ This package includes TypeScript definitions. All exports are fully typed:
63
206
 
64
- new DuckSDK(providers);
207
+ ```typescript
208
+ import type { Provider, DuckConfig, LogLevel } from '@duckbug/js';
65
209
  ```
210
+
211
+ ## Browser Compatibility
212
+
213
+ This SDK works in all modern browsers that support:
214
+ - ES2015+ (ES6)
215
+ - Fetch API
216
+ - JSON API
217
+
218
+ For older browsers, you may need to include polyfills.
219
+
220
+ ## License
221
+
222
+ MIT © [DuckBug.io](https://duckbug.io)
223
+
224
+ ## Support
225
+
226
+ - 🐛 Issues: [GitHub Issues](https://github.com/duckbugio/duckbug-js/issues)
227
+
228
+ ---
229
+
230
+ **Made with 🦆 by the DuckBug.io team**
@@ -26,42 +26,50 @@ __webpack_require__.r(__webpack_exports__);
26
26
  __webpack_require__.d(__webpack_exports__, {
27
27
  DuckBugProvider: ()=>DuckBugProvider
28
28
  });
29
- const index_cjs_namespaceObject = require("../Log/index.cjs");
29
+ const index_cjs_namespaceObject = require("../SDK/index.cjs");
30
+ const external_DuckBugService_cjs_namespaceObject = require("./DuckBugService.cjs");
30
31
  class DuckBugProvider {
31
- config;
32
+ service;
32
33
  constructor(config){
33
- this.config = config;
34
+ this.service = new external_DuckBugService_cjs_namespaceObject.DuckBugService(config);
34
35
  }
35
36
  warn(...args) {
36
- this.sendLog({
37
+ this.service.sendLog({
37
38
  time: this.getTimeStamp(),
38
39
  level: index_cjs_namespaceObject.logLevel.WARN,
39
40
  message: this.convertArgsToString(args[0]),
40
- context: this.convertArgsToString(args.slice(1))
41
+ context: args.slice(1)
41
42
  });
42
43
  }
43
44
  error(...args) {
44
- this.sendLog({
45
+ this.service.sendLog({
45
46
  time: this.getTimeStamp(),
46
47
  level: index_cjs_namespaceObject.logLevel.ERROR,
47
48
  message: this.convertArgsToString(args[0]),
48
- context: this.convertArgsToString(args.slice(1))
49
+ context: args.slice(1)
49
50
  });
50
51
  }
51
52
  log(...args) {
52
- this.sendLog({
53
+ this.service.sendLog({
53
54
  time: this.getTimeStamp(),
54
55
  level: index_cjs_namespaceObject.logLevel.INFO,
55
56
  message: this.convertArgsToString(args[0]),
56
- context: this.convertArgsToString(args.slice(1))
57
+ context: args.slice(1)
57
58
  });
58
59
  }
59
60
  report(tag, level, payload) {
60
- this.sendLog({
61
+ this.service.sendLog({
61
62
  time: this.getTimeStamp(),
62
63
  level,
63
64
  message: tag,
64
- context: JSON.stringify(payload)
65
+ context: payload
66
+ });
67
+ }
68
+ quack(tag, error) {
69
+ this.service.sendError({
70
+ stack: error.stack,
71
+ message: tag,
72
+ context: error.message
65
73
  });
66
74
  }
67
75
  convertArgsToString(...args) {
@@ -70,15 +78,6 @@ class DuckBugProvider {
70
78
  getTimeStamp() {
71
79
  return Date.now();
72
80
  }
73
- sendLog(logInfo) {
74
- fetch(`${this.config.dsn}/logs`, {
75
- method: "POST",
76
- headers: {
77
- "Content-Type": "application/json"
78
- },
79
- body: JSON.stringify(logInfo)
80
- });
81
- }
82
81
  }
83
82
  exports.DuckBugProvider = __webpack_exports__.DuckBugProvider;
84
83
  for(var __webpack_i__ in __webpack_exports__)if (-1 === [
@@ -0,0 +1,59 @@
1
+ "use strict";
2
+ var __webpack_require__ = {};
3
+ (()=>{
4
+ __webpack_require__.d = (exports1, definition)=>{
5
+ for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
6
+ enumerable: true,
7
+ get: definition[key]
8
+ });
9
+ };
10
+ })();
11
+ (()=>{
12
+ __webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
13
+ })();
14
+ (()=>{
15
+ __webpack_require__.r = (exports1)=>{
16
+ if ('undefined' != typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
17
+ value: 'Module'
18
+ });
19
+ Object.defineProperty(exports1, '__esModule', {
20
+ value: true
21
+ });
22
+ };
23
+ })();
24
+ var __webpack_exports__ = {};
25
+ __webpack_require__.r(__webpack_exports__);
26
+ __webpack_require__.d(__webpack_exports__, {
27
+ DuckBugService: ()=>DuckBugService
28
+ });
29
+ class DuckBugService {
30
+ config;
31
+ constructor(config){
32
+ this.config = config;
33
+ }
34
+ sendLog(logInfo) {
35
+ fetch(`${this.config.dsn}/logs`, {
36
+ method: "POST",
37
+ headers: {
38
+ "Content-Type": "application/json"
39
+ },
40
+ body: JSON.stringify(logInfo)
41
+ });
42
+ }
43
+ sendError(errorInfo) {
44
+ fetch(`${this.config.dsn}/errors`, {
45
+ method: "POST",
46
+ headers: {
47
+ "Content-Type": "application/json"
48
+ },
49
+ body: JSON.stringify(errorInfo)
50
+ });
51
+ }
52
+ }
53
+ exports.DuckBugService = __webpack_exports__.DuckBugService;
54
+ for(var __webpack_i__ in __webpack_exports__)if (-1 === [
55
+ "DuckBugService"
56
+ ].indexOf(__webpack_i__)) exports[__webpack_i__] = __webpack_exports__[__webpack_i__];
57
+ Object.defineProperty(exports, '__esModule', {
58
+ value: true
59
+ });
@@ -24,16 +24,12 @@ var __webpack_require__ = {};
24
24
  var __webpack_exports__ = {};
25
25
  __webpack_require__.r(__webpack_exports__);
26
26
  __webpack_require__.d(__webpack_exports__, {
27
- logLevel: ()=>external_LogLevel_cjs_namespaceObject.logLevel,
28
- LogProvider: ()=>external_LogProvider_cjs_namespaceObject.LogProvider
27
+ DuckBugProvider: ()=>external_DuckBugProvider_cjs_namespaceObject.DuckBugProvider
29
28
  });
30
- const external_LogLevel_cjs_namespaceObject = require("./LogLevel.cjs");
31
- const external_LogProvider_cjs_namespaceObject = require("./LogProvider.cjs");
32
- exports.LogProvider = __webpack_exports__.LogProvider;
33
- exports.logLevel = __webpack_exports__.logLevel;
29
+ const external_DuckBugProvider_cjs_namespaceObject = require("./DuckBugProvider.cjs");
30
+ exports.DuckBugProvider = __webpack_exports__.DuckBugProvider;
34
31
  for(var __webpack_i__ in __webpack_exports__)if (-1 === [
35
- "LogProvider",
36
- "logLevel"
32
+ "DuckBugProvider"
37
33
  ].indexOf(__webpack_i__)) exports[__webpack_i__] = __webpack_exports__[__webpack_i__];
38
34
  Object.defineProperty(exports, '__esModule', {
39
35
  value: true
@@ -26,24 +26,30 @@ __webpack_require__.r(__webpack_exports__);
26
26
  __webpack_require__.d(__webpack_exports__, {
27
27
  DuckSDK: ()=>DuckSDK
28
28
  });
29
- const index_cjs_namespaceObject = require("../Log/index.cjs");
29
+ const external_index_cjs_namespaceObject = require("./index.cjs");
30
30
  class DuckSDK {
31
31
  providers;
32
32
  constructor(providers, logProviderConfig){
33
33
  this.providers = providers;
34
- new index_cjs_namespaceObject.LogProvider(providers, logProviderConfig);
34
+ new external_index_cjs_namespaceObject.LogProvider(providers, logProviderConfig);
35
35
  }
36
36
  log(tag, payload) {
37
- this.sendReportToPlugins(tag, index_cjs_namespaceObject.logLevel.DEBUG, payload);
37
+ this.sendReportToPlugins(tag, external_index_cjs_namespaceObject.logLevel.DEBUG, payload);
38
38
  }
39
39
  error(tag, payload) {
40
- this.sendReportToPlugins(tag, index_cjs_namespaceObject.logLevel.DEBUG, payload);
40
+ this.sendReportToPlugins(tag, external_index_cjs_namespaceObject.logLevel.DEBUG, payload);
41
41
  }
42
42
  debug(tag, payload) {
43
- this.sendReportToPlugins(tag, index_cjs_namespaceObject.logLevel.DEBUG, payload);
43
+ this.sendReportToPlugins(tag, external_index_cjs_namespaceObject.logLevel.DEBUG, payload);
44
44
  }
45
45
  warn(tag, payload) {
46
- this.sendReportToPlugins(tag, index_cjs_namespaceObject.logLevel.WARN, payload);
46
+ this.sendReportToPlugins(tag, external_index_cjs_namespaceObject.logLevel.WARN, payload);
47
+ }
48
+ fatal(tag, payload) {
49
+ this.sendReportToPlugins(tag, external_index_cjs_namespaceObject.logLevel.FATAL, payload);
50
+ }
51
+ quack(tag, error) {
52
+ this.providers.forEach((plugin)=>plugin.quack(tag, error));
47
53
  }
48
54
  sendReportToPlugins(tag, level, payload) {
49
55
  this.providers.forEach((plugin)=>plugin.report(tag, level, payload));
@@ -30,7 +30,8 @@ const logLevel = {
30
30
  DEBUG: "DEBUG",
31
31
  INFO: "INFO",
32
32
  WARN: "WARN",
33
- ERROR: "ERROR"
33
+ ERROR: "ERROR",
34
+ FATAL: "FATAL"
34
35
  };
35
36
  exports.logLevel = __webpack_exports__.logLevel;
36
37
  for(var __webpack_i__ in __webpack_exports__)if (-1 === [
@@ -40,8 +40,8 @@ class LogProvider {
40
40
  error: true
41
41
  }
42
42
  };
43
- constructor(providers, logProviderConfig = this.logProviderConfig){
44
- this.logProviderConfig = logProviderConfig;
43
+ constructor(providers, logProviderConfig){
44
+ if (logProviderConfig) this.logProviderConfig = logProviderConfig;
45
45
  this.providers = providers;
46
46
  this.initialize();
47
47
  }
@@ -24,12 +24,20 @@ var __webpack_require__ = {};
24
24
  var __webpack_exports__ = {};
25
25
  __webpack_require__.r(__webpack_exports__);
26
26
  __webpack_require__.d(__webpack_exports__, {
27
+ LogProvider: ()=>external_LogProvider_cjs_namespaceObject.LogProvider,
28
+ logLevel: ()=>external_LogLevel_cjs_namespaceObject.logLevel,
27
29
  DuckSDK: ()=>external_DuckSDK_cjs_namespaceObject.DuckSDK
28
30
  });
29
31
  const external_DuckSDK_cjs_namespaceObject = require("./DuckSDK.cjs");
32
+ const external_LogLevel_cjs_namespaceObject = require("./LogLevel.cjs");
33
+ const external_LogProvider_cjs_namespaceObject = require("./LogProvider.cjs");
30
34
  exports.DuckSDK = __webpack_exports__.DuckSDK;
35
+ exports.LogProvider = __webpack_exports__.LogProvider;
36
+ exports.logLevel = __webpack_exports__.logLevel;
31
37
  for(var __webpack_i__ in __webpack_exports__)if (-1 === [
32
- "DuckSDK"
38
+ "DuckSDK",
39
+ "LogProvider",
40
+ "logLevel"
33
41
  ].indexOf(__webpack_i__)) exports[__webpack_i__] = __webpack_exports__[__webpack_i__];
34
42
  Object.defineProperty(exports, '__esModule', {
35
43
  value: true
@@ -1,10 +1,7 @@
1
1
  "use strict";
2
2
  var __webpack_modules__ = {
3
- "./DuckBug/DuckBugProvider": function(module) {
4
- module.exports = require("./DuckBug/DuckBugProvider.cjs");
5
- },
6
- "./Log": function(module) {
7
- module.exports = require("./Log/index.cjs");
3
+ "./DuckBug": function(module) {
4
+ module.exports = require("./DuckBug/index.cjs");
8
5
  },
9
6
  "./SDK": function(module) {
10
7
  module.exports = require("./SDK/index.cjs");
@@ -53,29 +50,20 @@ function __webpack_require__(moduleId) {
53
50
  var __webpack_exports__ = {};
54
51
  (()=>{
55
52
  __webpack_require__.r(__webpack_exports__);
56
- __webpack_require__.d(__webpack_exports__, {
57
- DuckBugProvider: ()=>_DuckBug_DuckBugProvider__WEBPACK_IMPORTED_MODULE_0__.DuckBugProvider,
58
- DuckSDK: ()=>_SDK__WEBPACK_IMPORTED_MODULE_2__.DuckSDK
59
- });
60
- var _DuckBug_DuckBugProvider__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__("./DuckBug/DuckBugProvider");
61
- var _Log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__("./Log");
53
+ var _DuckBug__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__("./DuckBug");
54
+ var __WEBPACK_REEXPORT_OBJECT__ = {};
55
+ for(var __WEBPACK_IMPORT_KEY__ in _DuckBug__WEBPACK_IMPORTED_MODULE_0__)if ("default" !== __WEBPACK_IMPORT_KEY__) __WEBPACK_REEXPORT_OBJECT__[__WEBPACK_IMPORT_KEY__] = (function(key) {
56
+ return _DuckBug__WEBPACK_IMPORTED_MODULE_0__[key];
57
+ }).bind(0, __WEBPACK_IMPORT_KEY__);
58
+ __webpack_require__.d(__webpack_exports__, __WEBPACK_REEXPORT_OBJECT__);
59
+ var _SDK__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__("./SDK");
62
60
  var __WEBPACK_REEXPORT_OBJECT__ = {};
63
- for(var __WEBPACK_IMPORT_KEY__ in _Log__WEBPACK_IMPORTED_MODULE_1__)if ([
64
- "DuckBugProvider",
65
- "DuckSDK",
66
- "default"
67
- ].indexOf(__WEBPACK_IMPORT_KEY__) < 0) __WEBPACK_REEXPORT_OBJECT__[__WEBPACK_IMPORT_KEY__] = (function(key) {
68
- return _Log__WEBPACK_IMPORTED_MODULE_1__[key];
61
+ for(var __WEBPACK_IMPORT_KEY__ in _SDK__WEBPACK_IMPORTED_MODULE_1__)if ("default" !== __WEBPACK_IMPORT_KEY__) __WEBPACK_REEXPORT_OBJECT__[__WEBPACK_IMPORT_KEY__] = (function(key) {
62
+ return _SDK__WEBPACK_IMPORTED_MODULE_1__[key];
69
63
  }).bind(0, __WEBPACK_IMPORT_KEY__);
70
64
  __webpack_require__.d(__webpack_exports__, __WEBPACK_REEXPORT_OBJECT__);
71
- var _SDK__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__("./SDK");
72
65
  })();
73
- exports.DuckBugProvider = __webpack_exports__.DuckBugProvider;
74
- exports.DuckSDK = __webpack_exports__.DuckSDK;
75
- for(var __webpack_i__ in __webpack_exports__)if (-1 === [
76
- "DuckBugProvider",
77
- "DuckSDK"
78
- ].indexOf(__webpack_i__)) exports[__webpack_i__] = __webpack_exports__[__webpack_i__];
66
+ for(var __webpack_i__ in __webpack_exports__)exports[__webpack_i__] = __webpack_exports__[__webpack_i__];
79
67
  Object.defineProperty(exports, '__esModule', {
80
68
  value: true
81
69
  });
@@ -1,39 +1,47 @@
1
- import { logLevel } from "../Log/index.js";
1
+ import { logLevel } from "../SDK/index.js";
2
+ import { DuckBugService } from "./DuckBugService.js";
2
3
  class DuckBugProvider {
3
- config;
4
+ service;
4
5
  constructor(config){
5
- this.config = config;
6
+ this.service = new DuckBugService(config);
6
7
  }
7
8
  warn(...args) {
8
- this.sendLog({
9
+ this.service.sendLog({
9
10
  time: this.getTimeStamp(),
10
11
  level: logLevel.WARN,
11
12
  message: this.convertArgsToString(args[0]),
12
- context: this.convertArgsToString(args.slice(1))
13
+ context: args.slice(1)
13
14
  });
14
15
  }
15
16
  error(...args) {
16
- this.sendLog({
17
+ this.service.sendLog({
17
18
  time: this.getTimeStamp(),
18
19
  level: logLevel.ERROR,
19
20
  message: this.convertArgsToString(args[0]),
20
- context: this.convertArgsToString(args.slice(1))
21
+ context: args.slice(1)
21
22
  });
22
23
  }
23
24
  log(...args) {
24
- this.sendLog({
25
+ this.service.sendLog({
25
26
  time: this.getTimeStamp(),
26
27
  level: logLevel.INFO,
27
28
  message: this.convertArgsToString(args[0]),
28
- context: this.convertArgsToString(args.slice(1))
29
+ context: args.slice(1)
29
30
  });
30
31
  }
31
32
  report(tag, level, payload) {
32
- this.sendLog({
33
+ this.service.sendLog({
33
34
  time: this.getTimeStamp(),
34
35
  level,
35
36
  message: tag,
36
- context: JSON.stringify(payload)
37
+ context: payload
38
+ });
39
+ }
40
+ quack(tag, error) {
41
+ this.service.sendError({
42
+ stack: error.stack,
43
+ message: tag,
44
+ context: error.message
37
45
  });
38
46
  }
39
47
  convertArgsToString(...args) {
@@ -42,14 +50,5 @@ class DuckBugProvider {
42
50
  getTimeStamp() {
43
51
  return Date.now();
44
52
  }
45
- sendLog(logInfo) {
46
- fetch(`${this.config.dsn}/logs`, {
47
- method: "POST",
48
- headers: {
49
- "Content-Type": "application/json"
50
- },
51
- body: JSON.stringify(logInfo)
52
- });
53
- }
54
53
  }
55
54
  export { DuckBugProvider };
@@ -0,0 +1,25 @@
1
+ class DuckBugService {
2
+ config;
3
+ constructor(config){
4
+ this.config = config;
5
+ }
6
+ sendLog(logInfo) {
7
+ fetch(`${this.config.dsn}/logs`, {
8
+ method: "POST",
9
+ headers: {
10
+ "Content-Type": "application/json"
11
+ },
12
+ body: JSON.stringify(logInfo)
13
+ });
14
+ }
15
+ sendError(errorInfo) {
16
+ fetch(`${this.config.dsn}/errors`, {
17
+ method: "POST",
18
+ headers: {
19
+ "Content-Type": "application/json"
20
+ },
21
+ body: JSON.stringify(errorInfo)
22
+ });
23
+ }
24
+ }
25
+ export { DuckBugService };
@@ -0,0 +1,2 @@
1
+ import { DuckBugProvider } from "./DuckBugProvider.js";
2
+ export { DuckBugProvider };
@@ -1,4 +1,4 @@
1
- import { LogProvider, logLevel } from "../Log/index.js";
1
+ import { LogProvider, logLevel } from "./index.js";
2
2
  class DuckSDK {
3
3
  providers;
4
4
  constructor(providers, logProviderConfig){
@@ -17,6 +17,12 @@ class DuckSDK {
17
17
  warn(tag, payload) {
18
18
  this.sendReportToPlugins(tag, logLevel.WARN, payload);
19
19
  }
20
+ fatal(tag, payload) {
21
+ this.sendReportToPlugins(tag, logLevel.FATAL, payload);
22
+ }
23
+ quack(tag, error) {
24
+ this.providers.forEach((plugin)=>plugin.quack(tag, error));
25
+ }
20
26
  sendReportToPlugins(tag, level, payload) {
21
27
  this.providers.forEach((plugin)=>plugin.report(tag, level, payload));
22
28
  }
@@ -2,6 +2,7 @@ const logLevel = {
2
2
  DEBUG: "DEBUG",
3
3
  INFO: "INFO",
4
4
  WARN: "WARN",
5
- ERROR: "ERROR"
5
+ ERROR: "ERROR",
6
+ FATAL: "FATAL"
6
7
  };
7
8
  export { logLevel };
@@ -12,8 +12,8 @@ class LogProvider {
12
12
  error: true
13
13
  }
14
14
  };
15
- constructor(providers, logProviderConfig = this.logProviderConfig){
16
- this.logProviderConfig = logProviderConfig;
15
+ constructor(providers, logProviderConfig){
16
+ if (logProviderConfig) this.logProviderConfig = logProviderConfig;
17
17
  this.providers = providers;
18
18
  this.initialize();
19
19
  }
@@ -1,2 +1,4 @@
1
1
  import { DuckSDK } from "./DuckSDK.js";
2
- export { DuckSDK };
2
+ import { logLevel } from "./LogLevel.js";
3
+ import { LogProvider } from "./LogProvider.js";
4
+ export { DuckSDK, LogProvider, logLevel };
package/dist/esm/index.js CHANGED
@@ -1,4 +1,2 @@
1
- import { DuckBugProvider } from "./DuckBug/DuckBugProvider.js";
2
- import { DuckSDK } from "./SDK/index.js";
3
- export * from "./Log/index.js";
4
- export { DuckBugProvider, DuckSDK };
1
+ export * from "./DuckBug/index.js";
2
+ export * from "./SDK/index.js";
@@ -0,0 +1,3 @@
1
+ export type DuckBugConfig = {
2
+ dsn: string;
3
+ };
@@ -1,14 +1,14 @@
1
- import type { LogLevel } from "../Log";
2
- import type { Provider } from "../Provider";
3
- import type { DuckConfig } from "../SDK";
1
+ import { type LogLevel, type Provider } from "../SDK";
2
+ import type { DuckBugConfig } from "./DuckBugConfig";
3
+ import { DuckBugService } from "./DuckBugService";
4
4
  export declare class DuckBugProvider implements Provider {
5
- config: DuckConfig;
6
- constructor(config: DuckConfig);
5
+ service: DuckBugService;
6
+ constructor(config: DuckBugConfig);
7
7
  warn(...args: unknown[]): void;
8
8
  error(...args: unknown[]): void;
9
9
  log(...args: unknown[]): void;
10
10
  report(tag: string, level: LogLevel, payload?: object): void;
11
+ quack(tag: string, error: Error): void;
11
12
  private convertArgsToString;
12
13
  private getTimeStamp;
13
- private sendLog;
14
14
  }
@@ -0,0 +1,12 @@
1
+ import type { DuckBugConfig } from "./DuckBugConfig";
2
+ import type { Log } from "./Log";
3
+ export declare class DuckBugService {
4
+ private config;
5
+ constructor(config: DuckBugConfig);
6
+ sendLog(logInfo: Log): void;
7
+ sendError(errorInfo: {
8
+ message: string;
9
+ stack?: string;
10
+ context: string;
11
+ }): void;
12
+ }
@@ -1,7 +1,7 @@
1
- import type { LogLevel } from "./LogLevel";
1
+ import type { LogLevel } from "../SDK/LogLevel";
2
2
  export type Log = {
3
3
  message: string;
4
4
  level: LogLevel;
5
5
  time: number;
6
- context: string | undefined;
6
+ context: object | undefined;
7
7
  };
@@ -0,0 +1,2 @@
1
+ export type { DuckBugConfig } from "./DuckBugConfig";
2
+ export { DuckBugProvider } from "./DuckBugProvider";
@@ -1,5 +1,4 @@
1
- import type { LogProviderConfig } from "../Log";
2
- import type { Provider } from "../Provider";
1
+ import type { LogProviderConfig, Provider } from ".";
3
2
  export declare class DuckSDK {
4
3
  private providers;
5
4
  constructor(providers: Array<Provider>, logProviderConfig?: LogProviderConfig);
@@ -7,5 +6,7 @@ export declare class DuckSDK {
7
6
  error(tag: string, payload?: object): void;
8
7
  debug(tag: string, payload?: object): void;
9
8
  warn(tag: string, payload?: object): void;
9
+ fatal(tag: string, payload?: object): void;
10
+ quack(tag: string, error: Error): void;
10
11
  private sendReportToPlugins;
11
12
  }
@@ -0,0 +1,2 @@
1
+ export type LogLevel = "DEBUG" | "INFO" | "WARN" | "ERROR" | "FATAL";
2
+ export declare const logLevel: Record<LogLevel, LogLevel>;
@@ -1,5 +1,5 @@
1
- import type { Provider } from "../Provider";
2
1
  import type { LogProviderConfig } from "./LogProviderConfig";
2
+ import type { Provider } from "./Provider";
3
3
  export declare class LogProvider {
4
4
  private originalConsole;
5
5
  private providers;
@@ -1,7 +1,8 @@
1
- import type { LogLevel } from "../Log";
1
+ import type { LogLevel } from "./LogLevel";
2
2
  export interface Provider {
3
3
  log(...args: unknown[]): void;
4
4
  warn(...args: unknown[]): void;
5
5
  error(...args: unknown[]): void;
6
6
  report(tag: string, level: LogLevel, payload?: object): void;
7
+ quack(tag: string, error: Error): void;
7
8
  }
@@ -1,2 +1,6 @@
1
- export type { DuckConfig } from "./DuckConfig";
1
+ export type { Provider } from "../SDK/Provider";
2
2
  export { DuckSDK } from "./DuckSDK";
3
+ export type { LogLevel } from "./LogLevel";
4
+ export { logLevel } from "./LogLevel";
5
+ export { LogProvider } from "./LogProvider";
6
+ export type { LogProviderConfig } from "./LogProviderConfig";
@@ -1,5 +1,2 @@
1
- export { DuckBugProvider } from "./DuckBug/DuckBugProvider";
2
- export * from "./Log";
3
- export type { Provider } from "./Provider/Provider";
4
- export type { DuckConfig } from "./SDK";
5
- export { DuckSDK } from "./SDK";
1
+ export * from "./DuckBug";
2
+ export * from "./SDK";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@duckbug/js",
3
- "version": "0.1.1",
3
+ "version": "0.1.3",
4
4
  "type": "module",
5
5
  "main": "./dist/cjs/index.cjs",
6
6
  "module": "./dist/esm/index.js",
@@ -24,15 +24,18 @@
24
24
  "scripts": {
25
25
  "build": "rslib build",
26
26
  "lint": "yarn biome ci",
27
- "prepare": "husky"
27
+ "prepare": "husky",
28
+ "test": "vitest run",
29
+ "publish": "yarn build && npm publish"
28
30
  },
29
31
  "devDependencies": {
30
- "@biomejs/biome": "^2.1.1",
31
- "@rslib/core": "^0.10.6",
32
- "husky": "^9.1.7",
33
- "pinst": "^3.0.0",
34
- "ts-node": "^10.9.2",
35
- "typescript": "^5.8.3"
32
+ "@biomejs/biome": "2.1.1",
33
+ "@rslib/core": "0.10.6",
34
+ "husky": "9.1.7",
35
+ "pinst": "3.0.0",
36
+ "ts-node": "10.9.2",
37
+ "typescript": "5.8.3",
38
+ "vitest": "^3.2.4"
36
39
  },
37
40
  "packageManager": "yarn@3.8.7"
38
41
  }
@@ -1,18 +0,0 @@
1
- "use strict";
2
- var __webpack_require__ = {};
3
- (()=>{
4
- __webpack_require__.r = (exports1)=>{
5
- if ('undefined' != typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
6
- value: 'Module'
7
- });
8
- Object.defineProperty(exports1, '__esModule', {
9
- value: true
10
- });
11
- };
12
- })();
13
- var __webpack_exports__ = {};
14
- __webpack_require__.r(__webpack_exports__);
15
- for(var __webpack_i__ in __webpack_exports__)exports[__webpack_i__] = __webpack_exports__[__webpack_i__];
16
- Object.defineProperty(exports, '__esModule', {
17
- value: true
18
- });
@@ -1,3 +0,0 @@
1
- import { logLevel } from "./LogLevel.js";
2
- import { LogProvider } from "./LogProvider.js";
3
- export { LogProvider, logLevel };
File without changes
@@ -1,2 +0,0 @@
1
- export type LogLevel = "DEBUG" | "INFO" | "WARN" | "ERROR";
2
- export declare const logLevel: Record<LogLevel, LogLevel>;
@@ -1,5 +0,0 @@
1
- export type { Log } from "./Log";
2
- export type { LogLevel } from "./LogLevel";
3
- export { logLevel } from "./LogLevel";
4
- export { LogProvider } from "./LogProvider";
5
- export type { LogProviderConfig } from "./LogProviderConfig";
@@ -1 +0,0 @@
1
- export type { Provider } from "./Provider";
@@ -1,3 +0,0 @@
1
- export type DuckConfig = {
2
- dsn: string;
3
- };
File without changes
File without changes