From 2f5e8078550e045c6c18e807f1905b906ff98f96 Mon Sep 17 00:00:00 2001 From: Konrad Dysput Date: Fri, 23 Jun 2023 14:58:53 +0200 Subject: [PATCH 1/5] Node.js example --- .vscode/launch.json | 17 ++++++++ examples/sdk/node/package-lock.json | 40 +++++++++++++++++ examples/sdk/node/package.json | 39 +++++++++++++++++ examples/sdk/node/src/consts.ts | 2 + examples/sdk/node/src/index.ts | 67 +++++++++++++++++++++++++++++ examples/sdk/node/tsconfig.json | 13 ++++++ packages/node/samplefile.txt | 1 + packages/node/tsconfig.json | 3 +- 8 files changed, 181 insertions(+), 1 deletion(-) create mode 100644 .vscode/launch.json create mode 100644 examples/sdk/node/package-lock.json create mode 100644 examples/sdk/node/package.json create mode 100644 examples/sdk/node/src/consts.ts create mode 100644 examples/sdk/node/src/index.ts create mode 100644 examples/sdk/node/tsconfig.json create mode 100644 packages/node/samplefile.txt 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..d1f0b8e2 --- /dev/null +++ b/examples/sdk/node/src/index.ts @@ -0,0 +1,67 @@ +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', + 'complex-attribute': { + prop1: true, + prop2: 123, + }, + }, +}).build(); + +console.log( + `Welcome in the Backtrace demo. Please pick one of available options + 1. Send an exception + 2. Send a message + + 0. Exit`, +); + +function showMenu() { + reader.question('Select the option... \n', async function executeUserOption(optionString: string) { + const option = parseInt(optionString); + if (isNaN(option)) { + console.error('Selected invalid option'); + return exit(1); + } + const attributes = { selectedOption: option }; + + switch (option) { + case 1: { + try { + fs.readFileSync('/path/to/not/existing/file'); + } catch (err) { + await client.send(err as Error, attributes); + } + break; + } + case 2: { + await client.send('test message', attributes); + break; + } + case 0: { + reader.close(); + return exit(0); + } + default: { + console.log('Selected unrecognized 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/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": [ From f5ae443ac9ec1732f383eb200fa119245313f407 Mon Sep 17 00:00:00 2001 From: Konrad Dysput Date: Fri, 23 Jun 2023 18:13:52 +0200 Subject: [PATCH 2/5] Avoid building other packages and include examples in the workspace list --- package.json | 3 ++- tsconfig.json | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) 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/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": [ { From 0ea68d9ee2788d4fceaaf71c7cdcdffad0ed4f69 Mon Sep 17 00:00:00 2001 From: Konrad Dysput Date: Mon, 26 Jun 2023 14:34:58 +0200 Subject: [PATCH 3/5] Code review adjustements --- examples/sdk/node/src/index.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/sdk/node/src/index.ts b/examples/sdk/node/src/index.ts index d1f0b8e2..16695d70 100644 --- a/examples/sdk/node/src/index.ts +++ b/examples/sdk/node/src/index.ts @@ -15,7 +15,7 @@ const client = BacktraceClient.builder({ rateLimit: 5, userAttributes: { 'custom-attribute': 'test', - 'complex-attribute': { + 'custom-annotation': { prop1: true, prop2: 123, }, @@ -23,7 +23,7 @@ const client = BacktraceClient.builder({ }).build(); console.log( - `Welcome in the Backtrace demo. Please pick one of available options + `Welcome to the Backtrace demo. Please pick one of available options 1. Send an exception 2. Send a message From 57b59cb7643010fa6153981b2c58314530770afe Mon Sep 17 00:00:00 2001 From: Konrad Dysput Date: Mon, 26 Jun 2023 19:30:24 +0200 Subject: [PATCH 4/5] Menu adjustements --- examples/sdk/node/src/index.ts | 43 ++++++++++++++++++++-------------- 1 file changed, 25 insertions(+), 18 deletions(-) diff --git a/examples/sdk/node/src/index.ts b/examples/sdk/node/src/index.ts index 16695d70..f30b8f96 100644 --- a/examples/sdk/node/src/index.ts +++ b/examples/sdk/node/src/index.ts @@ -22,34 +22,41 @@ const client = BacktraceClient.builder({ }, }).build(); -console.log( - `Welcome to the Backtrace demo. Please pick one of available options - 1. Send an exception - 2. Send a message +console.log('Welcome to the @Backtrace/node demo'); +const menu = `Please pick one of available options: +1. Send an exception +2. Send a message +0. Exit + +Type the option number:`; - 0. Exit`, -); +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() { - reader.question('Select the option... \n', async function executeUserOption(optionString: string) { + reader.question(menu, async function executeUserOption(optionString: string) { const option = parseInt(optionString); - if (isNaN(option)) { - console.error('Selected invalid option'); - return exit(1); - } + const attributes = { selectedOption: option }; switch (option) { case 1: { - try { - fs.readFileSync('/path/to/not/existing/file'); - } catch (err) { - await client.send(err as Error, attributes); - } + await sendHandledException(attributes); break; } case 2: { - await client.send('test message', attributes); + await sendMessage('test message', attributes); break; } case 0: { @@ -57,7 +64,7 @@ function showMenu() { return exit(0); } default: { - console.log('Selected unrecognized option. Please try again.'); + console.log('Selected invalid option. Please try again.'); } } return showMenu(); From 140bc18d80cb49e50250ff678c1f49acb8e2cb68 Mon Sep 17 00:00:00 2001 From: Konrad Dysput Date: Tue, 27 Jun 2023 16:42:51 +0200 Subject: [PATCH 5/5] move variables to functions, return from switch/case --- examples/sdk/node/src/index.ts | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/examples/sdk/node/src/index.ts b/examples/sdk/node/src/index.ts index f30b8f96..e4f38078 100644 --- a/examples/sdk/node/src/index.ts +++ b/examples/sdk/node/src/index.ts @@ -23,12 +23,6 @@ const client = BacktraceClient.builder({ }).build(); console.log('Welcome to the @Backtrace/node demo'); -const menu = `Please pick one of available options: -1. Send an exception -2. Send a message -0. Exit - -Type the option number:`; async function sendHandledException(attributes: Record) { console.log('Sending an error to Backtrace'); @@ -45,6 +39,12 @@ async function sendMessage(message: string, attributes: Record) } 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); @@ -52,12 +52,10 @@ function showMenu() { switch (option) { case 1: { - await sendHandledException(attributes); - break; + return await sendHandledException(attributes); } case 2: { - await sendMessage('test message', attributes); - break; + return await sendMessage('test message', attributes); } case 0: { reader.close();