The official JavaScript SDK for DuckBug.io - a flexible logging and error tracking platform.
- π¦ Simple Integration: Easy setup with DuckBug.io
- π Provider Architecture: Extensible plugin system for custom logging providers
- π Multiple Log Levels: Support for debug, info, warn, and error levels
- π― TypeScript Support: Full TypeScript support with type definitions
- π¦ Dual Module Format: Both CommonJS and ES Module support
- β‘ Lightweight: Minimal dependencies and small bundle size
# npm
npm install @duckbug/js
# yarn
yarn add @duckbug/js
# pnpm
pnpm add @duckbug/jsimport { DuckSDK, DuckBugProvider } from '@duckbug/js';
// Initialize with DuckBug.io provider
const providers = [
new DuckBugProvider({
dsn: 'your-duckbug-dsn-here'
})
];
// Create SDK instance with optional configuration
const duck = new DuckSDK(providers, {
logReports: {
log: false,
warn: true,
error: true,
}
});
// Start logging
duck.log('Info message', { userId: 123, action: 'user_login' });
duck.debug('Debug message', { debugInfo: 'Connection established' });
duck.warn('Warning message', { warning: 'Rate limit approaching' });
duck.error('Error message', { error: 'Database connection failed' });
duck.fatal('Fatal message', { error: 'Ay, caramba' });
//Send error
const testError = new Error("Integration test error");
testError.stack =
"Error: Integration test error\n at integration.test.ts:1:1";
// Use quack method directly on provider
duckBugProvider.quack("INTEGRATION_ERROR", testError);The main SDK class that manages logging across multiple providers.
new DuckSDK(providers: Provider[], config?: LogProviderConfig)providers: Array of provider instancesconfig: Optional configuration for log reporting levels
log(tag: string, payload?: object): Log an info-level messagedebug(tag: string, payload?: object): Log a debug-level messagewarn(tag: string, payload?: object): Log a warning-level messageerror(tag: string, payload?: object): Log an error-level messagefatal(tag: string, payload?: object): Log an fatal-level messagequack(tag: string, error: Error): Report error
The official DuckBug.io provider for sending logs to the DuckBug.io platform.
new DuckBugProvider(config: DuckConfig)config.dsn: Your DuckBug.io DSN (Data Source Name)
type LogProviderConfig = {
logReports: {
log?: boolean; // Enable/disable info logs (default: false)
warn?: boolean; // Enable/disable warning logs (default: true)
error?: boolean; // Enable/disable error logs (default: true)
}
}You can create custom providers by implementing the Provider interface:
import { Provider, LogLevel } from '@duckbug/js';
class TelegramProvider implements Provider {
constructor(private botToken: string, private chatId: string) {}
log(...args: unknown[]): void {
this.sendToTelegram('π', args);
}
warn(...args: unknown[]): void {
this.sendToTelegram('β οΈ', args);
}
error(...args: unknown[]): void {
this.sendToTelegram('π¨', args);
}
report(tag: string, level: LogLevel, payload?: object): void {
const emojiMap: Record<LogLevel, string> = {
INFO: 'π',
DEBUG: 'π¦',
WARN: 'β οΈ',
ERROR: 'π¨',
FATAL: 'π',
};
this.sendToTelegram(emojiMap[level], [tag, payload]);
}
quack(tag: string, error: Error): void {
this.sendToTelegram('π', [tag, error.message]);
}
private sendToTelegram(emoji: string, args: unknown[]) {
const message = `${emoji} ${args.join(' ')}`;
// Implementation to send message to Telegram
fetch(`https://api.telegram.org/bot${this.botToken}/sendMessage`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
chat_id: this.chatId,
text: message
})
});
}
}
// Usage
const providers = [
new DuckBugProvider({ dsn: 'your-dsn' }),
new TelegramProvider('your-bot-token', 'your-chat-id')
];
const duck = new DuckSDK(providers);Install dependencies:
bun installBuild the library:
bun run buildRun linting:
bun run lintΠΡΠΎΡ ΠΏΡΠΎΠ΅ΠΊΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ Conventional Commits Π΄Π»Ρ ΡΡΠ°Π½Π΄Π°ΡΡΠΈΠ·Π°ΡΠΈΠΈ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ ΠΊΠΎΠΌΠΌΠΈΡΠΎΠ². ΠΡΠ΅ ΠΊΠΎΠΌΠΌΠΈΡΡ Π΄ΠΎΠ»ΠΆΠ½Ρ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΎΠ²Π°ΡΡ ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΌΡ ΡΠΎΡΠΌΠ°ΡΡ:
<type>(<scope>): <subject>
<body>
<footer>
feat: ΠΠΎΠ²Π°Ρ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎΡΡΡfix: ΠΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π±Π°Π³Π°docs: ΠΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ Π² Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈstyle: Π€ΠΎΡΠΌΠ°ΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊΠΎΠ΄Π° (Π½Π΅ Π²Π»ΠΈΡΠ΅Ρ Π½Π° Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ΄Π°)refactor: Π Π΅ΡΠ°ΠΊΡΠΎΡΠΈΠ½Π³ ΠΊΠΎΠ΄Π°perf: Π£Π»ΡΡΡΠ΅Π½ΠΈΠ΅ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈtest: ΠΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΈΠ»ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΡΠ΅ΡΡΠΎΠ²build: ΠΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ Π² ΡΠΈΡΡΠ΅ΠΌΠ΅ ΡΠ±ΠΎΡΠΊΠΈ ΠΈΠ»ΠΈ Π²Π½Π΅ΡΠ½ΠΈΡ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΡΡci: ΠΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ Π² CI ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈchore: ΠΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ Π·Π°Π΄Π°Ρ ΡΠ±ΠΎΡΠΊΠΈ, Π½Π°ΡΡΡΠΎΠ΅ΠΊ ΠΈ Ρ.Π΄.revert: ΠΡΠΊΠ°Ρ ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ΅Π³ΠΎ ΠΊΠΎΠΌΠΌΠΈΡΠ°
feat: Π΄ΠΎΠ±Π°Π²ΠΈΡΡ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΡ Π»ΠΎΠ³ΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΎΡΠΈΠ±ΠΎΠΊ
fix: ΠΈΡΠΏΡΠ°Π²ΠΈΡΡ ΡΡΠ΅ΡΠΊΡ ΠΏΠ°ΠΌΡΡΠΈ Π² DuckBugProvider
docs: ΠΎΠ±Π½ΠΎΠ²ΠΈΡΡ README Ρ ΠΏΡΠΈΠΌΠ΅ΡΠ°ΠΌΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ
test: Π΄ΠΎΠ±Π°Π²ΠΈΡΡ ΡΠ΅ΡΡΡ Π΄Π»Ρ DuckSDK
refactor: ΡΠ»ΡΡΡΠΈΡΡ ΡΡΡΡΠΊΡΡΡΡ ΠΊΠ»Π°ΡΡΠΎΠ² ΠΏΡΠΎΠ²Π°ΠΉΠ΄Π΅ΡΠΎΠ²ΠΠ²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠ°Ρ ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° ΡΠΎΡΠΌΠ°ΡΠ° ΠΊΠΎΠΌΠΌΠΈΡΠΎΠ² Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ ΡΠ΅ΡΠ΅Π· git hook. ΠΡΠΈ ΡΠΎΠ·Π΄Π°Π½ΠΈΠΈ ΠΊΠΎΠΌΠΌΠΈΡΠ° Ρ Π½Π΅ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΡΠΌ ΡΠΎΡΠΌΠ°ΡΠΎΠΌ Π²Ρ ΠΏΠΎΠ»ΡΡΠΈΡΠ΅ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎΠ΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎΠ± ΠΎΡΠΈΠ±ΠΊΠ΅ Ρ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ΠΌ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ ΠΈ ΠΏΡΠΈΠΌΠ΅ΡΠ°ΠΌΠΈ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎΠ³ΠΎ ΡΠΎΡΠΌΠ°ΡΠ°.
ΠΡΠΈΠΌΠ΅ΡΡ ΠΎΡΠΈΠ±ΠΎΠΊ:
β ΠΡΠ»ΠΈ Π·Π°Π±ΡΠ»ΠΈ ΡΠΊΠ°Π·Π°ΡΡ ΡΠΈΠΏ:
β Π’ΠΈΠΏ ΠΊΠΎΠΌΠΌΠΈΡΠ° ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»Π΅Π½!
π Π€ΠΎΡΠΌΠ°Ρ ΠΊΠΎΠΌΠΌΠΈΡΠ°: <type>: <ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅>
π‘ ΠΡΠΈΠΌΠ΅ΡΡ:
feat: Π΄ΠΎΠ±Π°Π²ΠΈΡΡ Π½ΠΎΠ²ΡΡ ΡΡΠ½ΠΊΡΠΈΡ
fix: ΠΈΡΠΏΡΠ°Π²ΠΈΡΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΡ ΠΎΡΠΈΠ±ΠΎΠΊ
β ΠΡΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π»ΠΈ Π½Π΅ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΡΠΉ ΡΠΈΠΏ:
β ΠΠ΅Π²Π΅ΡΠ½ΡΠΉ ΡΠΈΠΏ ΠΊΠΎΠΌΠΌΠΈΡΠ°!
β
ΠΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Π΄ΠΎΠΏΡΡΡΠΈΠΌΡΡ
ΡΠΈΠΏΠΎΠ²:
- feat: Π½ΠΎΠ²Π°Ρ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎΡΡΡ
- fix: ΠΈΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π±Π°Π³Π°
...
ΠΠ»Ρ ΡΡΡΠ½ΠΎΠΉ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ ΠΊΠΎΠΌΠΌΠΈΡΠ°:
bun run commitlint -- --from HEAD~1 --to HEADΠΡΠΎΡ ΠΏΡΠΎΠ΅ΠΊΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ semantic-release Π΄Π»Ρ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ Π²Π΅ΡΡΠΈΡΠΌΠΈ ΠΈ ΡΠ΅Π»ΠΈΠ·Π°ΠΌΠΈ.
-
ΠΠ΅ΡΡΠΈΠΎΠ½ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅: ΠΠ΅ΡΡΠΈΡ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΠΎΠ±Π½ΠΎΠ²Π»ΡΠ΅ΡΡΡ Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ ΡΠΈΠΏΠΎΠ² ΠΊΠΎΠΌΠΌΠΈΡΠΎΠ²:
feat:β ΠΌΠΈΠ½ΠΎΡΠ½ΠΎΠ΅ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ (1.0.0 β 1.1.0)fix:β ΠΏΠ°ΡΡ (1.0.0 β 1.0.1)BREAKING CHANGEΠΈΠ»ΠΈfeat!:β ΠΌΠ°ΠΆΠΎΡΠ½ΠΎΠ΅ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ (1.0.0 β 2.0.0)chore:,docs:,style:ΠΈ Π΄ΡΡΠ³ΠΈΠ΅ β Π±Π΅Π· ΡΠ΅Π»ΠΈΠ·Π°
-
ΠΠ²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠ΅ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ ΠΏΡΠΈ ΠΏΡΡΠ΅ Π²
main:- ΠΠ½Π°Π»ΠΈΠ· ΠΊΠΎΠΌΠΌΠΈΡΠΎΠ² Ρ ΠΏΠΎΡΠ»Π΅Π΄Π½Π΅Π³ΠΎ ΡΠ΅Π»ΠΈΠ·Π°
- ΠΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π½ΠΎΠ²ΠΎΠΉ Π²Π΅ΡΡΠΈΠΈ
- ΠΠ΅Π½Π΅ΡΠ°ΡΠΈΡ CHANGELOG.md
- ΠΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ Π²Π΅ΡΡΠΈΠΈ Π² package.json
- Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ git ΡΠ΅Π³Π°
- ΠΡΠ±Π»ΠΈΠΊΠ°ΡΠΈΡ Π² npm
- Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ GitHub Release Ρ Π·Π°ΠΌΠ΅ΡΠΊΠ°ΠΌΠΈ
-
Π‘ΠΎΠ·Π΄Π°ΠΉΡΠ΅ NPM ΡΠΎΠΊΠ΅Π½ (ΡΠΎΠ»ΡΠΊΠΎ Π΄Π»Ρ ΠΏΡΠ±Π»ΠΈΠΊΠ°ΡΠΈΠΈ):
- ΠΠ΅ΡΠ΅ΠΉΠ΄ΠΈΡΠ΅ Π½Π° https://www.npmjs.com/settings/YOUR_USERNAME/tokens
- Π‘ΠΎΠ·Π΄Π°ΠΉΡΠ΅ ΡΠΎΠΊΠ΅Π½ Ρ ΠΏΡΠ°Π²Π°ΠΌΠΈ
Automation - ΠΠΎΠ±Π°Π²ΡΡΠ΅ Π΅Π³ΠΎ Π² GitHub Secrets ΠΊΠ°ΠΊ
NPM_TOKEN
-
GitHub Actions:
- Workflow
release.yamlΠ°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ Π·Π°ΠΏΡΡΠΊΠ°Π΅ΡΡΡ ΠΏΡΠΈ ΠΏΡΡΠ΅ Π²mainΠΈΠ»ΠΈbeta - ΠΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ
GITHUB_TOKEN(Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅ΡΡΡ GitHub Actions) - ΠΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ
NPM_TOKENΠΈΠ· ΡΠ΅ΠΊΡΠ΅ΡΠΎΠ² Π΄Π»Ρ ΠΏΡΠ±Π»ΠΈΠΊΠ°ΡΠΈΠΈ Π² npm
- Workflow
# ΠΠ°ΡΡ ΡΠ΅Π»ΠΈΠ· (1.0.0 β 1.0.1)
fix: ΠΈΡΠΏΡΠ°Π²ΠΈΡΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΡ ΠΎΡΠΈΠ±ΠΎΠΊ Π² DuckBugProvider
# ΠΠΈΠ½ΠΎΡΠ½ΡΠΉ ΡΠ΅Π»ΠΈΠ· (1.0.0 β 1.1.0)
feat: Π΄ΠΎΠ±Π°Π²ΠΈΡΡ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΡ ΡΠΈΠ»ΡΡΡΠ°ΡΠΈΠΈ Π»ΠΎΠ³ΠΎΠ²
# ΠΠ°ΠΆΠΎΡΠ½ΡΠΉ ΡΠ΅Π»ΠΈΠ· (1.0.0 β 2.0.0)
feat!: ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ API ΠΏΡΠΎΠ²Π°ΠΉΠ΄Π΅ΡΠΎΠ²
# ΠΈΠ»ΠΈ
feat: Π΄ΠΎΠ±Π°Π²ΠΈΡΡ Π½ΠΎΠ²ΡΡ ΡΡΠ½ΠΊΡΠΈΡ
BREAKING CHANGE: ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Π° ΡΡΡΡΠΊΡΡΡΠ° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ DuckBugProviderΠΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΠ΅: ΠΠΎΠΌΠΌΠΈΡΡ Π±Π΅Π· ΡΠΈΠΏΠ° ΠΈΠ»ΠΈ Ρ ΡΠΈΠΏΠΎΠΌ chore, docs, style Π½Π΅ ΡΠΎΠ·Π΄Π°ΡΡ Π½ΠΎΠ²ΡΠΉ ΡΠ΅Π»ΠΈΠ·, Π½ΠΎ ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ Π²ΠΊΠ»ΡΡΠ΅Π½Ρ Π² CHANGELOG.
This package includes TypeScript definitions. All exports are fully typed:
import type { Provider, DuckConfig, LogLevel } from '@duckbug/js';This SDK works in all modern browsers that support:
- ES2015+ (ES6)
- Fetch API
- JSON API
For older browsers, you may need to include polyfills.
MIT Β© DuckBug.io
- π Issues: GitHub Issues
Made with π¦ by the DuckBug.io team