diff --git a/.gitignore b/.gitignore index f13a90d..34a50e9 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,7 @@ .env.local .env.production.local .env.test.local +.npmrc coverage dist node_modules diff --git a/bun.lock b/bun.lock index 1da2184..73143a5 100644 --- a/bun.lock +++ b/bun.lock @@ -19,6 +19,20 @@ "typescript": "5.8.2", }, }, + "packages/truffle-bunjs": { + "name": "@wafflestudio/truffle-bunjs", + "version": "0.2.1", + "dependencies": { + "error-stack-parser": "^2.1.4", + }, + "devDependencies": { + "tsup": "8.4.0", + "typescript": "5.8.2", + }, + "peerDependencies": { + "@types/bun": "^1.2.0", + }, + }, }, "packages": { "@babel/runtime": ["@babel/runtime@7.27.0", "", { "dependencies": { "regenerator-runtime": "^0.14.0" } }, "sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw=="], @@ -189,12 +203,18 @@ "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.38.0", "", { "os": "win32", "cpu": "x64" }, "sha512-jjqy3uWlecfB98Psxb5cD6Fny9Fupv9LrDSPTQZUROqjvZmcCqNu4UMl7qqhlUUGpwiAkotj6GYu4SZdcr/nLw=="], + "@types/bun": ["@types/bun@1.2.8", "", { "dependencies": { "bun-types": "1.2.7" } }, "sha512-t8L1RvJVUghW5V+M/fL3Thbxcs0HwNsXsnTEBEfEVqGteiJToOlZ/fyOEaR1kZsNqnu+3XA4RI/qmnX4w6+S+w=="], + "@types/estree": ["@types/estree@1.0.7", "", {}, "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ=="], "@types/node": ["@types/node@12.20.55", "", {}, "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ=="], + "@types/ws": ["@types/ws@8.18.1", "", { "dependencies": { "@types/node": "*" } }, "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg=="], + "@wafflestudio/truffle-browser": ["@wafflestudio/truffle-browser@workspace:packages/truffle-browser"], + "@wafflestudio/truffle-bunjs": ["@wafflestudio/truffle-bunjs@workspace:packages/truffle-bunjs"], + "ansi-colors": ["ansi-colors@4.1.3", "", {}, "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw=="], "ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], @@ -215,6 +235,8 @@ "braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="], + "bun-types": ["bun-types@1.2.7", "", { "dependencies": { "@types/node": "*", "@types/ws": "*" } }, "sha512-P4hHhk7kjF99acXqKvltyuMQ2kf/rzIw3ylEDpCxDS9Xa0X0Yp/gJu/vDCucmWpiur5qJ0lwB2bWzOXa2GlHqA=="], + "bundle-require": ["bundle-require@5.1.0", "", { "dependencies": { "load-tsconfig": "^0.2.3" }, "peerDependencies": { "esbuild": ">=0.18" } }, "sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA=="], "cac": ["cac@6.7.14", "", {}, "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ=="], diff --git a/packages/truffle-bunjs/README.md b/packages/truffle-bunjs/README.md new file mode 100644 index 0000000..2814006 --- /dev/null +++ b/packages/truffle-bunjs/README.md @@ -0,0 +1 @@ +# truffle-browser diff --git a/packages/truffle-bunjs/package.json b/packages/truffle-bunjs/package.json new file mode 100644 index 0000000..65582b9 --- /dev/null +++ b/packages/truffle-bunjs/package.json @@ -0,0 +1,26 @@ +{ + "name": "@wafflestudio/truffle-bunjs", + "version": "0.2.1", + "main": "./dist/index.js", + "types": "./dist/index.d.ts", + "license": "MIT", + "scripts": { + "dev": "bun run build -- --watch", + "build": "tsup src/index.ts --format cjs --dts" + }, + "files": ["dist/index.js", "dist/index.d.ts"], + "keywords": [], + "dependencies": { + "error-stack-parser": "^2.1.4" + }, + "peerDependencies": { + "@types/bun": "*" + }, + "devDependencies": { + "tsup": "8.4.0", + "typescript": "5.8.2" + }, + "publishConfig": { + "access": "public" + } +} diff --git a/packages/truffle-bunjs/src/index.ts b/packages/truffle-bunjs/src/index.ts new file mode 100644 index 0000000..a280789 --- /dev/null +++ b/packages/truffle-bunjs/src/index.ts @@ -0,0 +1,58 @@ +import ErrorStackParser from 'error-stack-parser'; +import { postEvent } from './postEvent'; + +export interface TruffleClient { + capture(message: Error): void; +} + +export interface TruffleConfig { + enabled?: boolean; + app: { name: string; phase: string }; + apiKey: string; +} + +const runtime = { name: 'bunjs', version: Bun.version }; + +export const getTruffleClient = ({ enabled = true, app, apiKey }: TruffleConfig): TruffleClient => { + return { + capture: (error: Error) => { + try { + if (!enabled) return; + + const message = error.message; + const description = window.location.href; + const fallbackNumber = 99999; + const elements = ErrorStackParser.parse(error).map((e) => ({ + className: '', + methodName: e.functionName ?? '', + lineNumber: e.lineNumber ?? fallbackNumber, + fileName: e.fileName ?? '', + isInAppInClude: e.isNative ?? true, + })); + + const body = { + app, + description, + exception: { className: error.name, message, elements }, + runtime, + version: 'v1', + }; + + postEvent(apiKey, body); + } catch (err) { + const body = { + app, + description: err && typeof err === 'object' ? (err as { message?: string }).message : '', + exception: { + className: 'sdk error', + message: 'sdk error', + elements: [], + }, + runtime, + version: 'v1', + }; + postEvent(apiKey, body); + } + }, + }; +}; diff --git a/packages/truffle-bunjs/src/postEvent.ts b/packages/truffle-bunjs/src/postEvent.ts new file mode 100644 index 0000000..0966fd9 --- /dev/null +++ b/packages/truffle-bunjs/src/postEvent.ts @@ -0,0 +1,8 @@ +const baseUrl = 'https://truffle-api.wafflestudio.com'; + +export const postEvent = (apiKey: string, body: unknown) => + fetch(`${baseUrl}/events`, { + method: 'POST', + headers: { 'x-api-key': apiKey, 'content-type': 'application/json' }, + body: JSON.stringify(body), + }); diff --git a/packages/truffle-bunjs/tsconfig.json b/packages/truffle-bunjs/tsconfig.json new file mode 100644 index 0000000..37437f6 --- /dev/null +++ b/packages/truffle-bunjs/tsconfig.json @@ -0,0 +1,21 @@ +{ + "$schema": "https://json.schemastore.org/tsconfig", + "display": "Default", + "compilerOptions": { + "target": "ES2022", + "composite": false, + "declaration": true, + "declarationMap": true, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "inlineSources": false, + "isolatedModules": true, + "moduleResolution": "node", + "noUnusedLocals": false, + "noUnusedParameters": false, + "preserveWatchOutput": true, + "skipLibCheck": true, + "strict": true + }, + "exclude": ["node_modules"] +} diff --git a/packages/truffle-bunjs/vite.config.ts b/packages/truffle-bunjs/vite.config.ts new file mode 100644 index 0000000..1d81ebc --- /dev/null +++ b/packages/truffle-bunjs/vite.config.ts @@ -0,0 +1,7 @@ +import { defineConfig } from 'vite'; + +export default defineConfig({ + test: { + environment: 'happy-dom', + }, +});