diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 00000000..6b3bddb5 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,17 @@ +{ + "version": "0.1.0", + "configurations": [ + { + "name": "Launch", + "program": "${workspaceFolder}/examples/sdk/node/lib/index.js", + "request": "launch", + "localRoot": "${workspaceFolder}", + "remoteRoot": "${workspaceFolder}", + "skipFiles": ["/**", "${workspaceFolder}/node_modules/tslib/**/*.js"], + "outFiles": ["${workspaceFolder}/examples/sdk/node/lib/**/*.js"], + "sourceMaps": true, + "type": "pwa-node", + "console": "integratedTerminal" + } + ] +} diff --git a/examples/sdk/node/package-lock.json b/examples/sdk/node/package-lock.json new file mode 100644 index 00000000..0177be83 --- /dev/null +++ b/examples/sdk/node/package-lock.json @@ -0,0 +1,40 @@ +{ + "name": "@backtrace/node-example", + "version": "1.0.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "@backtrace/node-example", + "version": "1.0.0", + "license": "MIT", + "devDependencies": { + "typescript": "^5.1.3" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/typescript": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.3.tgz", + "integrity": "sha512-XH627E9vkeqhlZFQuL+UsyAXEnibT0kWR2FWONlr4sTjvxyJYnyefgrkyECLzM5NenmKzRAy2rR/OlYLA1HkZw==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + } + }, + "dependencies": { + "typescript": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.3.tgz", + "integrity": "sha512-XH627E9vkeqhlZFQuL+UsyAXEnibT0kWR2FWONlr4sTjvxyJYnyefgrkyECLzM5NenmKzRAy2rR/OlYLA1HkZw==", + "dev": true + } + } +} diff --git a/examples/sdk/node/package.json b/examples/sdk/node/package.json new file mode 100644 index 00000000..e34f07fe --- /dev/null +++ b/examples/sdk/node/package.json @@ -0,0 +1,39 @@ +{ + "name": "@backtrace/node-example", + "version": "1.0.0", + "description": "@backtrace/node example", + "main": "lib/index.js", + "types": "lib/index.d.ts", + "engines": { + "node": ">=14" + }, + "scripts": { + "build": "tsc", + "clean": "rimraf \"lib\"", + "format": "prettier --write '**/*.ts'", + "lint": "eslint . --ext .ts", + "watch": "tsc -w" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/backtrace-labs/backtrace-javascript.git" + }, + "keywords": [ + "Error", + "Reporting", + "Diagnostic", + "Tool", + "Bug", + "Bugs", + "StackTrace" + ], + "author": "Backtrace ", + "license": "MIT", + "bugs": { + "url": "https://github.com/backtrace-labs/backtrace-javascript/issues" + }, + "homepage": "https://github.com/backtrace-labs/backtrace-javascript#readme", + "devDependencies": { + "typescript": "^5.1.3" + } +} diff --git a/examples/sdk/node/src/consts.ts b/examples/sdk/node/src/consts.ts new file mode 100644 index 00000000..dd29bab4 --- /dev/null +++ b/examples/sdk/node/src/consts.ts @@ -0,0 +1,2 @@ +export const SUBMISSION_URL = + 'https://submit.backtrace.io/your-universe/0000000000000000000000000000000000000000000000000000000000000000/json'; diff --git a/examples/sdk/node/src/index.ts b/examples/sdk/node/src/index.ts new file mode 100644 index 00000000..e4f38078 --- /dev/null +++ b/examples/sdk/node/src/index.ts @@ -0,0 +1,72 @@ +import { BacktraceClient } from '@backtrace/node'; +import fs from 'fs'; +import path from 'path'; +import { exit } from 'process'; +import readline from 'readline'; +import { SUBMISSION_URL } from './consts'; +const reader = readline.createInterface({ + input: process.stdin, + output: process.stdout, +}); + +const client = BacktraceClient.builder({ + url: SUBMISSION_URL, + attachments: [path.join(path.dirname(process.cwd()), 'samplefile.txt')], + rateLimit: 5, + userAttributes: { + 'custom-attribute': 'test', + 'custom-annotation': { + prop1: true, + prop2: 123, + }, + }, +}).build(); + +console.log('Welcome to the @Backtrace/node demo'); + +async function sendHandledException(attributes: Record) { + console.log('Sending an error to Backtrace'); + try { + fs.readFileSync('/path/to/not/existing/file'); + } catch (err) { + await client.send(err as Error, attributes); + } +} + +async function sendMessage(message: string, attributes: Record) { + console.log('Sending a text message to Backtrace'); + await client.send(message, attributes); +} + +function showMenu() { + const menu = + `Please pick one of available options:` + + `1. Send an exception` + + `2. Send a message` + + `0. Exit` + + `Type the option number:`; + reader.question(menu, async function executeUserOption(optionString: string) { + const option = parseInt(optionString); + + const attributes = { selectedOption: option }; + + switch (option) { + case 1: { + return await sendHandledException(attributes); + } + case 2: { + return await sendMessage('test message', attributes); + } + case 0: { + reader.close(); + return exit(0); + } + default: { + console.log('Selected invalid option. Please try again.'); + } + } + return showMenu(); + }); +} + +showMenu(); diff --git a/examples/sdk/node/tsconfig.json b/examples/sdk/node/tsconfig.json new file mode 100644 index 00000000..688a3eb7 --- /dev/null +++ b/examples/sdk/node/tsconfig.json @@ -0,0 +1,13 @@ +{ + "extends": "../../../tsconfig.base.json", + "compilerOptions": { + "outDir": "./lib", + "rootDir": "./src" + }, + "exclude": ["node_modules", "tests", "lib"], + "references": [ + { + "path": "../../../packages/node/tsconfig.json" + } + ] +} diff --git a/package.json b/package.json index 16eba8fe..c6ed3774 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,8 @@ }, "workspaces": [ "packages/*", - "tools/*" + "tools/*", + "examples/*" ], "repository": { "type": "git", diff --git a/packages/node/samplefile.txt b/packages/node/samplefile.txt new file mode 100644 index 00000000..6a537b5b --- /dev/null +++ b/packages/node/samplefile.txt @@ -0,0 +1 @@ +1234567890 \ No newline at end of file diff --git a/packages/node/tsconfig.json b/packages/node/tsconfig.json index 42e1d91e..c93b0f5b 100644 --- a/packages/node/tsconfig.json +++ b/packages/node/tsconfig.json @@ -2,7 +2,8 @@ "extends": "../../tsconfig.base.json", "compilerOptions": { "outDir": "./lib", - "rootDir": "./src" + "rootDir": "./src", + "composite": true }, "exclude": ["node_modules", "tests", "lib"], "references": [ diff --git a/tsconfig.json b/tsconfig.json index 7c24632e..4030b6ff 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,6 +1,6 @@ { "extends": "./tsconfig.base.json", - "include": ["packages/**/*"], + "include": [], "exclude": ["./test", "./lib"], "references": [ {