diff --git a/babel.config.js b/babel.config.js index 490d48b77..bf03e31be 100644 --- a/babel.config.js +++ b/babel.config.js @@ -6,10 +6,8 @@ module.exports = api => { const overrides = [] if (api && api.env('test')) { + presets.push(['@babel/preset-env', {targets: {node: 'current'}}]) presets.push('@babel/preset-typescript') - plugins.push(['@babel/plugin-proposal-class-properties', { loose: true }]) - plugins.push('@babel/plugin-transform-modules-commonjs') - plugins.push('@babel/plugin-proposal-optional-chaining') overrides.push({ test: 'node_modules/react-native/**/*', presets: ['module:metro-react-native-babel-preset'] @@ -22,24 +20,24 @@ module.exports = api => { test: './packages/plugin-react-navigation/**/*', presets: ['@babel/preset-react', 'module:metro-react-native-babel-preset'] }) + } else { + plugins.push( + ['@babel/plugin-transform-arrow-functions'], + ['@babel/plugin-transform-block-scoping'], + ['@babel/plugin-transform-classes', { loose: true }], + ['@babel/plugin-transform-computed-properties', { loose: true }], + ['@babel/plugin-transform-destructuring', { loose: true }], + ['@babel/plugin-transform-member-expression-literals'], + ['@babel/plugin-transform-property-literals'], + ['@babel/plugin-transform-parameters', { loose: true }], + ['@babel/plugin-transform-shorthand-properties'], + ['@babel/plugin-transform-spread', { loose: true }], + ['@babel/plugin-transform-template-literals', { loose: true }], + ['@babel/plugin-proposal-object-rest-spread', { loose: true }], + ['@babel/syntax-object-rest-spread'] + ) } - plugins.push( - ['@babel/plugin-transform-arrow-functions'], - ['@babel/plugin-transform-block-scoping'], - ['@babel/plugin-transform-classes', { loose: true }], - ['@babel/plugin-transform-computed-properties', { loose: true }], - ['@babel/plugin-transform-destructuring', { loose: true }], - ['@babel/plugin-transform-member-expression-literals'], - ['@babel/plugin-transform-property-literals'], - ['@babel/plugin-transform-parameters', { loose: true }], - ['@babel/plugin-transform-shorthand-properties'], - ['@babel/plugin-transform-spread', { loose: true }], - ['@babel/plugin-transform-template-literals', { loose: true }], - ['@babel/plugin-proposal-object-rest-spread', { loose: true }], - ['@babel/syntax-object-rest-spread'] - ) - if (api && !api.env('test')) { api.cache(false) } diff --git a/eslint.config.mjs b/eslint.config.mjs index 08c28873d..5e01aba82 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -58,6 +58,15 @@ const c = tseslint.config( { files: ['**/*.json', '**/*.[tj]s?(x)', '**/*.cjs', '**/*.mjs'], }, + // Node environment + { + files: ['jest/**/*.[js|mjs]', '**/*/babel.config.js', '**/*/rollup.config.mjs', '.rollup/index.mjs'], + languageOptions: { + globals: { + ...globals.node, + }, + }, + }, // Linting config for TypeScript { files: [ diff --git a/package-lock.json b/package-lock.json index bd9b32981..5aeea31b9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -256,12 +256,6 @@ "rxjs": "^6.5.3 || ^7.4.0" } }, - "node_modules/@angular/common/node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "dev": true - }, "node_modules/@angular/compiler": { "version": "19.0.4", "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-19.0.4.tgz", @@ -283,13 +277,6 @@ } } }, - "node_modules/@angular/compiler/node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "dev": true, - "peer": true - }, "node_modules/@angular/core": { "version": "19.0.4", "resolved": "https://registry.npmjs.org/@angular/core/-/core-19.0.4.tgz", @@ -306,12 +293,6 @@ "zone.js": "~0.15.0" } }, - "node_modules/@angular/core/node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "dev": true - }, "node_modules/@babel/cli": { "version": "7.25.6", "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.25.6.tgz", @@ -1246,6 +1227,22 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.26.0.tgz", + "integrity": "sha512-QCWT5Hh830hK5EQa7XzuqIkQU9tT/whqbDz7kuaZMHFl1inRRg7JnuAEOQ0Ur0QUl0NufCk1msK2BeY79Aj/eg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/plugin-syntax-import-attributes": { "version": "7.26.0", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz", @@ -1511,6 +1508,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.9.tgz", "integrity": "sha512-bbMAII8GRSkcd0h0b4X+36GksxuheLFjP65ul9w6C3KgAamI3JqErNgSrosX6ZPj+Mpim5VvEbawXxJCyEUV3Q==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-create-class-features-plugin": "^7.25.9", "@babel/helper-plugin-utils": "^7.25.9" @@ -3194,12 +3192,6 @@ "tslib": "^2.4.0" } }, - "node_modules/@emnapi/core/node_modules/tslib": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", - "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==", - "dev": true - }, "node_modules/@emnapi/runtime": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.2.0.tgz", @@ -3209,12 +3201,6 @@ "tslib": "^2.4.0" } }, - "node_modules/@emnapi/runtime/node_modules/tslib": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", - "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==", - "dev": true - }, "node_modules/@emnapi/wasi-threads": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.0.1.tgz", @@ -3224,12 +3210,6 @@ "tslib": "^2.4.0" } }, - "node_modules/@emnapi/wasi-threads/node_modules/tslib": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", - "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==", - "dev": true - }, "node_modules/@esbuild/aix-ppc64": { "version": "0.24.0", "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.0.tgz", @@ -3977,9 +3957,9 @@ } }, "node_modules/@inquirer/core": { - "version": "10.1.6", - "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.1.6.tgz", - "integrity": "sha512-Bwh/Zk6URrHwZnSSzAZAKH7YgGYi0xICIBDFOqBQoXNNAzBHw/bgXgLmChfp+GyR3PnChcTbiCTZGC6YJNJkMA==", + "version": "10.1.7", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.1.7.tgz", + "integrity": "sha512-AA9CQhlrt6ZgiSy6qoAigiA1izOa751ugX6ioSjqgJ+/Gd+tEN/TORk5sUYNjXuHWfW0r1n/a6ak4u/NqHHrtA==", "dev": true, "license": "MIT", "dependencies": { @@ -9980,12 +9960,6 @@ "tao": "index.js" } }, - "node_modules/@nrwl/tao/node_modules/tslib": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", - "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==", - "dev": true - }, "node_modules/@nx/devkit": { "version": "19.8.2", "resolved": "https://registry.npmjs.org/@nx/devkit/-/devkit-19.8.2.tgz", @@ -10051,12 +10025,6 @@ "node": ">=14.14" } }, - "node_modules/@nx/devkit/node_modules/tslib": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", - "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==", - "dev": true - }, "node_modules/@nx/nx-darwin-arm64": { "version": "19.8.2", "resolved": "https://registry.npmjs.org/@nx/nx-darwin-arm64/-/nx-darwin-arm64-19.8.2.tgz", @@ -12380,12 +12348,6 @@ "tslib": "^2.4.0" } }, - "node_modules/@tybys/wasm-util/node_modules/tslib": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", - "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==", - "dev": true - }, "node_modules/@types/accepts": { "version": "1.3.7", "resolved": "https://registry.npmjs.org/@types/accepts/-/accepts-1.3.7.tgz", @@ -13683,12 +13645,6 @@ "node": ">=14.15.0" } }, - "node_modules/@yarnpkg/parsers/node_modules/tslib": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", - "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==", - "dev": true - }, "node_modules/@zkochan/js-yaml": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/@zkochan/js-yaml/-/js-yaml-0.0.7.tgz", @@ -16479,12 +16435,6 @@ "upper-case-first": "^2.0.2" } }, - "node_modules/capital-case/node_modules/tslib": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", - "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==", - "dev": true - }, "node_modules/capture-exit": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz", @@ -24368,12 +24318,6 @@ "tslib": "^2.0.0" } }, - "node_modules/injection-js/node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "dev": true - }, "node_modules/inline-source-map": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.6.2.tgz", @@ -32567,12 +32511,6 @@ "node": ">=0.10.0" } }, - "node_modules/less/node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "dev": true - }, "node_modules/level": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/level/-/level-5.0.1.tgz", @@ -33626,12 +33564,6 @@ "tslib": "^2.0.3" } }, - "node_modules/lower-case/node_modules/tslib": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", - "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==", - "dev": true - }, "node_modules/lowercase-keys": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", @@ -33944,12 +33876,6 @@ "tslib": "2" } }, - "node_modules/memfs/node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "dev": true - }, "node_modules/meow": { "version": "8.1.2", "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz", @@ -36463,12 +36389,6 @@ "tslib": "^2.0.3" } }, - "node_modules/no-case/node_modules/tslib": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", - "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==", - "dev": true - }, "node_modules/nocache": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/nocache/-/nocache-2.1.0.tgz", @@ -37440,12 +37360,6 @@ "node": ">=14.14" } }, - "node_modules/nx/node_modules/tslib": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", - "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==", - "dev": true - }, "node_modules/oauth-sign": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", @@ -40510,13 +40424,6 @@ "tslib": "^2.1.0" } }, - "node_modules/rxjs/node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "dev": true, - "license": "0BSD" - }, "node_modules/safe-array-concat": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", @@ -42965,10 +42872,10 @@ } }, "node_modules/tslib": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", - "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==", - "dev": true + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" }, "node_modules/tslint": { "version": "5.20.1", @@ -43000,6 +42907,13 @@ "typescript": ">=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >=3.0.0-dev || >= 3.1.0-dev || >= 3.2.0-dev" } }, + "node_modules/tslint/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true, + "license": "0BSD" + }, "node_modules/tslint/node_modules/tsutils": { "version": "2.29.0", "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", @@ -43596,12 +43510,6 @@ "tslib": "^2.0.3" } }, - "node_modules/upper-case-first/node_modules/tslib": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", - "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==", - "dev": true - }, "node_modules/uri-js": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", @@ -45683,6 +45591,8 @@ "stack-generator": "^2.0.3" }, "devDependencies": { + "@babel/preset-env": "^7.26.8", + "@babel/preset-typescript": "^7.26.0", "@rollup/plugin-babel": "^6.0.4", "@rollup/plugin-commonjs": "^28.0.2", "@rollup/plugin-node-resolve": "^16.0.0", @@ -45692,287 +45602,1343 @@ "rollup": "^4.24.0" } }, - "packages/core/node_modules/@rollup/plugin-node-resolve": { - "version": "16.0.0", - "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-16.0.0.tgz", - "integrity": "sha512-0FPvAeVUT/zdWoO0jnb/V5BlBsUSNfkIOtFHzMO4H9MOklrmQFY6FduVHKucNb/aTFxvnGhj4MNj/T1oNdDfNg==", + "packages/core/node_modules/@babel/compat-data": { + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.8.tgz", + "integrity": "sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "packages/core/node_modules/@babel/generator": { + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.8.tgz", + "integrity": "sha512-ef383X5++iZHWAXX0SXQR6ZyQhw/0KtTkrTz61WXRhFM6dhpHulO/RJz79L8S6ugZHJkOOkUrUdxgdF2YiPFnA==", "dev": true, "license": "MIT", "dependencies": { - "@rollup/pluginutils": "^5.0.1", - "@types/resolve": "1.20.2", - "deepmerge": "^4.2.2", - "is-module": "^1.0.0", - "resolve": "^1.22.1" + "@babel/parser": "^7.26.8", + "@babel/types": "^7.26.8", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^3.0.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=6.9.0" + } + }, + "packages/core/node_modules/@babel/helper-compilation-targets": { + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.26.5.tgz", + "integrity": "sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.26.5", + "@babel/helper-validator-option": "^7.25.9", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" }, - "peerDependencies": { - "rollup": "^2.78.0||^3.0.0||^4.0.0" + "engines": { + "node": ">=6.9.0" + } + }, + "packages/core/node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.3.tgz", + "integrity": "sha512-HK7Bi+Hj6H+VTHA3ZvBis7V/6hu9QuTrnMXNybfUf2iiuU/N97I8VjB+KbhFF8Rld/Lx5MzoCwPCpPjfK+n8Cg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2" }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, - "packages/core/node_modules/deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "packages/core/node_modules/@babel/helper-module-imports": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", + "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", "dev": true, "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" + }, "engines": { - "node": ">=0.10.0" + "node": ">=6.9.0" } }, - "packages/delivery-electron": { - "name": "@bugsnag/delivery-electron", - "version": "8.2.0", + "packages/core/node_modules/@babel/helper-module-transforms": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz", + "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", + "dev": true, "license": "MIT", - "devDependencies": { - "@bugsnag/core": "^8.2.0", - "@bugsnag/electron-network-status": "^8.2.0", - "@bugsnag/plugin-electron-client-state-manager": "^8.2.0" + "dependencies": { + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { - "@bugsnag/core": "^8.0.0", - "@bugsnag/electron-network-status": "^8.0.0" + "@babel/core": "^7.0.0" } }, - "packages/delivery-fetch": { - "name": "@bugsnag/delivery-fetch", - "version": "8.2.0", + "packages/core/node_modules/@babel/helper-plugin-utils": { + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz", + "integrity": "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==", + "dev": true, "license": "MIT", - "devDependencies": { - "@bugsnag/core": "^8.2.0" + "engines": { + "node": ">=6.9.0" + } + }, + "packages/core/node_modules/@babel/parser": { + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.8.tgz", + "integrity": "sha512-TZIQ25pkSoaKEYYaHbbxkfL36GNsQ6iFiBbeuzAkLnXayKR1yP1zFe+NxuZWWsUyvt8icPU9CCq0sgWGXR1GEw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.26.8" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "packages/core/node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.25.9.tgz", + "integrity": "sha512-6xWgLZTJXwilVjlnV7ospI3xi+sl8lN8rXXbBD6vYn3UYDlGsag8wrZkKcSI8G6KgqKP7vNFaDgeDnfAABq61g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", + "@babel/plugin-transform-optional-chaining": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { - "@bugsnag/core": "^8.0.0" + "@babel/core": "^7.13.0" } }, - "packages/delivery-node": { - "name": "@bugsnag/delivery-node", - "version": "8.2.0", + "packages/core/node_modules/@babel/plugin-syntax-jsx": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.9.tgz", + "integrity": "sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==", + "dev": true, "license": "MIT", - "devDependencies": { - "@bugsnag/core": "^8.2.0" + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { - "@bugsnag/core": "^8.0.0" + "@babel/core": "^7.0.0-0" } }, - "packages/delivery-react-native": { - "name": "@bugsnag/delivery-react-native", - "version": "8.2.0", + "packages/core/node_modules/@babel/plugin-syntax-typescript": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.9.tgz", + "integrity": "sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==", + "dev": true, "license": "MIT", - "devDependencies": { - "@bugsnag/core": "^8.2.0" + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { - "@bugsnag/core": "^8.0.0" + "@babel/core": "^7.0.0-0" } }, - "packages/delivery-x-domain-request": { - "name": "@bugsnag/delivery-x-domain-request", - "version": "8.2.0", + "packages/core/node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.25.9.tgz", + "integrity": "sha512-6jmooXYIwn9ca5/RylZADJ+EnSxVUS5sjeJ9UPk6RWRzXCmOJCy6dqItPJFpw2cuCangPK4OYr5uhGKcmrm5Qg==", + "dev": true, "license": "MIT", - "devDependencies": { - "@bugsnag/core": "^8.2.0" + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { - "@bugsnag/core": "^8.0.0" + "@babel/core": "^7.0.0-0" } }, - "packages/delivery-xml-http-request": { - "name": "@bugsnag/delivery-xml-http-request", - "version": "8.2.0", + "packages/core/node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.26.8.tgz", + "integrity": "sha512-He9Ej2X7tNf2zdKMAGOsmg2MrFc+hfoAhd3po4cWfo/NWjzEAKa0oQruj1ROVUdl0e6fb6/kE/G3SSxE0lRJOg==", + "dev": true, "license": "MIT", - "devDependencies": { - "@bugsnag/core": "^8.2.0" + "dependencies": { + "@babel/helper-plugin-utils": "^7.26.5", + "@babel/helper-remap-async-to-generator": "^7.25.9", + "@babel/traverse": "^7.26.8" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { - "@bugsnag/core": "^8.0.0" + "@babel/core": "^7.0.0-0" } }, - "packages/electron": { - "name": "@bugsnag/electron", - "version": "8.2.0", + "packages/core/node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.25.9.tgz", + "integrity": "sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ==", + "dev": true, "license": "MIT", "dependencies": { - "@bugsnag/core": "^8.2.0", - "@bugsnag/delivery-electron": "^8.2.0", - "@bugsnag/electron-filestore": "^8.0.0", - "@bugsnag/electron-network-status": "^8.2.0", - "@bugsnag/plugin-console-breadcrumbs": "^8.2.0", - "@bugsnag/plugin-electron-app": "^8.2.0", - "@bugsnag/plugin-electron-app-breadcrumbs": "^8.2.0", - "@bugsnag/plugin-electron-client-state-manager": "^8.2.0", - "@bugsnag/plugin-electron-client-state-persistence": "^8.2.0", - "@bugsnag/plugin-electron-deliver-minidumps": "^8.2.0", - "@bugsnag/plugin-electron-device": "^8.2.0", - "@bugsnag/plugin-electron-ipc": "^8.2.0", - "@bugsnag/plugin-electron-net-breadcrumbs": "^8.2.0", - "@bugsnag/plugin-electron-network-status": "^8.2.0", - "@bugsnag/plugin-electron-preload-error": "^8.2.0", - "@bugsnag/plugin-electron-process-info": "^8.2.0", - "@bugsnag/plugin-electron-renderer-client-state-updates": "^8.2.0", - "@bugsnag/plugin-electron-renderer-event-data": "^8.2.0", - "@bugsnag/plugin-electron-renderer-strip-project-root": "^8.2.0", - "@bugsnag/plugin-electron-session": "^8.2.0", - "@bugsnag/plugin-interaction-breadcrumbs": "^8.2.0", - "@bugsnag/plugin-internal-callback-marker": "^8.2.0", - "@bugsnag/plugin-network-breadcrumbs": "^8.2.0", - "@bugsnag/plugin-node-surrounding-code": "^8.2.0", - "@bugsnag/plugin-node-uncaught-exception": "^8.2.0", - "@bugsnag/plugin-node-unhandled-rejection": "^8.2.0", - "@bugsnag/plugin-stackframe-path-normaliser": "^8.2.0", - "@bugsnag/plugin-strip-project-root": "^8.2.0", - "@bugsnag/plugin-window-onerror": "^8.2.0", - "@bugsnag/plugin-window-unhandled-rejection": "^8.2.0" + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-remap-async-to-generator": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "packages/electron-filestore": { - "name": "@bugsnag/electron-filestore", - "version": "8.0.0", - "license": "MIT" + "packages/core/node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.26.5.tgz", + "integrity": "sha512-chuTSY+hq09+/f5lMj8ZSYgCFpppV2CbYrhNFJ1BFoXpiWPnnAb7R0MqrafCpN8E1+YRrtM1MXZHJdIx8B6rMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.26.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "packages/electron-network-status": { - "name": "@bugsnag/electron-network-status", - "version": "8.2.0", + "packages/core/node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.9.tgz", + "integrity": "sha512-1F05O7AYjymAtqbsFETboN1NvBdcnzMerO+zlMyJBEz6WkMdejvGWw9p05iTSjC85RLlBseHHQpYaM4gzJkBGg==", + "dev": true, "license": "MIT", - "devDependencies": { - "@bugsnag/core": "^8.2.0", - "@bugsnag/plugin-electron-client-state-manager": "^8.2.0" + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { - "@bugsnag/core": "^8.0.0" + "@babel/core": "^7.0.0-0" } }, - "packages/electron-test-helpers": { - "name": "@bugsnag/electron-test-helpers", - "version": "8.2.0", + "packages/core/node_modules/@babel/plugin-transform-classes": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.9.tgz", + "integrity": "sha512-mD8APIXmseE7oZvZgGABDyM34GUmK45Um2TXiBUt7PnuAxrgoSVf123qUzPxEr/+/BHrRn5NMZCdE2m/1F8DGg==", + "dev": true, "license": "MIT", - "devDependencies": { - "@bugsnag/core": "^8.2.0" + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-replace-supers": "^7.25.9", + "@babel/traverse": "^7.25.9", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "packages/in-flight": { - "name": "@bugsnag/in-flight", - "version": "8.2.0", + "packages/core/node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.25.9.tgz", + "integrity": "sha512-HnBegGqXZR12xbcTHlJ9HGxw1OniltT26J5YpfruGqtUHlz/xKf/G2ak9e+t0rVqrjXa9WOhvYPz1ERfMj23AA==", + "dev": true, "license": "MIT", "dependencies": { - "@bugsnag/cuid": "^3.0.0" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/template": "^7.25.9" }, - "devDependencies": { - "@bugsnag/core": "^8.2.0" + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { - "@bugsnag/core": "^8.0.0" + "@babel/core": "^7.0.0-0" } }, - "packages/js": { - "name": "@bugsnag/js", - "version": "8.2.0", + "packages/core/node_modules/@babel/plugin-transform-destructuring": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.25.9.tgz", + "integrity": "sha512-WkCGb/3ZxXepmMiX101nnGiU+1CAdut8oHyEOHxkKuS1qKpU2SMXE2uSvfz8PBuLd49V6LEsbtyPhWC7fnkgvQ==", + "dev": true, "license": "MIT", "dependencies": { - "@bugsnag/browser": "^8.2.0", - "@bugsnag/node": "^8.2.0" + "@babel/helper-plugin-utils": "^7.25.9" }, - "devDependencies": { - "@babel/cli": "^7.0.0" + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "packages/node": { - "name": "@bugsnag/node", - "version": "8.2.0", + "packages/core/node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.25.9.tgz", + "integrity": "sha512-t7ZQ7g5trIgSRYhI9pIJtRl64KHotutUJsh4Eze5l7olJv+mRSg4/MmbZ0tv1eeqRbdvo/+trvJD/Oc5DmW2cA==", + "dev": true, "license": "MIT", "dependencies": { - "@bugsnag/core": "^8.2.0", - "byline": "^5.0.0", - "error-stack-parser": "^2.0.3", - "iserror": "^0.0.2", - "pump": "^3.0.0", - "stack-generator": "^2.0.3" + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, - "devDependencies": { - "@bugsnag/delivery-node": "^8.2.0", - "@bugsnag/plugin-app-duration": "^8.2.0", - "@bugsnag/plugin-console-breadcrumbs": "^8.2.0", - "@bugsnag/plugin-contextualize": "^8.2.0", - "@bugsnag/plugin-intercept": "^8.2.0", - "@bugsnag/plugin-node-device": "^8.2.0", - "@bugsnag/plugin-node-in-project": "^8.2.0", - "@bugsnag/plugin-node-surrounding-code": "^8.2.0", - "@bugsnag/plugin-node-uncaught-exception": "^8.2.0", - "@bugsnag/plugin-node-unhandled-rejection": "^8.2.0", - "@bugsnag/plugin-server-session": "^8.2.0", - "@bugsnag/plugin-stackframe-path-normaliser": "^8.2.0", - "@bugsnag/plugin-strip-project-root": "^8.2.0", - "@types/node": "^18.19.74" + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "packages/plugin-angular": { - "name": "@bugsnag/plugin-angular", - "version": "8.2.0", + "packages/core/node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.25.9.tgz", + "integrity": "sha512-LZxhJ6dvBb/f3x8xwWIuyiAHy56nrRG3PeYTpBkkzkYRRQ6tJLu68lEF5VIqMUZiAV7a8+Tb78nEoMCMcqjXBw==", + "dev": true, "license": "MIT", "dependencies": { - "tslib": "^2.3.0" + "@babel/helper-plugin-utils": "^7.25.9" }, - "devDependencies": { - "@angular-devkit/build-angular": "^19.0.5", - "@angular/cli": "^19.0.5", - "@angular/common": "^19.0.0", - "@angular/compiler-cli": "^19.0.0", - "@angular/core": "^19.0.0", - "@bugsnag/js": "^8.2.0", - "ng-packagr": "^19.1.0", - "rxjs": "~7.8.0", - "typescript": "~5.6.2", - "zone.js": "~0.15.0" + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { - "@angular/common": ">= 12", - "@angular/core": ">= 12", - "@bugsnag/js": "^8.0.0" + "@babel/core": "^7.0.0-0" } }, - "packages/plugin-angular/node_modules/@ampproject/remapping": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", - "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "packages/core/node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.26.3.tgz", + "integrity": "sha512-7CAHcQ58z2chuXPWblnn1K6rLDnDWieghSOEmqQsrBenH0P9InCUtOJYD89pvngljmZlJcz3fcmgYsXFNGa1ZQ==", "dev": true, + "license": "MIT", "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { - "node": ">=6.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "packages/plugin-angular/node_modules/@angular-devkit/architect": { - "version": "0.1703.11", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1703.11.tgz", - "integrity": "sha512-YNasVZk4rYdcM6M+KRH8PUBhVyJfqzUYLpO98GgRokW+taIDgifckSlmfDZzQRbw45qiwei1IKCLqcpC8nM5Tw==", + "packages/core/node_modules/@babel/plugin-transform-for-of": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.25.9.tgz", + "integrity": "sha512-LqHxduHoaGELJl2uhImHwRQudhCM50pT46rIBNvtT/Oql3nqiS3wOwP+5ten7NpYSXrrVLgtZU3DZmPtWZo16A==", "dev": true, + "license": "MIT", "dependencies": { - "@angular-devkit/core": "17.3.11", - "rxjs": "7.8.1" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" }, "engines": { - "node": "^18.13.0 || >=20.9.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "packages/plugin-angular/node_modules/@angular-devkit/build-angular": { - "version": "19.0.5", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-19.0.5.tgz", - "integrity": "sha512-Z8GcTBsDGKPIKWtLoRVuss/oGytRaVXZSsXzfCapWjggwuN0B2b26Ms0kfU0kIWRfEzz38wKwug/1l86Q9HqNA==", + "packages/core/node_modules/@babel/plugin-transform-function-name": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.9.tgz", + "integrity": "sha512-8lP+Yxjv14Vc5MuWBpJsoUCd3hD6V9DgBon2FVYL4jJgbnVQ9fTgYmonchzZJOVNgzEgbxp4OwAf6xz6M/14XA==", "dev": true, + "license": "MIT", "dependencies": { - "@ampproject/remapping": "2.3.0", + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "packages/core/node_modules/@babel/plugin-transform-literals": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.9.tgz", + "integrity": "sha512-9N7+2lFziW8W9pBl2TzaNht3+pgMIRP74zizeCSrtnSKVdUl8mAjjOP2OOVQAfZ881P2cNjDj1uAMEdeD50nuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "packages/core/node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.25.9.tgz", + "integrity": "sha512-PYazBVfofCQkkMzh2P6IdIUaCEWni3iYEerAsRWuVd8+jlM1S9S9cz1dF9hIzyoZ8IA3+OwVYIp9v9e+GbgZhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "packages/core/node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.25.9.tgz", + "integrity": "sha512-g5T11tnI36jVClQlMlt4qKDLlWnG5pP9CSM4GhdRciTNMRgkfpo5cR6b4rGIOYPgRRuFAvwjPQ/Yk+ql4dyhbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "packages/core/node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.26.3.tgz", + "integrity": "sha512-MgR55l4q9KddUDITEzEFYn5ZsGDXMSsU9E+kh7fjRXTIC3RHqfCo8RPRbyReYJh44HQ/yomFkqbOFohXvDCiIQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.26.0", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "packages/core/node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.9.tgz", + "integrity": "sha512-hyss7iIlH/zLHaehT+xwiymtPOpsiwIIRlCAOwBB04ta5Tt+lNItADdlXw3jAWZ96VJ2jlhl/c+PNIQPKNfvcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "packages/core/node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.25.9.tgz", + "integrity": "sha512-bS9MVObUgE7ww36HEfwe6g9WakQ0KF07mQF74uuXdkoziUPfKyu/nIm663kz//e5O1nPInPFx36z7WJmJ4yNEw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "packages/core/node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.25.9.tgz", + "integrity": "sha512-oqB6WHdKTGl3q/ItQhpLSnWWOpjUJLsOCLVyeFgeTktkBSCiurvPOsyt93gibI9CmuKvTUEtWmG5VhZD+5T/KA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "packages/core/node_modules/@babel/plugin-transform-new-target": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.25.9.tgz", + "integrity": "sha512-U/3p8X1yCSoKyUj2eOBIx3FOn6pElFOKvAAGf8HTtItuPyB+ZeOqfn+mvTtg9ZlOAjsPdK3ayQEjqHjU/yLeVQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "packages/core/node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.26.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.26.6.tgz", + "integrity": "sha512-CKW8Vu+uUZneQCPtXmSBUC6NCAUdya26hWCElAWh5mVSlSRsmiCPUUDKb3Z0szng1hiAJa098Hkhg9o4SE35Qw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.26.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "packages/core/node_modules/@babel/plugin-transform-object-super": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.25.9.tgz", + "integrity": "sha512-Kj/Gh+Rw2RNLbCK1VAWj2U48yxxqL2x0k10nPtSdRa0O2xnHXalD0s+o1A6a0W43gJ00ANo38jxkQreckOzv5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-replace-supers": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "packages/core/node_modules/@babel/plugin-transform-property-literals": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.25.9.tgz", + "integrity": "sha512-IvIUeV5KrS/VPavfSM/Iu+RE6llrHrYIKY1yfCzyO/lMXHQ+p7uGhonmGVisv6tSBSVgWzMBohTcvkC9vQcQFA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "packages/core/node_modules/@babel/plugin-transform-regenerator": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.25.9.tgz", + "integrity": "sha512-vwDcDNsgMPDGP0nMqzahDWE5/MLcX8sv96+wfX7as7LoF/kr97Bo/7fI00lXY4wUXYfVmwIIyG80fGZ1uvt2qg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "regenerator-transform": "^0.15.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "packages/core/node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.25.9.tgz", + "integrity": "sha512-7DL7DKYjn5Su++4RXu8puKZm2XBPHyjWLUidaPEkCUBbE7IPcsrkRHggAOOKydH1dASWdcUBxrkOGNxUv5P3Jg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "packages/core/node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.25.9.tgz", + "integrity": "sha512-MUv6t0FhO5qHnS/W8XCbHmiRWOphNufpE1IVxhK5kuN3Td9FT1x4rx4K42s3RYdMXCXpfWkGSbCSd0Z64xA7Ng==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "packages/core/node_modules/@babel/plugin-transform-spread": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.25.9.tgz", + "integrity": "sha512-oNknIB0TbURU5pqJFVbOOFspVlrpVwo2H1+HUIsVDvp5VauGGDP1ZEvO8Nn5xyMEs3dakajOxlmkNW7kNgSm6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "packages/core/node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.25.9.tgz", + "integrity": "sha512-WqBUSgeVwucYDP9U/xNRQam7xV8W5Zf+6Eo7T2SRVUFlhRiMNFdFz58u0KZmCVVqs2i7SHgpRnAhzRNmKfi2uA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "packages/core/node_modules/@babel/plugin-transform-template-literals": { + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.26.8.tgz", + "integrity": "sha512-OmGDL5/J0CJPJZTHZbi2XpO0tyT2Ia7fzpW5GURwdtp2X3fMmN8au/ej6peC/T33/+CRiIpA8Krse8hFGVmT5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.26.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "packages/core/node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.26.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.26.7.tgz", + "integrity": "sha512-jfoTXXZTgGg36BmhqT3cAYK5qkmqvJpvNrPhaK/52Vgjhw4Rq29s9UqpWWV0D6yuRmgiFH/BUVlkl96zJWqnaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.26.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "packages/core/node_modules/@babel/plugin-transform-typescript": { + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.26.8.tgz", + "integrity": "sha512-bME5J9AC8ChwA7aEPJ6zym3w7aObZULHhbNLU0bKUhKsAkylkzUdq+0kdymh9rzi8nlNFl2bmldFBCKNJBUpuw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.26.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", + "@babel/plugin-syntax-typescript": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "packages/core/node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.25.9.tgz", + "integrity": "sha512-s5EDrE6bW97LtxOcGj1Khcx5AaXwiMmi4toFWRDP9/y0Woo6pXC+iyPu/KuhKtfSrNFd7jJB+/fkOtZy6aIC6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "packages/core/node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.25.9.tgz", + "integrity": "sha512-yoxstj7Rg9dlNn9UQxzk4fcNivwv4nUYz7fYXBaKxvw/lnmPuOm/ikoELygbYq68Bls3D/D+NBPHiLwZdZZ4HA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "packages/core/node_modules/@babel/preset-env": { + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.26.8.tgz", + "integrity": "sha512-um7Sy+2THd697S4zJEfv/U5MHGJzkN2xhtsR3T/SWRbVSic62nbISh51VVfU9JiO/L/Z97QczHTaFVkOU8IzNg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.26.8", + "@babel/helper-compilation-targets": "^7.26.5", + "@babel/helper-plugin-utils": "^7.26.5", + "@babel/helper-validator-option": "^7.25.9", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.9", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.9", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.25.9", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.25.9", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.25.9", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-import-assertions": "^7.26.0", + "@babel/plugin-syntax-import-attributes": "^7.26.0", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.25.9", + "@babel/plugin-transform-async-generator-functions": "^7.26.8", + "@babel/plugin-transform-async-to-generator": "^7.25.9", + "@babel/plugin-transform-block-scoped-functions": "^7.26.5", + "@babel/plugin-transform-block-scoping": "^7.25.9", + "@babel/plugin-transform-class-properties": "^7.25.9", + "@babel/plugin-transform-class-static-block": "^7.26.0", + "@babel/plugin-transform-classes": "^7.25.9", + "@babel/plugin-transform-computed-properties": "^7.25.9", + "@babel/plugin-transform-destructuring": "^7.25.9", + "@babel/plugin-transform-dotall-regex": "^7.25.9", + "@babel/plugin-transform-duplicate-keys": "^7.25.9", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.9", + "@babel/plugin-transform-dynamic-import": "^7.25.9", + "@babel/plugin-transform-exponentiation-operator": "^7.26.3", + "@babel/plugin-transform-export-namespace-from": "^7.25.9", + "@babel/plugin-transform-for-of": "^7.25.9", + "@babel/plugin-transform-function-name": "^7.25.9", + "@babel/plugin-transform-json-strings": "^7.25.9", + "@babel/plugin-transform-literals": "^7.25.9", + "@babel/plugin-transform-logical-assignment-operators": "^7.25.9", + "@babel/plugin-transform-member-expression-literals": "^7.25.9", + "@babel/plugin-transform-modules-amd": "^7.25.9", + "@babel/plugin-transform-modules-commonjs": "^7.26.3", + "@babel/plugin-transform-modules-systemjs": "^7.25.9", + "@babel/plugin-transform-modules-umd": "^7.25.9", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.25.9", + "@babel/plugin-transform-new-target": "^7.25.9", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.26.6", + "@babel/plugin-transform-numeric-separator": "^7.25.9", + "@babel/plugin-transform-object-rest-spread": "^7.25.9", + "@babel/plugin-transform-object-super": "^7.25.9", + "@babel/plugin-transform-optional-catch-binding": "^7.25.9", + "@babel/plugin-transform-optional-chaining": "^7.25.9", + "@babel/plugin-transform-parameters": "^7.25.9", + "@babel/plugin-transform-private-methods": "^7.25.9", + "@babel/plugin-transform-private-property-in-object": "^7.25.9", + "@babel/plugin-transform-property-literals": "^7.25.9", + "@babel/plugin-transform-regenerator": "^7.25.9", + "@babel/plugin-transform-regexp-modifiers": "^7.26.0", + "@babel/plugin-transform-reserved-words": "^7.25.9", + "@babel/plugin-transform-shorthand-properties": "^7.25.9", + "@babel/plugin-transform-spread": "^7.25.9", + "@babel/plugin-transform-sticky-regex": "^7.25.9", + "@babel/plugin-transform-template-literals": "^7.26.8", + "@babel/plugin-transform-typeof-symbol": "^7.26.7", + "@babel/plugin-transform-unicode-escapes": "^7.25.9", + "@babel/plugin-transform-unicode-property-regex": "^7.25.9", + "@babel/plugin-transform-unicode-regex": "^7.25.9", + "@babel/plugin-transform-unicode-sets-regex": "^7.25.9", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "babel-plugin-polyfill-corejs2": "^0.4.10", + "babel-plugin-polyfill-corejs3": "^0.11.0", + "babel-plugin-polyfill-regenerator": "^0.6.1", + "core-js-compat": "^3.40.0", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "packages/core/node_modules/@babel/preset-modules": { + "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" + } + }, + "packages/core/node_modules/@babel/preset-typescript": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.26.0.tgz", + "integrity": "sha512-NMk1IGZ5I/oHhoXEElcm+xUnL/szL6xflkFZmoEU9xj1qSJXpiS7rsspYo92B4DRCDvZn2erT5LdsCeXAKNCkg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-validator-option": "^7.25.9", + "@babel/plugin-syntax-jsx": "^7.25.9", + "@babel/plugin-transform-modules-commonjs": "^7.25.9", + "@babel/plugin-transform-typescript": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "packages/core/node_modules/@babel/template": { + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.26.8.tgz", + "integrity": "sha512-iNKaX3ZebKIsCvJ+0jd6embf+Aulaa3vNBqZ41kM7iTWjx5qzWKXGHiJUW3+nTpQ18SG11hdF8OAzKrpXkb96Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.26.2", + "@babel/parser": "^7.26.8", + "@babel/types": "^7.26.8" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "packages/core/node_modules/@babel/traverse": { + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.8.tgz", + "integrity": "sha512-nic9tRkjYH0oB2dzr/JoGIm+4Q6SuYeLEiIiZDwBscRMYFJ+tMAz98fuel9ZnbXViA2I0HVSSRRK8DW5fjXStA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.26.8", + "@babel/parser": "^7.26.8", + "@babel/template": "^7.26.8", + "@babel/types": "^7.26.8", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "packages/core/node_modules/@babel/types": { + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.8.tgz", + "integrity": "sha512-eUuWapzEGWFEpHFxgEaBG8e3n6S8L3MSu0oda755rOfabWPnh0Our1AozNFVUxGFIhbKgd1ksprsoDGMinTOTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "packages/core/node_modules/@rollup/plugin-node-resolve": { + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-16.0.0.tgz", + "integrity": "sha512-0FPvAeVUT/zdWoO0jnb/V5BlBsUSNfkIOtFHzMO4H9MOklrmQFY6FduVHKucNb/aTFxvnGhj4MNj/T1oNdDfNg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^5.0.1", + "@types/resolve": "1.20.2", + "deepmerge": "^4.2.2", + "is-module": "^1.0.0", + "resolve": "^1.22.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^2.78.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "packages/core/node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.12", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.12.tgz", + "integrity": "sha512-CPWT6BwvhrTO2d8QVorhTCQw9Y43zOu7G9HigcfxvepOU6b8o3tcWad6oVgZIsZCTt42FFv97aA7ZJsbM4+8og==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.22.6", + "@babel/helper-define-polyfill-provider": "^0.6.3", + "semver": "^6.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "packages/core/node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.11.1.tgz", + "integrity": "sha512-yGCqvBT4rwMczo28xkH/noxJ6MZ4nJfkVYdoDaC/utLtWrXxv27HVrzAeSbqR8SxDsp46n0YF47EbHoixy6rXQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.3", + "core-js-compat": "^3.40.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "packages/core/node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.3.tgz", + "integrity": "sha512-LiWSbl4CRSIa5x/JAU6jZiG9eit9w6mz+yVMFwDE83LAWvt0AfGBoZ7HS/mkhrKuh2ZlzfVZYKoLjXdqw6Yt7Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.3" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "packages/core/node_modules/browserslist": { + "version": "4.24.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", + "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "caniuse-lite": "^1.0.30001688", + "electron-to-chromium": "^1.5.73", + "node-releases": "^2.0.19", + "update-browserslist-db": "^1.1.1" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "packages/core/node_modules/caniuse-lite": { + "version": "1.0.30001699", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001699.tgz", + "integrity": "sha512-b+uH5BakXZ9Do9iK+CkDmctUSEqZl+SP056vc5usa0PL+ev5OHw003rZXcnjNDv3L8P5j6rwT6C0BPKSikW08w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "packages/core/node_modules/core-js-compat": { + "version": "3.40.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.40.0.tgz", + "integrity": "sha512-0XEDpr5y5mijvw8Lbc6E5AkjrHfp7eEoPlu36SWeAbcL8fn1G1ANe8DBlo2XoNN89oVpxWwOjYIPVzR4ZvsKCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.24.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "packages/core/node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "packages/core/node_modules/electron-to-chromium": { + "version": "1.5.98", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.98.tgz", + "integrity": "sha512-bI/LbtRBxU2GzK7KK5xxFd2y9Lf9XguHooPYbcXWy6wUoT8NMnffsvRhPmSeUHLSDKAEtKuTaEtK4Ms15zkIEA==", + "dev": true, + "license": "ISC" + }, + "packages/core/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "packages/core/node_modules/regenerator-transform": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", + "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.8.4" + } + }, + "packages/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "packages/delivery-electron": { + "name": "@bugsnag/delivery-electron", + "version": "8.2.0", + "license": "MIT", + "devDependencies": { + "@bugsnag/core": "^8.2.0", + "@bugsnag/electron-network-status": "^8.2.0", + "@bugsnag/plugin-electron-client-state-manager": "^8.2.0" + }, + "peerDependencies": { + "@bugsnag/core": "^8.0.0", + "@bugsnag/electron-network-status": "^8.0.0" + } + }, + "packages/delivery-fetch": { + "name": "@bugsnag/delivery-fetch", + "version": "8.2.0", + "license": "MIT", + "devDependencies": { + "@bugsnag/core": "^8.2.0" + }, + "peerDependencies": { + "@bugsnag/core": "^8.0.0" + } + }, + "packages/delivery-node": { + "name": "@bugsnag/delivery-node", + "version": "8.2.0", + "license": "MIT", + "devDependencies": { + "@bugsnag/core": "^8.2.0" + }, + "peerDependencies": { + "@bugsnag/core": "^8.0.0" + } + }, + "packages/delivery-react-native": { + "name": "@bugsnag/delivery-react-native", + "version": "8.2.0", + "license": "MIT", + "devDependencies": { + "@bugsnag/core": "^8.2.0" + }, + "peerDependencies": { + "@bugsnag/core": "^8.0.0" + } + }, + "packages/delivery-x-domain-request": { + "name": "@bugsnag/delivery-x-domain-request", + "version": "8.2.0", + "license": "MIT", + "devDependencies": { + "@bugsnag/core": "^8.2.0" + }, + "peerDependencies": { + "@bugsnag/core": "^8.0.0" + } + }, + "packages/delivery-xml-http-request": { + "name": "@bugsnag/delivery-xml-http-request", + "version": "8.2.0", + "license": "MIT", + "devDependencies": { + "@bugsnag/core": "^8.2.0" + }, + "peerDependencies": { + "@bugsnag/core": "^8.0.0" + } + }, + "packages/electron": { + "name": "@bugsnag/electron", + "version": "8.2.0", + "license": "MIT", + "dependencies": { + "@bugsnag/core": "^8.2.0", + "@bugsnag/delivery-electron": "^8.2.0", + "@bugsnag/electron-filestore": "^8.0.0", + "@bugsnag/electron-network-status": "^8.2.0", + "@bugsnag/plugin-console-breadcrumbs": "^8.2.0", + "@bugsnag/plugin-electron-app": "^8.2.0", + "@bugsnag/plugin-electron-app-breadcrumbs": "^8.2.0", + "@bugsnag/plugin-electron-client-state-manager": "^8.2.0", + "@bugsnag/plugin-electron-client-state-persistence": "^8.2.0", + "@bugsnag/plugin-electron-deliver-minidumps": "^8.2.0", + "@bugsnag/plugin-electron-device": "^8.2.0", + "@bugsnag/plugin-electron-ipc": "^8.2.0", + "@bugsnag/plugin-electron-net-breadcrumbs": "^8.2.0", + "@bugsnag/plugin-electron-network-status": "^8.2.0", + "@bugsnag/plugin-electron-preload-error": "^8.2.0", + "@bugsnag/plugin-electron-process-info": "^8.2.0", + "@bugsnag/plugin-electron-renderer-client-state-updates": "^8.2.0", + "@bugsnag/plugin-electron-renderer-event-data": "^8.2.0", + "@bugsnag/plugin-electron-renderer-strip-project-root": "^8.2.0", + "@bugsnag/plugin-electron-session": "^8.2.0", + "@bugsnag/plugin-interaction-breadcrumbs": "^8.2.0", + "@bugsnag/plugin-internal-callback-marker": "^8.2.0", + "@bugsnag/plugin-network-breadcrumbs": "^8.2.0", + "@bugsnag/plugin-node-surrounding-code": "^8.2.0", + "@bugsnag/plugin-node-uncaught-exception": "^8.2.0", + "@bugsnag/plugin-node-unhandled-rejection": "^8.2.0", + "@bugsnag/plugin-stackframe-path-normaliser": "^8.2.0", + "@bugsnag/plugin-strip-project-root": "^8.2.0", + "@bugsnag/plugin-window-onerror": "^8.2.0", + "@bugsnag/plugin-window-unhandled-rejection": "^8.2.0" + } + }, + "packages/electron-filestore": { + "name": "@bugsnag/electron-filestore", + "version": "8.0.0", + "license": "MIT" + }, + "packages/electron-network-status": { + "name": "@bugsnag/electron-network-status", + "version": "8.2.0", + "license": "MIT", + "devDependencies": { + "@bugsnag/core": "^8.2.0", + "@bugsnag/plugin-electron-client-state-manager": "^8.2.0" + }, + "peerDependencies": { + "@bugsnag/core": "^8.0.0" + } + }, + "packages/electron-test-helpers": { + "name": "@bugsnag/electron-test-helpers", + "version": "8.2.0", + "license": "MIT", + "devDependencies": { + "@bugsnag/core": "^8.2.0" + } + }, + "packages/in-flight": { + "name": "@bugsnag/in-flight", + "version": "8.2.0", + "license": "MIT", + "dependencies": { + "@bugsnag/cuid": "^3.0.0" + }, + "devDependencies": { + "@bugsnag/core": "^8.2.0" + }, + "peerDependencies": { + "@bugsnag/core": "^8.0.0" + } + }, + "packages/js": { + "name": "@bugsnag/js", + "version": "8.2.0", + "license": "MIT", + "dependencies": { + "@bugsnag/browser": "^8.2.0", + "@bugsnag/node": "^8.2.0" + }, + "devDependencies": { + "@babel/cli": "^7.0.0" + } + }, + "packages/node": { + "name": "@bugsnag/node", + "version": "8.2.0", + "license": "MIT", + "dependencies": { + "@bugsnag/core": "^8.2.0", + "byline": "^5.0.0", + "error-stack-parser": "^2.0.3", + "iserror": "^0.0.2", + "pump": "^3.0.0", + "stack-generator": "^2.0.3" + }, + "devDependencies": { + "@bugsnag/delivery-node": "^8.2.0", + "@bugsnag/plugin-app-duration": "^8.2.0", + "@bugsnag/plugin-console-breadcrumbs": "^8.2.0", + "@bugsnag/plugin-contextualize": "^8.2.0", + "@bugsnag/plugin-intercept": "^8.2.0", + "@bugsnag/plugin-node-device": "^8.2.0", + "@bugsnag/plugin-node-in-project": "^8.2.0", + "@bugsnag/plugin-node-surrounding-code": "^8.2.0", + "@bugsnag/plugin-node-uncaught-exception": "^8.2.0", + "@bugsnag/plugin-node-unhandled-rejection": "^8.2.0", + "@bugsnag/plugin-server-session": "^8.2.0", + "@bugsnag/plugin-stackframe-path-normaliser": "^8.2.0", + "@bugsnag/plugin-strip-project-root": "^8.2.0", + "@types/node": "^18.19.74" + } + }, + "packages/plugin-angular": { + "name": "@bugsnag/plugin-angular", + "version": "8.2.0", + "license": "MIT", + "dependencies": { + "tslib": "^2.3.0" + }, + "devDependencies": { + "@angular-devkit/build-angular": "^19.0.5", + "@angular/cli": "^19.0.5", + "@angular/common": "^19.0.0", + "@angular/compiler-cli": "^19.0.0", + "@angular/core": "^19.0.0", + "@bugsnag/js": "^8.2.0", + "ng-packagr": "^19.1.0", + "rxjs": "~7.8.0", + "typescript": "~5.6.2", + "zone.js": "~0.15.0" + }, + "peerDependencies": { + "@angular/common": ">= 12", + "@angular/core": ">= 12", + "@bugsnag/js": "^8.0.0" + } + }, + "packages/plugin-angular/node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "packages/plugin-angular/node_modules/@angular-devkit/architect": { + "version": "0.1703.11", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1703.11.tgz", + "integrity": "sha512-YNasVZk4rYdcM6M+KRH8PUBhVyJfqzUYLpO98GgRokW+taIDgifckSlmfDZzQRbw45qiwei1IKCLqcpC8nM5Tw==", + "dev": true, + "dependencies": { + "@angular-devkit/core": "17.3.11", + "rxjs": "7.8.1" + }, + "engines": { + "node": "^18.13.0 || >=20.9.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "packages/plugin-angular/node_modules/@angular-devkit/build-angular": { + "version": "19.0.5", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-19.0.5.tgz", + "integrity": "sha512-Z8GcTBsDGKPIKWtLoRVuss/oGytRaVXZSsXzfCapWjggwuN0B2b26Ms0kfU0kIWRfEzz38wKwug/1l86Q9HqNA==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "2.3.0", "@angular-devkit/architect": "0.1900.5", "@angular-devkit/build-webpack": "0.1900.5", "@angular-devkit/core": "19.0.5", @@ -51049,11 +52015,6 @@ "node": ">=12" } }, - "packages/plugin-angular/node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" - }, "packages/plugin-angular/node_modules/typescript": { "version": "5.6.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz", @@ -53208,14 +54169,6 @@ "dev": true, "requires": { "tslib": "^2.3.0" - }, - "dependencies": { - "tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "dev": true - } } }, "@angular/compiler": { @@ -53226,15 +54179,6 @@ "peer": true, "requires": { "tslib": "^2.3.0" - }, - "dependencies": { - "tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "dev": true, - "peer": true - } } }, "@angular/core": { @@ -53244,14 +54188,6 @@ "dev": true, "requires": { "tslib": "^2.3.0" - }, - "dependencies": { - "tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "dev": true - } } }, "@babel/cli": { @@ -53936,6 +54872,15 @@ "@babel/helper-plugin-utils": "^7.12.13" } }, + "@babel/plugin-syntax-import-assertions": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.26.0.tgz", + "integrity": "sha512-QCWT5Hh830hK5EQa7XzuqIkQU9tT/whqbDz7kuaZMHFl1inRRg7JnuAEOQ0Ur0QUl0NufCk1msK2BeY79Aj/eg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.25.9" + } + }, "@babel/plugin-syntax-import-attributes": { "version": "7.26.0", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz", @@ -54818,113 +55763,735 @@ "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", "dev": true, "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + } + } + }, + "@babel/runtime": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.8.4.tgz", + "integrity": "sha512-neAp3zt80trRVBI1x0azq6c57aNBqYZH8KhMm3TaB7wEI5Q4A2SHfBHE8w9gOhI/lrqxtEbXZgQIrHP+wvSGwQ==", + "dev": true, + "requires": { + "regenerator-runtime": "^0.13.2" + }, + "dependencies": { + "regenerator-runtime": { + "version": "0.13.3", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz", + "integrity": "sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw==", + "dev": true + } + } + }, + "@babel/template": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.9.tgz", + "integrity": "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.25.9", + "@babel/parser": "^7.25.9", + "@babel/types": "^7.25.9" + } + }, + "@babel/traverse": { + "version": "7.26.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.4.tgz", + "integrity": "sha512-fH+b7Y4p3yqvApJALCPJcwb0/XaOSgtK4pzV6WVjPR5GLFQBRI7pfoX2V2iM48NXvX07NUxxm1Vw98YjqTcU5w==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.26.3", + "@babel/parser": "^7.26.3", + "@babel/template": "^7.25.9", + "@babel/types": "^7.26.3", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "dependencies": { + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + } + } + }, + "@babel/types": { + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.3.tgz", + "integrity": "sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==", + "dev": true, + "requires": { + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" + } + }, + "@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true + }, + "@bugsnag/browser": { + "version": "file:packages/browser", + "requires": { + "@bugsnag/core": "^8.2.0", + "@bugsnag/delivery-x-domain-request": "^8.2.0", + "@bugsnag/delivery-xml-http-request": "^8.2.0", + "@bugsnag/plugin-app-duration": "^8.2.0", + "@bugsnag/plugin-browser-context": "^8.2.0", + "@bugsnag/plugin-browser-device": "^8.2.0", + "@bugsnag/plugin-browser-request": "^8.2.0", + "@bugsnag/plugin-browser-session": "^8.2.0", + "@bugsnag/plugin-client-ip": "^8.2.0", + "@bugsnag/plugin-console-breadcrumbs": "^8.2.0", + "@bugsnag/plugin-inline-script-content": "^8.2.0", + "@bugsnag/plugin-interaction-breadcrumbs": "^8.2.0", + "@bugsnag/plugin-navigation-breadcrumbs": "^8.2.0", + "@bugsnag/plugin-network-breadcrumbs": "^8.2.0", + "@bugsnag/plugin-simple-throttle": "^8.2.0", + "@bugsnag/plugin-strip-query-string": "^8.2.0", + "@bugsnag/plugin-window-onerror": "^8.2.0", + "@bugsnag/plugin-window-unhandled-rejection": "^8.2.0", + "@rollup/plugin-babel": "^6.0.4", + "@rollup/plugin-commonjs": "^28.0.2", + "@rollup/plugin-node-resolve": "^16.0.0", + "@rollup/plugin-replace": "^6.0.2", + "@rollup/plugin-terser": "^0.4.4" + }, + "dependencies": { + "@rollup/plugin-node-resolve": { + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-16.0.0.tgz", + "integrity": "sha512-0FPvAeVUT/zdWoO0jnb/V5BlBsUSNfkIOtFHzMO4H9MOklrmQFY6FduVHKucNb/aTFxvnGhj4MNj/T1oNdDfNg==", + "dev": true, + "requires": { + "@rollup/pluginutils": "^5.0.1", + "@types/resolve": "1.20.2", + "deepmerge": "^4.2.2", + "is-module": "^1.0.0", + "resolve": "^1.22.1" + } + }, + "deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true + } + } + }, + "@bugsnag/core": { + "version": "file:packages/core", + "requires": { + "@babel/preset-env": "^7.26.8", + "@babel/preset-typescript": "^7.26.0", + "@bugsnag/cuid": "^3.0.0", + "@bugsnag/safe-json-stringify": "^6.0.0", + "@rollup/plugin-babel": "^6.0.4", + "@rollup/plugin-commonjs": "^28.0.2", + "@rollup/plugin-node-resolve": "^16.0.0", + "@rollup/plugin-replace": "^6.0.2", + "@rollup/plugin-typescript": "^12.1.2", + "@types/jest": "^26", + "error-stack-parser": "^2.0.3", + "iserror": "^0.0.2", + "rollup": "^4.24.0", + "stack-generator": "^2.0.3" + }, + "dependencies": { + "@babel/compat-data": { + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.8.tgz", + "integrity": "sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==", + "dev": true + }, + "@babel/generator": { + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.8.tgz", + "integrity": "sha512-ef383X5++iZHWAXX0SXQR6ZyQhw/0KtTkrTz61WXRhFM6dhpHulO/RJz79L8S6ugZHJkOOkUrUdxgdF2YiPFnA==", + "dev": true, + "requires": { + "@babel/parser": "^7.26.8", + "@babel/types": "^7.26.8", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^3.0.2" + } + }, + "@babel/helper-compilation-targets": { + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.26.5.tgz", + "integrity": "sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.26.5", + "@babel/helper-validator-option": "^7.25.9", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + } + }, + "@babel/helper-define-polyfill-provider": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.3.tgz", + "integrity": "sha512-HK7Bi+Hj6H+VTHA3ZvBis7V/6hu9QuTrnMXNybfUf2iiuU/N97I8VjB+KbhFF8Rld/Lx5MzoCwPCpPjfK+n8Cg==", + "dev": true, + "requires": { + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2" + } + }, + "@babel/helper-module-imports": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", + "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", + "dev": true, + "requires": { + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" + } + }, + "@babel/helper-module-transforms": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz", + "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9", + "@babel/traverse": "^7.25.9" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz", + "integrity": "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==", + "dev": true + }, + "@babel/parser": { + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.8.tgz", + "integrity": "sha512-TZIQ25pkSoaKEYYaHbbxkfL36GNsQ6iFiBbeuzAkLnXayKR1yP1zFe+NxuZWWsUyvt8icPU9CCq0sgWGXR1GEw==", + "dev": true, + "requires": { + "@babel/types": "^7.26.8" + } + }, + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.25.9.tgz", + "integrity": "sha512-6xWgLZTJXwilVjlnV7ospI3xi+sl8lN8rXXbBD6vYn3UYDlGsag8wrZkKcSI8G6KgqKP7vNFaDgeDnfAABq61g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", + "@babel/plugin-transform-optional-chaining": "^7.25.9" + } + }, + "@babel/plugin-syntax-jsx": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.9.tgz", + "integrity": "sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.25.9" + } + }, + "@babel/plugin-syntax-typescript": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.9.tgz", + "integrity": "sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.25.9" + } + }, + "@babel/plugin-transform-arrow-functions": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.25.9.tgz", + "integrity": "sha512-6jmooXYIwn9ca5/RylZADJ+EnSxVUS5sjeJ9UPk6RWRzXCmOJCy6dqItPJFpw2cuCangPK4OYr5uhGKcmrm5Qg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.25.9" + } + }, + "@babel/plugin-transform-async-generator-functions": { + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.26.8.tgz", + "integrity": "sha512-He9Ej2X7tNf2zdKMAGOsmg2MrFc+hfoAhd3po4cWfo/NWjzEAKa0oQruj1ROVUdl0e6fb6/kE/G3SSxE0lRJOg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.26.5", + "@babel/helper-remap-async-to-generator": "^7.25.9", + "@babel/traverse": "^7.26.8" + } + }, + "@babel/plugin-transform-async-to-generator": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.25.9.tgz", + "integrity": "sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-remap-async-to-generator": "^7.25.9" + } + }, + "@babel/plugin-transform-block-scoped-functions": { + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.26.5.tgz", + "integrity": "sha512-chuTSY+hq09+/f5lMj8ZSYgCFpppV2CbYrhNFJ1BFoXpiWPnnAb7R0MqrafCpN8E1+YRrtM1MXZHJdIx8B6rMQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.26.5" + } + }, + "@babel/plugin-transform-block-scoping": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.9.tgz", + "integrity": "sha512-1F05O7AYjymAtqbsFETboN1NvBdcnzMerO+zlMyJBEz6WkMdejvGWw9p05iTSjC85RLlBseHHQpYaM4gzJkBGg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.25.9" + } + }, + "@babel/plugin-transform-classes": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.9.tgz", + "integrity": "sha512-mD8APIXmseE7oZvZgGABDyM34GUmK45Um2TXiBUt7PnuAxrgoSVf123qUzPxEr/+/BHrRn5NMZCdE2m/1F8DGg==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-replace-supers": "^7.25.9", + "@babel/traverse": "^7.25.9", + "globals": "^11.1.0" + } + }, + "@babel/plugin-transform-computed-properties": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.25.9.tgz", + "integrity": "sha512-HnBegGqXZR12xbcTHlJ9HGxw1OniltT26J5YpfruGqtUHlz/xKf/G2ak9e+t0rVqrjXa9WOhvYPz1ERfMj23AA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/template": "^7.25.9" + } + }, + "@babel/plugin-transform-destructuring": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.25.9.tgz", + "integrity": "sha512-WkCGb/3ZxXepmMiX101nnGiU+1CAdut8oHyEOHxkKuS1qKpU2SMXE2uSvfz8PBuLd49V6LEsbtyPhWC7fnkgvQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.25.9" + } + }, + "@babel/plugin-transform-dotall-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.25.9.tgz", + "integrity": "sha512-t7ZQ7g5trIgSRYhI9pIJtRl64KHotutUJsh4Eze5l7olJv+mRSg4/MmbZ0tv1eeqRbdvo/+trvJD/Oc5DmW2cA==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + } + }, + "@babel/plugin-transform-duplicate-keys": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.25.9.tgz", + "integrity": "sha512-LZxhJ6dvBb/f3x8xwWIuyiAHy56nrRG3PeYTpBkkzkYRRQ6tJLu68lEF5VIqMUZiAV7a8+Tb78nEoMCMcqjXBw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.25.9" + } + }, + "@babel/plugin-transform-exponentiation-operator": { + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.26.3.tgz", + "integrity": "sha512-7CAHcQ58z2chuXPWblnn1K6rLDnDWieghSOEmqQsrBenH0P9InCUtOJYD89pvngljmZlJcz3fcmgYsXFNGa1ZQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.25.9" + } + }, + "@babel/plugin-transform-for-of": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.25.9.tgz", + "integrity": "sha512-LqHxduHoaGELJl2uhImHwRQudhCM50pT46rIBNvtT/Oql3nqiS3wOwP+5ten7NpYSXrrVLgtZU3DZmPtWZo16A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" + } + }, + "@babel/plugin-transform-function-name": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.9.tgz", + "integrity": "sha512-8lP+Yxjv14Vc5MuWBpJsoUCd3hD6V9DgBon2FVYL4jJgbnVQ9fTgYmonchzZJOVNgzEgbxp4OwAf6xz6M/14XA==", + "dev": true, + "requires": { + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/traverse": "^7.25.9" + } + }, + "@babel/plugin-transform-literals": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.9.tgz", + "integrity": "sha512-9N7+2lFziW8W9pBl2TzaNht3+pgMIRP74zizeCSrtnSKVdUl8mAjjOP2OOVQAfZ881P2cNjDj1uAMEdeD50nuQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.25.9" + } + }, + "@babel/plugin-transform-member-expression-literals": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.25.9.tgz", + "integrity": "sha512-PYazBVfofCQkkMzh2P6IdIUaCEWni3iYEerAsRWuVd8+jlM1S9S9cz1dF9hIzyoZ8IA3+OwVYIp9v9e+GbgZhA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.25.9" + } + }, + "@babel/plugin-transform-modules-amd": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.25.9.tgz", + "integrity": "sha512-g5T11tnI36jVClQlMlt4qKDLlWnG5pP9CSM4GhdRciTNMRgkfpo5cR6b4rGIOYPgRRuFAvwjPQ/Yk+ql4dyhbw==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + } + }, + "@babel/plugin-transform-modules-commonjs": { + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.26.3.tgz", + "integrity": "sha512-MgR55l4q9KddUDITEzEFYn5ZsGDXMSsU9E+kh7fjRXTIC3RHqfCo8RPRbyReYJh44HQ/yomFkqbOFohXvDCiIQ==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.26.0", + "@babel/helper-plugin-utils": "^7.25.9" + } + }, + "@babel/plugin-transform-modules-systemjs": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.9.tgz", + "integrity": "sha512-hyss7iIlH/zLHaehT+xwiymtPOpsiwIIRlCAOwBB04ta5Tt+lNItADdlXw3jAWZ96VJ2jlhl/c+PNIQPKNfvcA==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9", + "@babel/traverse": "^7.25.9" + } + }, + "@babel/plugin-transform-modules-umd": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.25.9.tgz", + "integrity": "sha512-bS9MVObUgE7ww36HEfwe6g9WakQ0KF07mQF74uuXdkoziUPfKyu/nIm663kz//e5O1nPInPFx36z7WJmJ4yNEw==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + } + }, + "@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.25.9.tgz", + "integrity": "sha512-oqB6WHdKTGl3q/ItQhpLSnWWOpjUJLsOCLVyeFgeTktkBSCiurvPOsyt93gibI9CmuKvTUEtWmG5VhZD+5T/KA==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + } + }, + "@babel/plugin-transform-new-target": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.25.9.tgz", + "integrity": "sha512-U/3p8X1yCSoKyUj2eOBIx3FOn6pElFOKvAAGf8HTtItuPyB+ZeOqfn+mvTtg9ZlOAjsPdK3ayQEjqHjU/yLeVQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.25.9" + } + }, + "@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.26.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.26.6.tgz", + "integrity": "sha512-CKW8Vu+uUZneQCPtXmSBUC6NCAUdya26hWCElAWh5mVSlSRsmiCPUUDKb3Z0szng1hiAJa098Hkhg9o4SE35Qw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.26.5" + } + }, + "@babel/plugin-transform-object-super": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.25.9.tgz", + "integrity": "sha512-Kj/Gh+Rw2RNLbCK1VAWj2U48yxxqL2x0k10nPtSdRa0O2xnHXalD0s+o1A6a0W43gJ00ANo38jxkQreckOzv5A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-replace-supers": "^7.25.9" + } + }, + "@babel/plugin-transform-property-literals": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.25.9.tgz", + "integrity": "sha512-IvIUeV5KrS/VPavfSM/Iu+RE6llrHrYIKY1yfCzyO/lMXHQ+p7uGhonmGVisv6tSBSVgWzMBohTcvkC9vQcQFA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.25.9" + } + }, + "@babel/plugin-transform-regenerator": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.25.9.tgz", + "integrity": "sha512-vwDcDNsgMPDGP0nMqzahDWE5/MLcX8sv96+wfX7as7LoF/kr97Bo/7fI00lXY4wUXYfVmwIIyG80fGZ1uvt2qg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.25.9", + "regenerator-transform": "^0.15.2" + } + }, + "@babel/plugin-transform-reserved-words": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.25.9.tgz", + "integrity": "sha512-7DL7DKYjn5Su++4RXu8puKZm2XBPHyjWLUidaPEkCUBbE7IPcsrkRHggAOOKydH1dASWdcUBxrkOGNxUv5P3Jg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.25.9" + } + }, + "@babel/plugin-transform-shorthand-properties": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.25.9.tgz", + "integrity": "sha512-MUv6t0FhO5qHnS/W8XCbHmiRWOphNufpE1IVxhK5kuN3Td9FT1x4rx4K42s3RYdMXCXpfWkGSbCSd0Z64xA7Ng==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.25.9" + } + }, + "@babel/plugin-transform-spread": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.25.9.tgz", + "integrity": "sha512-oNknIB0TbURU5pqJFVbOOFspVlrpVwo2H1+HUIsVDvp5VauGGDP1ZEvO8Nn5xyMEs3dakajOxlmkNW7kNgSm6A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" + } + }, + "@babel/plugin-transform-sticky-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.25.9.tgz", + "integrity": "sha512-WqBUSgeVwucYDP9U/xNRQam7xV8W5Zf+6Eo7T2SRVUFlhRiMNFdFz58u0KZmCVVqs2i7SHgpRnAhzRNmKfi2uA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.25.9" + } + }, + "@babel/plugin-transform-template-literals": { + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.26.8.tgz", + "integrity": "sha512-OmGDL5/J0CJPJZTHZbi2XpO0tyT2Ia7fzpW5GURwdtp2X3fMmN8au/ej6peC/T33/+CRiIpA8Krse8hFGVmT5Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.26.5" + } + }, + "@babel/plugin-transform-typeof-symbol": { + "version": "7.26.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.26.7.tgz", + "integrity": "sha512-jfoTXXZTgGg36BmhqT3cAYK5qkmqvJpvNrPhaK/52Vgjhw4Rq29s9UqpWWV0D6yuRmgiFH/BUVlkl96zJWqnaw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.26.5" + } + }, + "@babel/plugin-transform-typescript": { + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.26.8.tgz", + "integrity": "sha512-bME5J9AC8ChwA7aEPJ6zym3w7aObZULHhbNLU0bKUhKsAkylkzUdq+0kdymh9rzi8nlNFl2bmldFBCKNJBUpuw==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.26.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", + "@babel/plugin-syntax-typescript": "^7.25.9" + } + }, + "@babel/plugin-transform-unicode-escapes": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.25.9.tgz", + "integrity": "sha512-s5EDrE6bW97LtxOcGj1Khcx5AaXwiMmi4toFWRDP9/y0Woo6pXC+iyPu/KuhKtfSrNFd7jJB+/fkOtZy6aIC6Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.25.9" + } + }, + "@babel/plugin-transform-unicode-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.25.9.tgz", + "integrity": "sha512-yoxstj7Rg9dlNn9UQxzk4fcNivwv4nUYz7fYXBaKxvw/lnmPuOm/ikoELygbYq68Bls3D/D+NBPHiLwZdZZ4HA==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + } + }, + "@babel/preset-env": { + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.26.8.tgz", + "integrity": "sha512-um7Sy+2THd697S4zJEfv/U5MHGJzkN2xhtsR3T/SWRbVSic62nbISh51VVfU9JiO/L/Z97QczHTaFVkOU8IzNg==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.26.8", + "@babel/helper-compilation-targets": "^7.26.5", + "@babel/helper-plugin-utils": "^7.26.5", + "@babel/helper-validator-option": "^7.25.9", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.9", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.9", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.25.9", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.25.9", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.25.9", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-import-assertions": "^7.26.0", + "@babel/plugin-syntax-import-attributes": "^7.26.0", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.25.9", + "@babel/plugin-transform-async-generator-functions": "^7.26.8", + "@babel/plugin-transform-async-to-generator": "^7.25.9", + "@babel/plugin-transform-block-scoped-functions": "^7.26.5", + "@babel/plugin-transform-block-scoping": "^7.25.9", + "@babel/plugin-transform-class-properties": "^7.25.9", + "@babel/plugin-transform-class-static-block": "^7.26.0", + "@babel/plugin-transform-classes": "^7.25.9", + "@babel/plugin-transform-computed-properties": "^7.25.9", + "@babel/plugin-transform-destructuring": "^7.25.9", + "@babel/plugin-transform-dotall-regex": "^7.25.9", + "@babel/plugin-transform-duplicate-keys": "^7.25.9", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.9", + "@babel/plugin-transform-dynamic-import": "^7.25.9", + "@babel/plugin-transform-exponentiation-operator": "^7.26.3", + "@babel/plugin-transform-export-namespace-from": "^7.25.9", + "@babel/plugin-transform-for-of": "^7.25.9", + "@babel/plugin-transform-function-name": "^7.25.9", + "@babel/plugin-transform-json-strings": "^7.25.9", + "@babel/plugin-transform-literals": "^7.25.9", + "@babel/plugin-transform-logical-assignment-operators": "^7.25.9", + "@babel/plugin-transform-member-expression-literals": "^7.25.9", + "@babel/plugin-transform-modules-amd": "^7.25.9", + "@babel/plugin-transform-modules-commonjs": "^7.26.3", + "@babel/plugin-transform-modules-systemjs": "^7.25.9", + "@babel/plugin-transform-modules-umd": "^7.25.9", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.25.9", + "@babel/plugin-transform-new-target": "^7.25.9", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.26.6", + "@babel/plugin-transform-numeric-separator": "^7.25.9", + "@babel/plugin-transform-object-rest-spread": "^7.25.9", + "@babel/plugin-transform-object-super": "^7.25.9", + "@babel/plugin-transform-optional-catch-binding": "^7.25.9", + "@babel/plugin-transform-optional-chaining": "^7.25.9", + "@babel/plugin-transform-parameters": "^7.25.9", + "@babel/plugin-transform-private-methods": "^7.25.9", + "@babel/plugin-transform-private-property-in-object": "^7.25.9", + "@babel/plugin-transform-property-literals": "^7.25.9", + "@babel/plugin-transform-regenerator": "^7.25.9", + "@babel/plugin-transform-regexp-modifiers": "^7.26.0", + "@babel/plugin-transform-reserved-words": "^7.25.9", + "@babel/plugin-transform-shorthand-properties": "^7.25.9", + "@babel/plugin-transform-spread": "^7.25.9", + "@babel/plugin-transform-sticky-regex": "^7.25.9", + "@babel/plugin-transform-template-literals": "^7.26.8", + "@babel/plugin-transform-typeof-symbol": "^7.26.7", + "@babel/plugin-transform-unicode-escapes": "^7.25.9", + "@babel/plugin-transform-unicode-property-regex": "^7.25.9", + "@babel/plugin-transform-unicode-regex": "^7.25.9", + "@babel/plugin-transform-unicode-sets-regex": "^7.25.9", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "babel-plugin-polyfill-corejs2": "^0.4.10", + "babel-plugin-polyfill-corejs3": "^0.11.0", + "babel-plugin-polyfill-regenerator": "^0.6.1", + "core-js-compat": "^3.40.0", + "semver": "^6.3.1" + } + }, + "@babel/preset-modules": { + "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + } + }, + "@babel/preset-typescript": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.26.0.tgz", + "integrity": "sha512-NMk1IGZ5I/oHhoXEElcm+xUnL/szL6xflkFZmoEU9xj1qSJXpiS7rsspYo92B4DRCDvZn2erT5LdsCeXAKNCkg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-validator-option": "^7.25.9", + "@babel/plugin-syntax-jsx": "^7.25.9", + "@babel/plugin-transform-modules-commonjs": "^7.25.9", + "@babel/plugin-transform-typescript": "^7.25.9" + } + }, + "@babel/template": { + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.26.8.tgz", + "integrity": "sha512-iNKaX3ZebKIsCvJ+0jd6embf+Aulaa3vNBqZ41kM7iTWjx5qzWKXGHiJUW3+nTpQ18SG11hdF8OAzKrpXkb96Q==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.26.2", + "@babel/parser": "^7.26.8", + "@babel/types": "^7.26.8" + } + }, + "@babel/traverse": { + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.8.tgz", + "integrity": "sha512-nic9tRkjYH0oB2dzr/JoGIm+4Q6SuYeLEiIiZDwBscRMYFJ+tMAz98fuel9ZnbXViA2I0HVSSRRK8DW5fjXStA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.26.8", + "@babel/parser": "^7.26.8", + "@babel/template": "^7.26.8", + "@babel/types": "^7.26.8", + "debug": "^4.3.1", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.8.tgz", + "integrity": "sha512-eUuWapzEGWFEpHFxgEaBG8e3n6S8L3MSu0oda755rOfabWPnh0Our1AozNFVUxGFIhbKgd1ksprsoDGMinTOTA==", + "dev": true, + "requires": { + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" } }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true - } - } - }, - "@babel/runtime": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.8.4.tgz", - "integrity": "sha512-neAp3zt80trRVBI1x0azq6c57aNBqYZH8KhMm3TaB7wEI5Q4A2SHfBHE8w9gOhI/lrqxtEbXZgQIrHP+wvSGwQ==", - "dev": true, - "requires": { - "regenerator-runtime": "^0.13.2" - }, - "dependencies": { - "regenerator-runtime": { - "version": "0.13.3", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz", - "integrity": "sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw==", - "dev": true - } - } - }, - "@babel/template": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.9.tgz", - "integrity": "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.25.9", - "@babel/parser": "^7.25.9", - "@babel/types": "^7.25.9" - } - }, - "@babel/traverse": { - "version": "7.26.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.4.tgz", - "integrity": "sha512-fH+b7Y4p3yqvApJALCPJcwb0/XaOSgtK4pzV6WVjPR5GLFQBRI7pfoX2V2iM48NXvX07NUxxm1Vw98YjqTcU5w==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.26.2", - "@babel/generator": "^7.26.3", - "@babel/parser": "^7.26.3", - "@babel/template": "^7.25.9", - "@babel/types": "^7.26.3", - "debug": "^4.3.1", - "globals": "^11.1.0" - }, - "dependencies": { - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true - } - } - }, - "@babel/types": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.3.tgz", - "integrity": "sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==", - "dev": true, - "requires": { - "@babel/helper-string-parser": "^7.25.9", - "@babel/helper-validator-identifier": "^7.25.9" - } - }, - "@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true - }, - "@bugsnag/browser": { - "version": "file:packages/browser", - "requires": { - "@bugsnag/core": "^8.2.0", - "@bugsnag/delivery-x-domain-request": "^8.2.0", - "@bugsnag/delivery-xml-http-request": "^8.2.0", - "@bugsnag/plugin-app-duration": "^8.2.0", - "@bugsnag/plugin-browser-context": "^8.2.0", - "@bugsnag/plugin-browser-device": "^8.2.0", - "@bugsnag/plugin-browser-request": "^8.2.0", - "@bugsnag/plugin-browser-session": "^8.2.0", - "@bugsnag/plugin-client-ip": "^8.2.0", - "@bugsnag/plugin-console-breadcrumbs": "^8.2.0", - "@bugsnag/plugin-inline-script-content": "^8.2.0", - "@bugsnag/plugin-interaction-breadcrumbs": "^8.2.0", - "@bugsnag/plugin-navigation-breadcrumbs": "^8.2.0", - "@bugsnag/plugin-network-breadcrumbs": "^8.2.0", - "@bugsnag/plugin-simple-throttle": "^8.2.0", - "@bugsnag/plugin-strip-query-string": "^8.2.0", - "@bugsnag/plugin-window-onerror": "^8.2.0", - "@bugsnag/plugin-window-unhandled-rejection": "^8.2.0", - "@rollup/plugin-babel": "^6.0.4", - "@rollup/plugin-commonjs": "^28.0.2", - "@rollup/plugin-node-resolve": "^16.0.0", - "@rollup/plugin-replace": "^6.0.2", - "@rollup/plugin-terser": "^0.4.4" - }, - "dependencies": { "@rollup/plugin-node-resolve": { "version": "16.0.0", "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-16.0.0.tgz", @@ -54938,42 +56505,61 @@ "resolve": "^1.22.1" } }, - "deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "babel-plugin-polyfill-corejs2": { + "version": "0.4.12", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.12.tgz", + "integrity": "sha512-CPWT6BwvhrTO2d8QVorhTCQw9Y43zOu7G9HigcfxvepOU6b8o3tcWad6oVgZIsZCTt42FFv97aA7ZJsbM4+8og==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.22.6", + "@babel/helper-define-polyfill-provider": "^0.6.3", + "semver": "^6.3.1" + } + }, + "babel-plugin-polyfill-corejs3": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.11.1.tgz", + "integrity": "sha512-yGCqvBT4rwMczo28xkH/noxJ6MZ4nJfkVYdoDaC/utLtWrXxv27HVrzAeSbqR8SxDsp46n0YF47EbHoixy6rXQ==", + "dev": true, + "requires": { + "@babel/helper-define-polyfill-provider": "^0.6.3", + "core-js-compat": "^3.40.0" + } + }, + "babel-plugin-polyfill-regenerator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.3.tgz", + "integrity": "sha512-LiWSbl4CRSIa5x/JAU6jZiG9eit9w6mz+yVMFwDE83LAWvt0AfGBoZ7HS/mkhrKuh2ZlzfVZYKoLjXdqw6Yt7Q==", + "dev": true, + "requires": { + "@babel/helper-define-polyfill-provider": "^0.6.3" + } + }, + "browserslist": { + "version": "4.24.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", + "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001688", + "electron-to-chromium": "^1.5.73", + "node-releases": "^2.0.19", + "update-browserslist-db": "^1.1.1" + } + }, + "caniuse-lite": { + "version": "1.0.30001699", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001699.tgz", + "integrity": "sha512-b+uH5BakXZ9Do9iK+CkDmctUSEqZl+SP056vc5usa0PL+ev5OHw003rZXcnjNDv3L8P5j6rwT6C0BPKSikW08w==", "dev": true - } - } - }, - "@bugsnag/core": { - "version": "file:packages/core", - "requires": { - "@bugsnag/cuid": "^3.0.0", - "@bugsnag/safe-json-stringify": "^6.0.0", - "@rollup/plugin-babel": "^6.0.4", - "@rollup/plugin-commonjs": "^28.0.2", - "@rollup/plugin-node-resolve": "^16.0.0", - "@rollup/plugin-replace": "^6.0.2", - "@rollup/plugin-typescript": "^12.1.2", - "@types/jest": "^26", - "error-stack-parser": "^2.0.3", - "iserror": "^0.0.2", - "rollup": "^4.24.0", - "stack-generator": "^2.0.3" - }, - "dependencies": { - "@rollup/plugin-node-resolve": { - "version": "16.0.0", - "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-16.0.0.tgz", - "integrity": "sha512-0FPvAeVUT/zdWoO0jnb/V5BlBsUSNfkIOtFHzMO4H9MOklrmQFY6FduVHKucNb/aTFxvnGhj4MNj/T1oNdDfNg==", + }, + "core-js-compat": { + "version": "3.40.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.40.0.tgz", + "integrity": "sha512-0XEDpr5y5mijvw8Lbc6E5AkjrHfp7eEoPlu36SWeAbcL8fn1G1ANe8DBlo2XoNN89oVpxWwOjYIPVzR4ZvsKCQ==", "dev": true, "requires": { - "@rollup/pluginutils": "^5.0.1", - "@types/resolve": "1.20.2", - "deepmerge": "^4.2.2", - "is-module": "^1.0.0", - "resolve": "^1.22.1" + "browserslist": "^4.24.3" } }, "deepmerge": { @@ -54981,6 +56567,33 @@ "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", "dev": true + }, + "electron-to-chromium": { + "version": "1.5.98", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.98.tgz", + "integrity": "sha512-bI/LbtRBxU2GzK7KK5xxFd2y9Lf9XguHooPYbcXWy6wUoT8NMnffsvRhPmSeUHLSDKAEtKuTaEtK4Ms15zkIEA==", + "dev": true + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + }, + "regenerator-transform": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", + "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", + "dev": true, + "requires": { + "@babel/runtime": "^7.8.4" + } + }, + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true } } }, @@ -58755,11 +60368,6 @@ "punycode": "^2.1.1" } }, - "tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" - }, "typescript": { "version": "5.6.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz", @@ -60299,14 +61907,6 @@ "requires": { "@emnapi/wasi-threads": "1.0.1", "tslib": "^2.4.0" - }, - "dependencies": { - "tslib": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", - "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==", - "dev": true - } } }, "@emnapi/runtime": { @@ -60316,14 +61916,6 @@ "dev": true, "requires": { "tslib": "^2.4.0" - }, - "dependencies": { - "tslib": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", - "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==", - "dev": true - } } }, "@emnapi/wasi-threads": { @@ -60333,14 +61925,6 @@ "dev": true, "requires": { "tslib": "^2.4.0" - }, - "dependencies": { - "tslib": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", - "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==", - "dev": true - } } }, "@esbuild/aix-ppc64": { @@ -60764,9 +62348,9 @@ "dev": true }, "@inquirer/core": { - "version": "10.1.6", - "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.1.6.tgz", - "integrity": "sha512-Bwh/Zk6URrHwZnSSzAZAKH7YgGYi0xICIBDFOqBQoXNNAzBHw/bgXgLmChfp+GyR3PnChcTbiCTZGC6YJNJkMA==", + "version": "10.1.7", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.1.7.tgz", + "integrity": "sha512-AA9CQhlrt6ZgiSy6qoAigiA1izOa751ugX6ioSjqgJ+/Gd+tEN/TORk5sUYNjXuHWfW0r1n/a6ak4u/NqHHrtA==", "dev": true, "requires": { "@inquirer/figures": "^1.0.10", @@ -65256,14 +66840,6 @@ "requires": { "nx": "19.8.2", "tslib": "^2.3.0" - }, - "dependencies": { - "tslib": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", - "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==", - "dev": true - } } }, "@nx/devkit": { @@ -65312,12 +66888,6 @@ "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==", "dev": true - }, - "tslib": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", - "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==", - "dev": true } } }, @@ -66871,14 +68441,6 @@ "dev": true, "requires": { "tslib": "^2.4.0" - }, - "dependencies": { - "tslib": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", - "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==", - "dev": true - } } }, "@types/accepts": { @@ -68005,14 +69567,6 @@ "requires": { "js-yaml": "^3.10.0", "tslib": "^2.4.0" - }, - "dependencies": { - "tslib": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", - "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==", - "dev": true - } } }, "@zkochan/js-yaml": { @@ -70161,14 +71715,6 @@ "no-case": "^3.0.4", "tslib": "^2.0.3", "upper-case-first": "^2.0.2" - }, - "dependencies": { - "tslib": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", - "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==", - "dev": true - } } }, "capture-exit": { @@ -76234,14 +77780,6 @@ "dev": true, "requires": { "tslib": "^2.0.0" - }, - "dependencies": { - "tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "dev": true - } } }, "inline-source-map": { @@ -82433,12 +83971,6 @@ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, "optional": true - }, - "tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "dev": true } } }, @@ -83250,14 +84782,6 @@ "dev": true, "requires": { "tslib": "^2.0.3" - }, - "dependencies": { - "tslib": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", - "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==", - "dev": true - } } }, "lowercase-keys": { @@ -83476,12 +85000,6 @@ "integrity": "sha512-dpev9ABuLWdEubk+cIaI9cHwRNNDjkBBLXTwI4UCUFdQ5xXKqNXoK4FEciw/vxf+NQ7Cb7sGUyeUtORvHIdRXQ==", "dev": true, "requires": {} - }, - "tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "dev": true } } }, @@ -85538,14 +87056,6 @@ "requires": { "lower-case": "^2.0.2", "tslib": "^2.0.3" - }, - "dependencies": { - "tslib": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", - "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==", - "dev": true - } } }, "nocache": { @@ -86250,12 +87760,6 @@ "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==", "dev": true - }, - "tslib": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", - "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==", - "dev": true } } }, @@ -88564,14 +90068,6 @@ "dev": true, "requires": { "tslib": "^2.1.0" - }, - "dependencies": { - "tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "dev": true - } } }, "safe-array-concat": { @@ -90490,10 +91986,9 @@ } }, "tslib": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", - "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==", - "dev": true + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" }, "tslint": { "version": "5.20.1", @@ -90516,6 +92011,12 @@ "tsutils": "^2.29.0" }, "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, "tsutils": { "version": "2.29.0", "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", @@ -90928,14 +92429,6 @@ "dev": true, "requires": { "tslib": "^2.0.3" - }, - "dependencies": { - "tslib": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", - "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==", - "dev": true - } } }, "uri-js": { diff --git a/packages/browser/src/bugsnag.ts b/packages/browser/src/bugsnag.ts index 1d31f8868..967fc1e60 100644 --- a/packages/browser/src/bugsnag.ts +++ b/packages/browser/src/bugsnag.ts @@ -116,7 +116,9 @@ const notifier: BrowserClient = { type Method = keyof typeof Client.prototype -map(['resetEventCount'].concat(keys(Client.prototype)) as Method[], (m) => { +const clientMethods = Object.getOwnPropertyNames(Client.prototype).concat(['resetEventCount']) as Method[] + +map(clientMethods, (m) => { if (/^_/.test(m)) return notifier[m] = function () { if (!notifier._client) return console.log(`Bugsnag.${m}() was called before Bugsnag.start()`) diff --git a/packages/core/babel.config.js b/packages/core/babel.config.js index 235ee4504..a3f7ee0a5 100644 --- a/packages/core/babel.config.js +++ b/packages/core/babel.config.js @@ -1,3 +1,6 @@ -const babelConfig = require('../../babel.config.js') - -module.exports = babelConfig +module.exports = { + presets: [ + '@babel/preset-env', + '@babel/preset-typescript' + ] +} diff --git a/packages/core/package.json b/packages/core/package.json index 71be97202..57e62956c 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -60,6 +60,8 @@ "stack-generator": "^2.0.3" }, "devDependencies": { + "@babel/preset-env": "^7.26.8", + "@babel/preset-typescript": "^7.26.0", "@rollup/plugin-babel": "^6.0.4", "@rollup/plugin-commonjs": "^28.0.2", "@rollup/plugin-node-resolve": "^16.0.0", diff --git a/packages/core/rollup.config.npm.mjs b/packages/core/rollup.config.npm.mjs index b939f0ecf..655cf61e3 100644 --- a/packages/core/rollup.config.npm.mjs +++ b/packages/core/rollup.config.npm.mjs @@ -3,21 +3,29 @@ import commonjs from '@rollup/plugin-commonjs' import nodeResolve from '@rollup/plugin-node-resolve' import typescript from '@rollup/plugin-typescript' -import createRollupConfig, { sharedOutput } from "../../.rollup/index.mjs" +import { sharedOutput } from "../../.rollup/index.mjs" + +const extensions = ['.js', '.ts'] const plugins = [ nodeResolve({ - browser: true + extensions }), commonjs(), - typescript(), - babel({ babelHelpers: 'bundled' }), + babel({ + babelHelpers: 'bundled', + exclude: 'node_modules/**', + extensions, + }), + typescript({ + noForceEmit: true, + }), ] const external = [/node_modules/] export default [ - createRollupConfig({ + { input: "src/index.ts", external, output: [ @@ -29,8 +37,8 @@ export default [ } ], plugins - }), - createRollupConfig({ + }, + { input: "src/index.ts", external, output: [ @@ -41,5 +49,5 @@ export default [ }, ], plugins - }) + } ]; diff --git a/packages/core/src/breadcrumb.d.ts b/packages/core/src/breadcrumb.d.ts deleted file mode 100644 index cdf705ad1..000000000 --- a/packages/core/src/breadcrumb.d.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { Breadcrumb } from '../types' - -export default class BreadcrumbWithInternals extends Breadcrumb { - constructor (message: string, metadata: Breadcrumb['metadata'], type: Breadcrumb['type'], timestamp?: Date) - toJSON(): { - type: Breadcrumb['type'] - name: Breadcrumb['message'] - timestamp: Breadcrumb['timestamp'] - metaData: Breadcrumb['metadata'] - } -} diff --git a/packages/core/src/breadcrumb.js b/packages/core/src/breadcrumb.js deleted file mode 100644 index ee1693dd3..000000000 --- a/packages/core/src/breadcrumb.js +++ /dev/null @@ -1,19 +0,0 @@ -class Breadcrumb { - constructor (message, metadata, type, timestamp = new Date()) { - this.type = type - this.message = message - this.metadata = metadata - this.timestamp = timestamp - } - - toJSON () { - return { - type: this.type, - name: this.message, - timestamp: this.timestamp, - metaData: this.metadata - } - } -} - -module.exports = Breadcrumb diff --git a/packages/core/src/breadcrumb.ts b/packages/core/src/breadcrumb.ts new file mode 100644 index 000000000..0fbe80b93 --- /dev/null +++ b/packages/core/src/breadcrumb.ts @@ -0,0 +1,19 @@ +import { BreadcrumbType } from "./common" + +export default class Breadcrumb { + constructor( + public readonly message: string, + public readonly metadata: { [key: string]: any }, + public readonly type: BreadcrumbType, + public readonly timestamp: Date = new Date() + ) {} + + toJSON () { + return { + type: this.type, + name: this.message, + timestamp: this.timestamp, + metaData: this.metadata + } + } +} diff --git a/packages/core/src/client.d.ts b/packages/core/src/client.d.ts deleted file mode 100644 index 1ef35b4dc..000000000 --- a/packages/core/src/client.d.ts +++ /dev/null @@ -1,87 +0,0 @@ -import { Client, OnErrorCallback, Config, Breadcrumb, Session, OnSessionCallback, OnBreadcrumbCallback, Plugin, Device, App, User, FeatureFlag } from '../types' -import EventWithInternals from './event' - -interface LoggerConfig { - debug: (msg: any) => void - info: (msg: any) => void - warn: (msg: any) => void - error: (msg: any, err?: unknown) => void -} - -interface Notifier { - name: string - version: string - url: string -} - -interface EventDeliveryPayload { - apiKey: string - notifier: Notifier - events: EventWithInternals[] -} - -interface SessionDeliveryPayload { - notifier?: Notifier - device?: Device - app?: App - sessions?: Array<{ - id: string - startedAt: Date - user?: User - }> -} - -interface Delivery { - sendEvent(payload: EventDeliveryPayload, cb: (err?: Error | null) => void): void - sendSession(session: SessionDeliveryPayload, cb: (err?: Error | null) => void): void -} - -export interface SessionDelegate { - startSession: (client: ClientWithInternals, session: Session) => ClientWithInternals - pauseSession: (client: ClientWithInternals) => void - resumeSession: (client: ClientWithInternals) => ClientWithInternals -} - -/** - * Extend the public type definitions with internal declarations. - * - * This is currently used by the unit tests. These will be rolled into the - * module itself once it is converted to TypeScript. - */ -export default class ClientWithInternals extends Client { - public constructor(opts: T, schema?: {[key: string]: any}, internalPlugins?: Plugin[], notifier?: Notifier) - _config: T - _depth: number - _logger: LoggerConfig - _breadcrumbs: Breadcrumb[] - _delivery: Delivery - _setDelivery: (handler: (client: Client) => Delivery) => void - _clientContext: any - _user: User - - _metadata: { [key: string]: any } - _features: Array - _featuresIndex: { [key: string]: number } - - startSession(): ClientWithInternals - resumeSession(): ClientWithInternals - _session: Session | null - _pausedSession: Session | null - - _sessionDelegate: SessionDelegate - - _addOnSessionPayload: (cb: (sessionPayload: Session) => void) => void - - _cbs: { - e: OnErrorCallback[] - s: OnSessionCallback[] - sp: any[] - b: OnBreadcrumbCallback[] - } - - _loadPlugin(plugin: Plugin): void - - _isBreadcrumbTypeEnabled(type: string): boolean - - public addOnError(fn: OnErrorCallback, moveToFront?: boolean): void; -} diff --git a/packages/core/src/client.js b/packages/core/src/client.ts similarity index 65% rename from packages/core/src/client.js rename to packages/core/src/client.ts index 4979d293e..f82f2cd2c 100644 --- a/packages/core/src/client.js +++ b/packages/core/src/client.ts @@ -1,28 +1,105 @@ -const config = require('./config') -const Event = require('./event') -const Breadcrumb = require('./breadcrumb') -const Session = require('./session') -const map = require('./lib/es-utils/map') -const includes = require('./lib/es-utils/includes') -const filter = require('./lib/es-utils/filter') -const reduce = require('./lib/es-utils/reduce') -const keys = require('./lib/es-utils/keys') -const assign = require('./lib/es-utils/assign') -const runCallbacks = require('./lib/callback-runner') -const metadataDelegate = require('./lib/metadata-delegate') -const runSyncCallbacks = require('./lib/sync-callback-runner') -const BREADCRUMB_TYPES = require('./lib/breadcrumb-types') -const { add, clear, merge } = require('./lib/feature-flag-delegate') +import configSchema from './config' +import Event from './event' +import Breadcrumb from './breadcrumb' +import Session from './session' +import map from './lib/es-utils/map' +import includes from './lib/es-utils/includes' +import filter from './lib/es-utils/filter' +import reduce from './lib/es-utils/reduce' +import keys from './lib/es-utils/keys' +import assign from './lib/es-utils/assign' +import runCallbacks from './lib/callback-runner' +import metadataDelegate from './lib/metadata-delegate' +import runSyncCallbacks from './lib/sync-callback-runner' +import BREADCRUMB_TYPES from './lib/breadcrumb-types' +import { add, clear, merge } from './lib/feature-flag-delegate' +import { App, BreadcrumbType, Config, Device, FeatureFlag, OnBreadcrumbCallback, OnErrorCallback, OnSessionCallback, Plugin, User } from './common' const noop = () => {} -class Client { - constructor (configuration, schema = config.schema, internalPlugins = [], notifier) { +interface LoggerConfig { + debug: (msg: any) => void + info: (msg: any) => void + warn: (msg: any) => void + error: (msg: any, err?: unknown) => void +} + +interface Notifier { + name: string + version: string + url: string +} + +interface EventDeliveryPayload { + apiKey: string + notifier: Notifier + events: Event[] +} + +interface SessionDeliveryPayload { + notifier?: Notifier + device?: Device + app?: App + sessions?: Array<{ + id: string + startedAt: Date + user?: User + }> +} + +interface Delivery { + sendEvent(payload: EventDeliveryPayload, cb: (err?: Error | null) => void): void + sendSession(session: SessionDeliveryPayload, cb: (err?: Error | null) => void): void +} + +export interface SessionDelegate { + startSession: (client: Client, session: Session) => Client + pauseSession: (client: Client) => void + resumeSession: (client: Client) => Client +} + +export default class Client { + private readonly _notifier?: Notifier + // This ought to be Required but the current version of TypeScript doesn't seem to like it + public readonly _config: Required + private readonly _schema: any + + public _delivery: Delivery + + private readonly _plugins: { [key: string]: any } + + public _breadcrumbs: Breadcrumb[] + public _session: Session | null + public _metadata: { [key: string]: any } + public _featuresIndex: { [key: string]: number } + public _features: Array + + private _context: string | undefined + + public _user: User + + public _logger: LoggerConfig + + public readonly _cbs: { + e: OnErrorCallback[] + s: OnSessionCallback[] + sp: any[] + b: OnBreadcrumbCallback[] + } + + private readonly Client: typeof Client + private readonly Event: typeof Event + private readonly Breadcrumb: typeof Breadcrumb + private readonly Session: typeof Session + + private readonly _depth: number + + public _sessionDelegate?: SessionDelegate + + constructor (configuration: T, schema = configSchema, internalPlugins: Plugin[] = [], notifier?: Notifier) { // notifier id this._notifier = notifier - // intialise opts and config - this._config = {} this._schema = schema // i/o @@ -71,34 +148,37 @@ class Client { // bound to have the client as its `this` value – see below. this._depth = 1 + // eslint-disable-next-line @typescript-eslint/no-this-alias const self = this const notify = this.notify this.notify = function () { + // @ts-ignore + // eslint-disable-next-line prefer-rest-params return notify.apply(self, arguments) } } - addMetadata (section, keyOrObj, maybeVal) { + addMetadata (section: string, keyOrObj: any, maybeVal?: any) { return metadataDelegate.add(this._metadata, section, keyOrObj, maybeVal) } - getMetadata (section, key) { + getMetadata (section: string, key?: any) { return metadataDelegate.get(this._metadata, section, key) } - clearMetadata (section, key) { + clearMetadata (section: string, key?: any) { return metadataDelegate.clear(this._metadata, section, key) } - addFeatureFlag (name, variant = null) { + addFeatureFlag (name: string, variant: string | null = null) { add(this._features, this._featuresIndex, name, variant) } - addFeatureFlags (featureFlags) { + addFeatureFlags (featureFlags: FeatureFlag[]) { merge(this._features, featureFlags, this._featuresIndex) } - clearFeatureFlag (name) { + clearFeatureFlag (name: string) { clear(this._features, this._featuresIndex, name) } @@ -111,11 +191,11 @@ class Client { return this._context } - setContext (c) { + setContext (c: string) { this._context = c } - _configure (opts, internalPlugins) { + _configure (opts: T, internalPlugins: Plugin[]) { const schema = reduce(internalPlugins, (schema, plugin) => { if (plugin && plugin.configSchema) return assign({}, schema, plugin.configSchema) return schema @@ -127,7 +207,7 @@ class Client { } // accumulate configuration and error messages - const { errors, config } = reduce(keys(schema), (accum, key) => { + const { errors, config } = reduce(keys(schema), (accum, key: keyof typeof opts) => { const defaultValue = schema[key].defaultValue(opts[key]) if (opts[key] !== undefined) { @@ -180,11 +260,11 @@ class Client { return this._user } - setUser (id, email, name) { + setUser (id?: string | null, email?: string | null, name?: string | null) { this._user = { id, email, name } } - _loadPlugin (plugin) { + _loadPlugin (plugin: Plugin) { const result = plugin.load(this) // JS objects are not the safest way to store arbitrarily keyed values, // so bookend the key with some characters that prevent tampering with @@ -193,11 +273,11 @@ class Client { if (plugin.name) this._plugins[`~${plugin.name}~`] = result } - getPlugin (name) { + getPlugin (name: string) { return this._plugins[`~${name}~`] } - _setDelivery (d) { + _setDelivery (d: (client: Client) => Delivery) { this._delivery = d(this) } @@ -218,46 +298,46 @@ class Client { return this } - return this._sessionDelegate.startSession(this, session) + return this._sessionDelegate?.startSession(this, session) } - addOnError (fn, front = false) { + addOnError (fn: OnErrorCallback, front = false) { this._cbs.e[front ? 'unshift' : 'push'](fn) } - removeOnError (fn) { + removeOnError (fn: OnErrorCallback) { this._cbs.e = filter(this._cbs.e, f => f !== fn) } - _addOnSessionPayload (fn) { + _addOnSessionPayload (fn: OnSessionCallback) { this._cbs.sp.push(fn) } - addOnSession (fn) { + addOnSession (fn: OnSessionCallback) { this._cbs.s.push(fn) } - removeOnSession (fn) { + removeOnSession (fn: OnSessionCallback) { this._cbs.s = filter(this._cbs.s, f => f !== fn) } - addOnBreadcrumb (fn, front = false) { + addOnBreadcrumb (fn: OnBreadcrumbCallback, front = false) { this._cbs.b[front ? 'unshift' : 'push'](fn) } - removeOnBreadcrumb (fn) { + removeOnBreadcrumb (fn: OnBreadcrumbCallback) { this._cbs.b = filter(this._cbs.b, f => f !== fn) } pauseSession () { - return this._sessionDelegate.pauseSession(this) + return this._sessionDelegate?.pauseSession(this) } resumeSession () { - return this._sessionDelegate.resumeSession(this) + return this._sessionDelegate?.resumeSession(this) } - leaveBreadcrumb (message, metadata, type) { + leaveBreadcrumb (message: string, metadata?: any, type?: BreadcrumbType) { // coerce bad values so that the defaults get set message = typeof message === 'string' ? message : '' type = (typeof type === 'string' && includes(BREADCRUMB_TYPES, type)) ? type : 'manual' @@ -283,18 +363,18 @@ class Client { } } - _isBreadcrumbTypeEnabled (type) { + _isBreadcrumbTypeEnabled (type: string) { const types = this._config.enabledBreadcrumbTypes return types === null || includes(types, type) } - notify (maybeError, onError, postReportCallback = noop) { + notify (maybeError: Error, onError?: OnErrorCallback, postReportCallback: (err: Error | null | undefined, event: Event) => void = noop) { const event = Event.create(maybeError, true, undefined, 'notify()', this._depth + 1, this._logger) this._notify(event, onError, postReportCallback) } - _notify (event, onError, postReportCallback = noop) { + _notify (event: Event, onError?: OnErrorCallback, postReportCallback: (err: Error | null | undefined, event: Event) => void = noop) { event.app = assign({}, event.app, { releaseStage: this._config.releaseStage, version: this._config.appVersion, @@ -314,13 +394,13 @@ class Client { const originalSeverity = event.severity - const onCallbackError = err => { + const onCallbackError = (err: Error) => { // errors in callbacks are tolerated but we want to log them out this._logger.error('Error occurred in onError callback, continuing anyway…') this._logger.error(err) } - const callbacks = [].concat(this._cbs.e).concat(onError) + const callbacks = ([] as (OnErrorCallback | undefined)[]).concat(this._cbs.e).concat(onError) runCallbacks(callbacks, event, onCallbackError, (err, shouldSend) => { if (err) onCallbackError(err) @@ -331,8 +411,11 @@ class Client { if (this._isBreadcrumbTypeEnabled('error')) { // only leave a crumb for the error if actually got sent + // @ts-ignore Client.prototype.leaveBreadcrumb.call(this, event.errors[0].errorClass, { + // @ts-ignore errorClass: event.errors[0].errorClass, + // @ts-ignore errorMessage: event.errors[0].errorMessage, severity: event.severity }, 'error') @@ -354,20 +437,21 @@ class Client { this._delivery.sendEvent({ apiKey: event.apiKey || this._config.apiKey, - notifier: this._notifier, + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + notifier: this._notifier!, events: [event] }, (err) => postReportCallback(err, event)) }) } } -const generateConfigErrorMessage = (errors, rawInput) => { +const generateConfigErrorMessage = (errors: Record, rawInput: Config) => { const er = new Error( `Invalid configuration\n${map(keys(errors), key => ` - ${key} ${errors[key]}, got ${stringify(rawInput[key])}`).join('\n\n')}`) return er } -const stringify = val => { +const stringify = (val: unknown) => { switch (typeof val) { case 'string': case 'number': @@ -377,4 +461,3 @@ const stringify = val => { } } -module.exports = Client diff --git a/packages/core/src/common.ts b/packages/core/src/common.ts index 6de314579..45b94a77d 100644 --- a/packages/core/src/common.ts +++ b/packages/core/src/common.ts @@ -1 +1,160 @@ +import Breadcrumb from "./breadcrumb"; +import Client from "./client"; +import Session from "./session"; +import Event from "./event"; + export type BreadcrumbType = 'error' | 'log' | 'manual' | 'navigation' | 'process' | 'request' | 'state' | 'user'; + +export const BREADCRUMB_TYPES = ['navigation', 'request', 'process', 'log', 'user', 'state', 'error', 'manual'] as const; + +export interface Config { + apiKey: string + appVersion?: string + appType?: string + autoDetectErrors?: boolean + enabledErrorTypes?: { + unhandledExceptions?: boolean + unhandledRejections?: boolean + } + autoTrackSessions?: boolean + context?: string + enabledBreadcrumbTypes?: BreadcrumbType[] | null + enabledReleaseStages?: string[] | null + endpoints?: { notify: string, sessions: string } + redactedKeys?: Array + onBreadcrumb?: OnBreadcrumbCallback | OnBreadcrumbCallback[] + onError?: OnErrorCallback | OnErrorCallback[] + onSession?: OnSessionCallback | OnSessionCallback[] + logger?: Logger | null + maxBreadcrumbs?: number + metadata?: { [section: string]: { [key: string]: any } } + featureFlags?: FeatureFlag[] + releaseStage?: string + plugins?: Plugin[] + user?: User | null + reportUnhandledPromiseRejectionsAsHandled?: boolean + sendPayloadChecksums?: boolean +} + +export type OnErrorCallback = (event: Event, cb: (err: null | Error, shouldSend?: boolean) => void) => void | boolean | Promise +export type OnSessionCallback = (session: Session) => void | boolean; +export type OnBreadcrumbCallback = (breadcrumb: Breadcrumb) => void | boolean; + +export interface Plugin { + name?: string + load: (client: Client) => any + destroy?(): void + configSchema?: { + [key: string]: { + defaultValue: () => unknown + message: string + validate: (value: unknown) => boolean + } + } +} + +export interface Logger { + debug: (...args: any[]) => void + info: (...args: any[]) => void + warn: (...args: any[]) => void + error: (...args: any[]) => void +} + +export interface SessionDelegate { + startSession: (client: Client) => Client +} + +export interface EventPayload { + apiKey: string + notifier: { + name: string + version: string + url: string + } + events: Event[] +} + +export interface SessionPayload { + notifier: { + name: string + version: string + url: string + } + device?: Device + user?: User + app?: App + sessions: Session[] +} + +export type NotifiableError = Error +| { errorClass: string, errorMessage: string } +| { name: string, message: string } +| string + +export interface Device { + id?: string + hostname?: string + locale?: string + manufacturer?: string + model?: string + modelNumber?: string + orientation?: string + osName?: string + osVersion?: string + runtimeVersions?: { + [key: string]: any + } + time?: Date + userAgent?: string + [key: string]: any +} + +export interface App { + codeBundleId?: string + duration?: number + durationInForeground?: number + inForeground?: boolean + releaseStage?: string + type?: string + version?: string + [key: string]: any +} + +export interface Request { + clientIp?: string + headers?: { [key: string]: string } + httpMethod?: string + referer?: string + url?: string + [key: string]: any +} + +export interface User { + id?: string | null + email?: string | null + name?: string | null +} + +type ThreadType = 'cocoa' | 'android' | 'browserJs' +export interface Thread { + id: string + name: string + errorReportingThread: boolean + type: ThreadType + stacktrace: Stackframe[] + state?: string +} + +export interface Stackframe { + file: string + method?: string + lineNumber?: number + columnNumber?: number + code?: Record + inProject?: boolean +} + +export interface FeatureFlag { + name: string + variant?: string | null +} \ No newline at end of file diff --git a/packages/core/src/config.d.ts b/packages/core/src/config.d.ts deleted file mode 100644 index cee871526..000000000 --- a/packages/core/src/config.d.ts +++ /dev/null @@ -1,115 +0,0 @@ -export interface Schema { - apiKey: { - defaultValue: () => null - message: string - validate: (value: unknown) => boolean - } - appVersion: { - defaultValue: () => undefined - message: string - validate: (value: unknown) => boolean - } - appType: { - defaultValue: () => undefined - message: string - validate: (value: unknown) => boolean - } - autoDetectErrors: { - defaultValue: () => true - message: string - validate: (value: unknown) => boolean - } - enabledErrorTypes: { - defaultValue: () => { unhandledExceptions: boolean, unhandledRejections: boolean } - message: string - allowPartialObject: boolean - validate: (value: unknown) => boolean - } - onError: { - defaultValue: () => [] - message: string - validate: (value: unknown) => boolean - } - onSession: { - defaultValue: () => [] - message: string - validate: (value: unknown) => boolean - } - onBreadcrumb: { - defaultValue: () => [] - message: string - validate: (value: unknown) => boolean - } - endpoints: { - defaultValue: (endpoints: { notify: string, sessions: string } | undefined) => { notify: string | null, sessions: string | null } - message: string - validate: (value: unknown) => boolean - } - autoTrackSessions: { - defaultValue: () => boolean - message: string - validate: (value: unknown) => boolean - } - enabledReleaseStages: { - defaultValue: () => null - message: string - validate: (value: unknown) => boolean - } - releaseStage: { - defaultValue: () => 'production' - message: string - validate: (value: unknown) => boolean - } - maxBreadcrumbs: { - defaultValue: () => 25 - message: string - validate: (value: unknown) => boolean - } - enabledBreadcrumbTypes: { - defaultValue: () => ['navigation', 'request', 'process', 'log', 'user', 'state', 'error', 'manual'] - message: string - validate: (value: unknown) => boolean - } - context: { - defaultValue: () => undefined - message: string - validate: (value: unknown) => boolean - } - user: { - defaultValue: () => {} - message: string - validate: (value: unknown) => boolean - } - metadata: { - defaultValue: () => {} - message: string - validate: (value: unknown) => boolean - } - logger: { - defaultValue: () => undefined - message: string - validate: (value: unknown) => boolean - } - redactedKeys: { - defaultValue: () => ['password'] - message: string - validate: (value: unknown) => boolean - } - plugins: { - defaultValue: () => [] - message: string - validate: (value: unknown) => boolean - } - featureFlags: { - defaultValue: () => [] - message: string - validate: (value: unknown) => boolean - } - reportUnhandledPromiseRejectionsAsHandled: { - defaultValue: () => false - message: string - validate: (value: unknown) => boolean - } -} - -export const schema: Schema diff --git a/packages/core/src/config.js b/packages/core/src/config.js deleted file mode 100644 index 04081a4ac..000000000 --- a/packages/core/src/config.js +++ /dev/null @@ -1,182 +0,0 @@ -const filter = require('./lib/es-utils/filter') -const reduce = require('./lib/es-utils/reduce') -const keys = require('./lib/es-utils/keys') -const isArray = require('./lib/es-utils/is-array') -const includes = require('./lib/es-utils/includes') -const intRange = require('./lib/validators/int-range') -const stringWithLength = require('./lib/validators/string-with-length') -const listOfFunctions = require('./lib/validators/list-of-functions') - -const BREADCRUMB_TYPES = require('./lib/breadcrumb-types') -const defaultErrorTypes = () => ({ unhandledExceptions: true, unhandledRejections: true }) - -module.exports.schema = { - apiKey: { - defaultValue: () => null, - message: 'is required', - validate: stringWithLength - }, - appVersion: { - defaultValue: () => undefined, - message: 'should be a string', - validate: value => value === undefined || stringWithLength(value) - }, - appType: { - defaultValue: () => undefined, - message: 'should be a string', - validate: value => value === undefined || stringWithLength(value) - }, - autoDetectErrors: { - defaultValue: () => true, - message: 'should be true|false', - validate: value => value === true || value === false - }, - enabledErrorTypes: { - defaultValue: () => defaultErrorTypes(), - message: 'should be an object containing the flags { unhandledExceptions:true|false, unhandledRejections:true|false }', - allowPartialObject: true, - validate: value => { - // ensure we have an object - if (typeof value !== 'object' || !value) return false - const providedKeys = keys(value) - const defaultKeys = keys(defaultErrorTypes()) - // ensure it only has a subset of the allowed keys - if (filter(providedKeys, k => includes(defaultKeys, k)).length < providedKeys.length) return false - // ensure all of the values are boolean - if (filter(keys(value), k => typeof value[k] !== 'boolean').length > 0) return false - return true - } - }, - onError: { - defaultValue: () => [], - message: 'should be a function or array of functions', - validate: listOfFunctions - }, - onSession: { - defaultValue: () => [], - message: 'should be a function or array of functions', - validate: listOfFunctions - }, - onBreadcrumb: { - defaultValue: () => [], - message: 'should be a function or array of functions', - validate: listOfFunctions - }, - endpoints: { - defaultValue: (endpoints) => { - // only apply the default value if no endpoints have been provided, otherwise prevent delivery by setting to null - if (typeof endpoints === 'undefined') { - return ({ - notify: 'https://notify.bugsnag.com', - sessions: 'https://sessions.bugsnag.com' - }) - } else { - return ({ notify: null, sessions: null }) - } - }, - message: 'should be an object containing endpoint URLs { notify, sessions }', - validate: (val) => - // first, ensure it's an object - (val && typeof val === 'object') && - ( - // notify and sessions must always be set - stringWithLength(val.notify) && stringWithLength(val.sessions) - ) && - // ensure no keys other than notify/session are set on endpoints object - filter(keys(val), k => !includes(['notify', 'sessions'], k)).length === 0 - }, - autoTrackSessions: { - defaultValue: val => true, - message: 'should be true|false', - validate: val => val === true || val === false - }, - enabledReleaseStages: { - defaultValue: () => null, - message: 'should be an array of strings', - validate: value => value === null || (isArray(value) && filter(value, f => typeof f === 'string').length === value.length) - }, - releaseStage: { - defaultValue: () => 'production', - message: 'should be a string', - validate: value => typeof value === 'string' && value.length - }, - maxBreadcrumbs: { - defaultValue: () => 25, - message: 'should be a number ≤100', - validate: value => intRange(0, 100)(value) - }, - enabledBreadcrumbTypes: { - defaultValue: () => BREADCRUMB_TYPES, - message: `should be null or a list of available breadcrumb types (${BREADCRUMB_TYPES.join(',')})`, - validate: value => value === null || (isArray(value) && reduce(value, (accum, maybeType) => { - if (accum === false) return accum - return includes(BREADCRUMB_TYPES, maybeType) - }, true)) - }, - context: { - defaultValue: () => undefined, - message: 'should be a string', - validate: value => value === undefined || typeof value === 'string' - }, - user: { - defaultValue: () => ({}), - message: 'should be an object with { id, email, name } properties', - validate: value => - (value === null) || - (value && reduce( - keys(value), - (accum, key) => accum && includes(['id', 'email', 'name'], key), - true - )) - }, - metadata: { - defaultValue: () => ({}), - message: 'should be an object', - validate: (value) => typeof value === 'object' && value !== null - }, - logger: { - defaultValue: () => undefined, - message: 'should be null or an object with methods { debug, info, warn, error }', - validate: value => - (!value) || - (value && reduce( - ['debug', 'info', 'warn', 'error'], - (accum, method) => accum && typeof value[method] === 'function', - true - )) - }, - redactedKeys: { - defaultValue: () => ['password'], - message: 'should be an array of strings|regexes', - validate: value => - isArray(value) && value.length === filter(value, s => - (typeof s === 'string' || (s && typeof s.test === 'function')) - ).length - }, - plugins: { - defaultValue: () => ([]), - message: 'should be an array of plugin objects', - validate: value => - isArray(value) && value.length === filter(value, p => - (p && typeof p === 'object' && typeof p.load === 'function') - ).length - }, - featureFlags: { - defaultValue: () => [], - message: 'should be an array of objects that have a "name" property', - validate: value => - isArray(value) && value.length === filter(value, feature => - feature && typeof feature === 'object' && typeof feature.name === 'string' - ).length - }, - reportUnhandledPromiseRejectionsAsHandled: { - defaultValue: () => false, - message: 'should be true|false', - validate: value => value === true || value === false - }, - sendPayloadChecksums: { - defaultValue: () => false, - message: 'should be true|false', - validate: value => value === true || value === false - } -} diff --git a/packages/core/src/config.ts b/packages/core/src/config.ts new file mode 100644 index 000000000..302caf1a3 --- /dev/null +++ b/packages/core/src/config.ts @@ -0,0 +1,306 @@ +import filter from './lib/es-utils/filter' +import reduce from './lib/es-utils/reduce' +import keys from './lib/es-utils/keys' +import isArray from './lib/es-utils/is-array' +import includes from './lib/es-utils/includes' +import intRange from './lib/validators/int-range' +import stringWithLength from './lib/validators/string-with-length' +import listOfFunctions from './lib/validators/list-of-functions' + +import { BREADCRUMB_TYPES } from './common' + +const defaultErrorTypes = () => ({ unhandledExceptions: true, unhandledRejections: true }) + +export interface Schema { + apiKey: { + defaultValue: () => null + message: string + validate: (value: unknown) => boolean + } + appVersion: { + defaultValue: () => undefined + message: string + validate: (value: unknown) => boolean + } + appType: { + defaultValue: () => undefined + message: string + validate: (value: unknown) => boolean + } + autoDetectErrors: { + defaultValue: () => true + message: string + validate: (value: unknown) => boolean + } + enabledErrorTypes: { + defaultValue: () => { unhandledExceptions: boolean, unhandledRejections: boolean } + message: string + allowPartialObject: boolean + validate: (value: unknown) => boolean + } + onError: { + defaultValue: () => [] + message: string + validate: (value: unknown) => boolean + } + onSession: { + defaultValue: () => [] + message: string + validate: (value: unknown) => boolean + } + onBreadcrumb: { + defaultValue: () => [] + message: string + validate: (value: unknown) => boolean + } + endpoints: { + defaultValue: (endpoints: { notify: string, sessions: string } | undefined) => { notify: string | null, sessions: string | null } + message: string + validate: (value: unknown) => boolean + } + autoTrackSessions: { + defaultValue: () => boolean + message: string + validate: (value: unknown) => boolean + } + enabledReleaseStages: { + defaultValue: () => null + message: string + validate: (value: unknown) => boolean + } + releaseStage: { + defaultValue: () => 'production' + message: string + validate: (value: unknown) => boolean + } + maxBreadcrumbs: { + defaultValue: () => 25 + message: string + validate: (value: unknown) => boolean + } + enabledBreadcrumbTypes: { + defaultValue: () => typeof BREADCRUMB_TYPES + message: string + validate: (value: unknown) => boolean + } + context: { + defaultValue: () => undefined + message: string + validate: (value: unknown) => boolean + } + user: { + defaultValue: () => {} + message: string + validate: (value: unknown) => boolean + } + metadata: { + defaultValue: () => {} + message: string + validate: (value: unknown) => boolean + } + logger: { + defaultValue: () => undefined + message: string + validate: (value: unknown) => boolean + } + redactedKeys: { + defaultValue: () => ['password'] + message: string + validate: (value: unknown) => boolean + } + plugins: { + defaultValue: () => [] + message: string + validate: (value: unknown) => boolean + } + featureFlags: { + defaultValue: () => [] + message: string + validate: (value: unknown) => boolean + } + reportUnhandledPromiseRejectionsAsHandled: { + defaultValue: () => false + message: string + validate: (value: unknown) => boolean + }, + sendPayloadChecksums: { + defaultValue: () => false, + message: string, + validate: (value: unknown) => boolean + } +} + +const schema: Schema = { + apiKey: { + defaultValue: () => null, + message: 'is required', + validate: stringWithLength + }, + appVersion: { + defaultValue: () => undefined, + message: 'should be a string', + validate: (value: unknown) => value === undefined || stringWithLength(value) + }, + appType: { + defaultValue: () => undefined, + message: 'should be a string', + validate: (value: unknown) => value === undefined || stringWithLength(value) + }, + autoDetectErrors: { + defaultValue: () => true, + message: 'should be true|false', + validate: (value: unknown) => value === true || value === false + }, + enabledErrorTypes: { + defaultValue: () => defaultErrorTypes(), + message: 'should be an object containing the flags { unhandledExceptions:true|false, unhandledRejections:true|false }', + allowPartialObject: true, + validate: (value: unknown) => { + // ensure we have an object + if (typeof value !== 'object' || !value) return false + const providedKeys = keys(value) + const defaultKeys = keys(defaultErrorTypes()) + // ensure it only has a subset of the allowed keys + if (filter(providedKeys, k => includes(defaultKeys, k)).length < providedKeys.length) return false + // ensure all of the values are boolean + if (filter(keys(value), k => typeof value[k] !== 'boolean').length > 0) return false + return true + } + }, + onError: { + defaultValue: () => [], + message: 'should be a function or array of functions', + validate: listOfFunctions + }, + onSession: { + defaultValue: () => [], + message: 'should be a function or array of functions', + validate: listOfFunctions + }, + onBreadcrumb: { + defaultValue: () => [], + message: 'should be a function or array of functions', + validate: listOfFunctions + }, + endpoints: { + defaultValue: (endpoints?: unknown) => { + // only apply the default value if no endpoints have been provided, otherwise prevent delivery by setting to null + if (typeof endpoints === 'undefined') { + return ({ + notify: 'https://notify.bugsnag.com', + sessions: 'https://sessions.bugsnag.com' + }) + } else { + return ({ notify: null, sessions: null }) + } + }, + message: 'should be an object containing endpoint URLs { notify, sessions }', + validate: (val: unknown) => + // first, ensure it's an object + !!(val && typeof val === 'object') && + ( + // notify and sessions must always be set + 'notify' in val && stringWithLength(val.notify) && 'sessions' in val && stringWithLength(val.sessions) + ) && + // ensure no keys other than notify/session are set on endpoints object + filter(keys(val), k => !includes(['notify', 'sessions'], k)).length === 0 + }, + autoTrackSessions: { + defaultValue: () => true, + message: 'should be true|false', + validate: (val: unknown) => val === true || val === false + }, + enabledReleaseStages: { + defaultValue: () => null, + message: 'should be an array of strings', + validate: (value: unknown) => value === null || (isArray(value) && filter(value, f => typeof f === 'string').length === value.length) + }, + releaseStage: { + defaultValue: () => 'production', + message: 'should be a string', + validate: (value: unknown) => typeof value === 'string' && !!value.length + }, + maxBreadcrumbs: { + defaultValue: () => 25, + message: 'should be a number ≤100', + validate: (value: unknown) => intRange(0, 100)(value) + }, + enabledBreadcrumbTypes: { + defaultValue: () => BREADCRUMB_TYPES, + message: `should be null or a list of available breadcrumb types (${BREADCRUMB_TYPES.join(',')})`, + validate: (value: unknown) => value === null || (isArray(value) && reduce(value, (accum, maybeType) => { + if (accum === false) return accum + // TS doesn't like passing a readonly to a function that might mutate an array + return includes(BREADCRUMB_TYPES as unknown as any[], maybeType) + }, true)) + }, + context: { + defaultValue: () => undefined, + message: 'should be a string', + validate: (value: unknown) => value === undefined || typeof value === 'string' + }, + user: { + defaultValue: () => ({}), + message: 'should be an object with { id, email, name } properties', + validate: (value: unknown) => + (value === null) || + (value && reduce( + keys(value), + (accum, key) => accum && includes(['id', 'email', 'name'], key), + true + )) + }, + metadata: { + defaultValue: () => ({}), + message: 'should be an object', + validate: (value: unknown) => typeof value === 'object' && value !== null + }, + logger: { + defaultValue: () => undefined, + message: 'should be null or an object with methods { debug, info, warn, error }', + validate: (value: unknown) => + (!value) || + (value && reduce( + ['debug', 'info', 'warn', 'error'], + // @ts-expect-error - TS doesn't know that value is an object + (accum, method) => accum && typeof value[method] === 'function', + true + )) + }, + redactedKeys: { + defaultValue: () => ['password'], + message: 'should be an array of strings|regexes', + validate: (value: unknown) => + isArray(value) && value.length === filter(value, s => + (typeof s === 'string' || (s && typeof s.test === 'function')) + ).length + }, + plugins: { + defaultValue: () => ([]), + message: 'should be an array of plugin objects', + validate: (value: unknown) => + isArray(value) && value.length === filter(value, p => + (p && typeof p === 'object' && typeof p.load === 'function') + ).length + }, + featureFlags: { + defaultValue: () => [], + message: 'should be an array of objects that have a "name" property', + validate: (value: unknown) => + isArray(value) && value.length === filter(value, feature => + feature && typeof feature === 'object' && typeof feature.name === 'string' + ).length + }, + reportUnhandledPromiseRejectionsAsHandled: { + defaultValue: () => false, + message: 'should be true|false', + validate: (value: unknown) => value === true || value === false + }, + sendPayloadChecksums: { + defaultValue: () => false, + message: 'should be true|false', + validate: (value: unknown) => value === true || value === false + } +} + +export default schema \ No newline at end of file diff --git a/packages/core/src/event.d.ts b/packages/core/src/event.d.ts deleted file mode 100644 index d5d7852aa..000000000 --- a/packages/core/src/event.d.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { App, Device, Event, Request, Breadcrumb, User, Session, FeatureFlag } from '../types' -import { Error } from '../types/event' - -interface HandledState { - unhandled: boolean - severity: string - severityReason: { type: string } -} - -interface FeatureFlagPayload { - featureFlag: string - variant?: string -} - -/** - * Extend the public type definitions with internal declarations. - * - * This is currently used by the unit tests. These will be rolled into the - * module itself once it is converted to TypeScript. - */ -export default class EventWithInternals extends Event { - constructor (errorClass: string, errorMessage: string, stacktrace: any[], handledState?: HandledState, originalError?: Error) - _metadata: { [key: string]: any } - _features: FeatureFlag | null[] - _featuresIndex: { [key: string]: number } - _user: User - _handledState: HandledState - _correlation?: { spanId: string, traceId: string } - _session?: Session - toJSON(): { - payloadVersion: '4' - exceptions: Array - severity: Event['severity'] - unhandled: boolean - severityReason: { - type: string - [key: string]: any - } - app: App - device: Device - request: Request - breadcrumbs: Breadcrumb[] - context: string | undefined - correlation: { spanId: string, traceId: string } | undefined - groupingHash: string | undefined - metaData: { [key: string]: any } - user: User - session: Session - featureFlags: FeatureFlagPayload[] - }; -} diff --git a/packages/core/src/event.js b/packages/core/src/event.ts similarity index 67% rename from packages/core/src/event.js rename to packages/core/src/event.ts index c093010be..66443cd24 100644 --- a/packages/core/src/event.js +++ b/packages/core/src/event.ts @@ -1,22 +1,63 @@ -const ErrorStackParser = require('./lib/error-stack-parser') -const StackGenerator = require('stack-generator') -const hasStack = require('./lib/has-stack') -const map = require('./lib/es-utils/map') -const reduce = require('./lib/es-utils/reduce') -const filter = require('./lib/es-utils/filter') -const assign = require('./lib/es-utils/assign') -const metadataDelegate = require('./lib/metadata-delegate') -const featureFlagDelegate = require('./lib/feature-flag-delegate') -const isError = require('./lib/iserror') - -class Event { - constructor (errorClass, errorMessage, stacktrace = [], handledState = defaultHandledState(), originalError) { +import { App, Device, FeatureFlag, Logger, Request, Stackframe, Thread, User } from "./common" + +import ErrorStackParser from './lib/error-stack-parser' +// @ts-expect-error no types +import StackGenerator from 'stack-generator' +import hasStack from './lib/has-stack' +import map from './lib/es-utils/map' +import reduce from './lib/es-utils/reduce' +import filter from './lib/es-utils/filter' +import assign from './lib/es-utils/assign' +import metadataDelegate from './lib/metadata-delegate' +import featureFlagDelegate from './lib/feature-flag-delegate' +import isError from './lib/iserror' +import Breadcrumb from "./breadcrumb" +import Session from "./session" + +interface HandledState { + unhandled: boolean + severity: string + severityReason: { type: string; unhandledOverridden?: boolean } +} + +export default class Event { + public apiKey: string | undefined + public context: string | undefined + private groupingHash: string | undefined + public severity: string + public unhandled: boolean + + public app: App + private device: Device + private request: Request + + public errors: Error[]; + public breadcrumbs: Breadcrumb[] + public threads: Thread[] + + public _metadata: { [key: string]: any } + public _features: FeatureFlag | null[] + public _featuresIndex: { [key: string]: number } + + public _user: User + private _correlation?: { spanId?: string, traceId: string } + public _session?: Session + + // default value for stacktrace.type + public static __type: string = 'browserjs' + + constructor ( + private readonly errorClass: string, + private readonly errorMessage: string, + private readonly stacktrace: any[] = [], + public readonly _handledState: HandledState = defaultHandledState(), + public readonly originalError?: Error + ) { this.apiKey = undefined this.context = undefined this.groupingHash = undefined this.originalError = originalError - this._handledState = handledState this.severity = this._handledState.severity this.unhandled = this._handledState.unhandled @@ -45,7 +86,7 @@ class Event { /* this.attemptImmediateDelivery, default: true */ } - addMetadata (section, keyOrObj, maybeVal) { + addMetadata (section: string, keyOrObj?: any, maybeVal?: any) { return metadataDelegate.add(this._metadata, section, keyOrObj, maybeVal) } @@ -56,25 +97,25 @@ class Event { * @param traceId the ID of the trace the event occurred within * @param spanId the ID of the span that the event occurred within */ - setTraceCorrelation (traceId, spanId) { + setTraceCorrelation (traceId?: string, spanId?: string) { if (typeof traceId === 'string') { this._correlation = { traceId, ...typeof spanId === 'string' ? { spanId } : { } } } } - getMetadata (section, key) { + getMetadata (section: string, key?: string) { return metadataDelegate.get(this._metadata, section, key) } - clearMetadata (section, key) { + clearMetadata (section: string, key?: string) { return metadataDelegate.clear(this._metadata, section, key) } - addFeatureFlag (name, variant = null) { + addFeatureFlag (name: string, variant: string | null = null) { featureFlagDelegate.add(this._features, this._featuresIndex, name, variant) } - addFeatureFlags (featureFlags) { + addFeatureFlags (featureFlags: FeatureFlag[]) { featureFlagDelegate.merge(this._features, featureFlags, this._featuresIndex) } @@ -82,7 +123,7 @@ class Event { return featureFlagDelegate.toEventApi(this._features) } - clearFeatureFlag (name) { + clearFeatureFlag (name: string) { featureFlagDelegate.clear(this._features, this._featuresIndex, name) } @@ -95,13 +136,14 @@ class Event { return this._user } - setUser (id, email, name) { + setUser (id?: string, email?: string, name?: string) { this._user = { id, email, name } } toJSON () { return { payloadVersion: '4', + // @ts-expect-error - TS doesn't know that the error object has an errorMessage property exceptions: map(this.errors, er => assign({}, er, { message: er.errorMessage })), severity: this.severity, unhandled: this._handledState.unhandled, @@ -119,11 +161,73 @@ class Event { correlation: this._correlation } } + + // Helpers +static getStacktrace = function (error: Error, errorFramesToSkip: number, backtraceFramesToSkip: number) { + if (hasStack(error)) return ErrorStackParser.parse(error).slice(errorFramesToSkip) + // error wasn't provided or didn't have a stacktrace so try to walk the callstack + try { + return filter(StackGenerator.backtrace(), (frame: StackTraceJsStyleStackframe) => + (frame.functionName || '').indexOf('StackGenerator$$') === -1 + ).slice(1 + backtraceFramesToSkip) + } catch (e) { + return [] + } +} + +static create = function (maybeError: Error, tolerateNonErrors: boolean, handledState: HandledState | undefined, component: string, errorFramesToSkip = 0, logger: Logger) { + const [error, internalFrames] = normaliseError(maybeError, tolerateNonErrors, component, logger) + let event + try { + const stacktrace = Event.getStacktrace( + error, + // if an error was created/throw in the normaliseError() function, we need to + // tell the getStacktrace() function to skip the number of frames we know will + // be from our own functions. This is added to the number of frames deep we + // were told about + internalFrames > 0 ? 1 + internalFrames + errorFramesToSkip : 0, + // if there's no stacktrace, the callstack may be walked to generated one. + // this is how many frames should be removed because they come from our library + 1 + errorFramesToSkip + ) + event = new Event(error.name, error.message, stacktrace, handledState, maybeError) + } catch (e) { + event = new Event(error.name, error.message, [], handledState, maybeError) + } + if (error.name === 'InvalidError') { + event.addMetadata(`${component}`, 'non-error parameter', makeSerialisable(maybeError)) + } + if (error.cause) { + const causes = getCauseStack(error).slice(1) + const normalisedCauses = map(causes, (cause) => { + // Only get stacktrace for error causes that are a valid JS Error and already have a stack + const stacktrace = (isError(cause) && hasStack(cause)) ? ErrorStackParser.parse(cause) : [] + const [error] = normaliseError(cause, true, 'error cause') + if (error.name === 'InvalidError') event.addMetadata('error cause', makeSerialisable(cause)) + return createBugsnagError(error.name, error.message, Event.__type, stacktrace) + }) + + event.errors.push(...normalisedCauses) + } + + return event +} +} + +interface StackTraceJsStyleStackframe { + functionName: string, + args: string[], + fileName: string, + lineNumber: number, + columnNumber: number, + isEval: boolean, + isNative: boolean, + source: string, } // takes a stacktrace.js style stackframe (https://github.com/stacktracejs/stackframe) // and returns a Bugsnag compatible stackframe (https://docs.bugsnag.com/api/error-reporting/#json-payload) -const formatStackframe = frame => { +const formatStackframe = (frame: StackTraceJsStyleStackframe) => { const f = { file: frame.fileName, method: normaliseFunctionName(frame.functionName), @@ -142,7 +246,7 @@ const formatStackframe = frame => { return f } -const normaliseFunctionName = name => /^global code$/i.test(name) ? 'global code' : name +const normaliseFunctionName = (name: string) => /^global code$/i.test(name) ? 'global code' : name const defaultHandledState = () => ({ unhandled: false, @@ -150,10 +254,11 @@ const defaultHandledState = () => ({ severityReason: { type: 'handledException' } }) -const ensureString = (str) => typeof str === 'string' ? str : '' +const ensureString = (str: unknown): string => typeof str === 'string' ? str : '' -function createBugsnagError (errorClass, errorMessage, type, stacktrace) { +function createBugsnagError (errorClass: unknown, errorMessage: unknown, type: string, stacktrace: any[]): Error { return { + // @ts-expect-error - TS doesn't know that the error object has an errorClass property errorClass: ensureString(errorClass), errorMessage: ensureString(errorMessage), type, @@ -170,77 +275,25 @@ function createBugsnagError (errorClass, errorMessage, type, stacktrace) { } } -function getCauseStack (error) { +function getCauseStack (error: Error): Error[] { if (error.cause) { - return [error, ...getCauseStack(error.cause)] + return [error, ...getCauseStack(error.cause as Error)] } else { return [error] } } -// Helpers - -Event.getStacktrace = function (error, errorFramesToSkip, backtraceFramesToSkip) { - if (hasStack(error)) return ErrorStackParser.parse(error).slice(errorFramesToSkip) - // error wasn't provided or didn't have a stacktrace so try to walk the callstack - try { - return filter(StackGenerator.backtrace(), frame => - (frame.functionName || '').indexOf('StackGenerator$$') === -1 - ).slice(1 + backtraceFramesToSkip) - } catch (e) { - return [] - } -} - -Event.create = function (maybeError, tolerateNonErrors, handledState, component, errorFramesToSkip = 0, logger) { - const [error, internalFrames] = normaliseError(maybeError, tolerateNonErrors, component, logger) - let event - try { - const stacktrace = Event.getStacktrace( - error, - // if an error was created/throw in the normaliseError() function, we need to - // tell the getStacktrace() function to skip the number of frames we know will - // be from our own functions. This is added to the number of frames deep we - // were told about - internalFrames > 0 ? 1 + internalFrames + errorFramesToSkip : 0, - // if there's no stacktrace, the callstack may be walked to generated one. - // this is how many frames should be removed because they come from our library - 1 + errorFramesToSkip - ) - event = new Event(error.name, error.message, stacktrace, handledState, maybeError) - } catch (e) { - event = new Event(error.name, error.message, [], handledState, maybeError) - } - if (error.name === 'InvalidError') { - event.addMetadata(`${component}`, 'non-error parameter', makeSerialisable(maybeError)) - } - if (error.cause) { - const causes = getCauseStack(error).slice(1) - const normalisedCauses = map(causes, (cause) => { - // Only get stacktrace for error causes that are a valid JS Error and already have a stack - const stacktrace = (isError(cause) && hasStack(cause)) ? ErrorStackParser.parse(cause) : [] - const [error] = normaliseError(cause, true, 'error cause') - if (error.name === 'InvalidError') event.addMetadata('error cause', makeSerialisable(cause)) - return createBugsnagError(error.name, error.message, Event.__type, stacktrace) - }) - - event.errors.push(...normalisedCauses) - } - - return event -} - -const makeSerialisable = (err) => { +const makeSerialisable = (err?: any) => { if (err === null) return 'null' if (err === undefined) return 'undefined' return err } -const normaliseError = (maybeError, tolerateNonErrors, component, logger) => { +const normaliseError = (maybeError: unknown, tolerateNonErrors: boolean, component: string, logger?: Logger): [Error, number] => { let error let internalFrames = 0 - const createAndLogInputError = (reason) => { + const createAndLogInputError = (reason: string) => { const verb = (component === 'error cause' ? 'was' : 'received') if (logger) logger.warn(`${component} ${verb} a non-error: "${reason}"`) const err = new Error(`${component} ${verb} a non-error. See "${component}" tab for more detail.`) @@ -280,7 +333,7 @@ const normaliseError = (maybeError, tolerateNonErrors, component, logger) => { error = maybeError } else if (maybeError !== null && hasNecessaryFields(maybeError)) { error = new Error(maybeError.message || maybeError.errorMessage) - error.name = maybeError.name || maybeError.errorClass + error.name = maybeError.name || maybeError.errorClass || '' internalFrames += 1 } else { error = createAndLogInputError(maybeError === null ? 'null' : 'unsupported object') @@ -308,14 +361,12 @@ const normaliseError = (maybeError, tolerateNonErrors, component, logger) => { } } - return [error, internalFrames] + return [error as Error, internalFrames] } -// default value for stacktrace.type -Event.__type = 'browserjs' - -const hasNecessaryFields = error => +const hasNecessaryFields = (error: unknown): error is { name?: string; errorClass?: string; message?: string; errorMessage?: string } => + // @ts-expect-error - needs rewriting to be more type safe (typeof error.name === 'string' || typeof error.errorClass === 'string') && + // @ts-expect-error - needs rewriting to be more type safe (typeof error.message === 'string' || typeof error.errorMessage === 'string') -module.exports = Event diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index d3bd525a6..ca5050c17 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -2,4 +2,4 @@ export { default as Breadcrumb } from './breadcrumb' export { default as Client } from './client' export { default as Event } from './event' export { default as Session } from './session' -export { schema } from './config' +export { default as schema } from './config' diff --git a/packages/core/src/lib/es-utils/is-array.d.ts b/packages/core/src/lib/es-utils/is-array.d.ts index c9bab14ce..2d1bc401c 100644 --- a/packages/core/src/lib/es-utils/is-array.d.ts +++ b/packages/core/src/lib/es-utils/is-array.d.ts @@ -1 +1 @@ -export default function isArray(obj: any): boolean +export default function isArray(obj: any): obj is any[]; diff --git a/packages/core/src/lib/es-utils/keys.d.ts b/packages/core/src/lib/es-utils/keys.d.ts index 803124daa..e47987c85 100644 --- a/packages/core/src/lib/es-utils/keys.d.ts +++ b/packages/core/src/lib/es-utils/keys.d.ts @@ -1 +1 @@ -export default function keys(obj: {}): string[] +export default function keys(obj: object): [] diff --git a/packages/core/src/session.d.ts b/packages/core/src/session.d.ts deleted file mode 100644 index ba319e74d..000000000 --- a/packages/core/src/session.d.ts +++ /dev/null @@ -1,24 +0,0 @@ -import Session from '../types/session' - -interface MinimalEvent { - _handledState: { - unhandled: boolean - } -} - -interface SessionJson { - id: string - startedAt: Date - events: { - handled: number - unhandled: number - } -} - -export default class SessionWithInternals extends Session { - _track(event: MinimalEvent): void - toJSON(): SessionJson - - public _handled: number - public _unhandled: number -} diff --git a/packages/core/src/session.js b/packages/core/src/session.js deleted file mode 100644 index f078d76a5..000000000 --- a/packages/core/src/session.js +++ /dev/null @@ -1,35 +0,0 @@ -const cuid = require('@bugsnag/cuid') - -class Session { - constructor () { - this.id = cuid() - this.startedAt = new Date() - this._handled = 0 - this._unhandled = 0 - this._user = {} - this.app = {} - this.device = {} - } - - getUser () { - return this._user - } - - setUser (id, email, name) { - this._user = { id, email, name } - } - - toJSON () { - return { - id: this.id, - startedAt: this.startedAt, - events: { handled: this._handled, unhandled: this._unhandled } - } - } - - _track (event) { - this[event._handledState.unhandled ? '_unhandled' : '_handled'] += 1 - } -} - -module.exports = Session diff --git a/packages/core/src/session.ts b/packages/core/src/session.ts new file mode 100644 index 000000000..7010efa71 --- /dev/null +++ b/packages/core/src/session.ts @@ -0,0 +1,40 @@ +import cuid from '@bugsnag/cuid' +import { App, Device, User } from './common' + +interface MinimalEvent { + _handledState: { + unhandled: boolean + } +} + +export default class Session { + constructor ( + private readonly id: string = cuid(), + private readonly startedAt: Date = new Date(), + public _handled = 0, + public _unhandled = 0, + public _user: User = {}, + public app: App = {}, + private readonly device: Device = {} + ) { } + + getUser () { + return this._user + } + + setUser (id?: string, email?: string, name?: string) { + this._user = { id, email, name } + } + + toJSON () { + return { + id: this.id, + startedAt: this.startedAt, + events: { handled: this._handled, unhandled: this._unhandled } + } + } + + _track (event: MinimalEvent) { + this[event._handledState.unhandled ? '_unhandled' : '_handled'] += 1 + } +} diff --git a/packages/core/test/client.test.ts b/packages/core/test/client.test.ts index 7ea3466ee..7c3818668 100644 --- a/packages/core/test/client.test.ts +++ b/packages/core/test/client.test.ts @@ -270,6 +270,7 @@ describe('Client', () => { }) client._setDelivery(client => ({ sendEvent: (payload) => { + // @ts-expect-error Property 'errorMessage' does not exist on type 'Error' expect(payload.events[0].errors[0].errorMessage).toBe('oh no!') expect(onErrorSpy).toHaveBeenCalledTimes(1) done() @@ -351,6 +352,7 @@ describe('Client', () => { client.notify({ name: 'some message' }) // @ts-ignore client.notify(1) + // @ts-ignore client.notify('errrororor') // @ts-ignore client.notify('str1', 'str2') @@ -437,6 +439,7 @@ describe('Client', () => { client.notify(new Error('111'), () => {}, (err, event) => { expect(err).toBe(null) expect(event).toBeTruthy() + // @ts-expect-error Property 'errorMessage' does not exist on type 'Error' expect(event.errors[0].errorMessage).toBe('111') expect((event as Event)._session).toBe(session) @@ -458,8 +461,9 @@ describe('Client', () => { client.notify(new Error('111'), () => {}, (err, event) => { expect(err).toBeTruthy() - expect(err.message).toBe('flerp') + expect(err?.message).toBe('flerp') expect(event).toBeTruthy() + // @ts-expect-error Property 'errorMessage' does not exist on type 'Error' expect(event.errors[0].errorMessage).toBe('111') expect((event as Event)._session).toBe(session) @@ -483,6 +487,7 @@ describe('Client', () => { client.notify(new Error('111'), () => {}, (err, event) => { expect(err).toBe(null) expect(event).toBeTruthy() + // @ts-expect-error Property 'errorMessage' does not exist on type 'Error' expect(event.errors[0].errorMessage).toBe('111') expect((event as Event)._session).toBe(undefined) done() @@ -504,6 +509,7 @@ describe('Client', () => { client.notify(new Error('111'), () => {}, (err, event) => { expect(err).toBe(null) expect(event).toBeTruthy() + // @ts-expect-error Property 'errorMessage' does not exist on type 'Error' expect(event.errors[0].errorMessage).toBe('111') expect((event as Event)._session).toBe(undefined) done() @@ -705,7 +711,8 @@ describe('Client', () => { done() } })) - const sessionClient = client.startSession() + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + const sessionClient = client.startSession()! sessionClient.notify(new Error('broke')) sessionClient._notify(new Event('err', 'bad', [], { unhandled: true, severity: 'error', severityReason: { type: 'unhandledException' } })) sessionClient.notify(new Error('broke')) diff --git a/packages/core/test/config.test.ts b/packages/core/test/config.test.ts index e77bda05d..d4fd612db 100644 --- a/packages/core/test/config.test.ts +++ b/packages/core/test/config.test.ts @@ -1,26 +1,26 @@ -import config from '../src/config' +import schema from '../src/config' describe('config', () => { describe('schema', () => { it('has the required properties { validate(), defaultValue(), message }', () => { - Object.keys(config.schema).forEach(k => { - const key = k as unknown as keyof typeof config.schema - config.schema[key].defaultValue(undefined) + Object.keys(schema).forEach(k => { + const key = k as unknown as keyof typeof schema + schema[key].defaultValue(undefined) // @ts-expect-error testing invalid arguments - config.schema[key].validate() - config.schema[key].validate(-1) - config.schema[key].validate('stringy stringerson') - config.schema[key].validate(['foo', 'bar', 'baz']) - config.schema[key].validate(new Date()) - config.schema[key].validate(null) - expect(typeof config.schema[key].message).toBe('string') + schema[key].validate() + schema[key].validate(-1) + schema[key].validate('stringy stringerson') + schema[key].validate(['foo', 'bar', 'baz']) + schema[key].validate(new Date()) + schema[key].validate(null) + expect(typeof schema[key].message).toBe('string') }) }) }) describe('user', () => { it('should only allow id, name and email', () => { - const userValidator = config.schema.user.validate + const userValidator = schema.user.validate expect(userValidator(null)).toBe(true) expect(userValidator({ id: '123', email: 'bug@sn.ag', name: 'Bugsnag' })).toBe(true) expect(userValidator({ id: '123', email: 'bug@sn.ag', name: 'Bugsnag', extra: 'aaa' })).toBe(false) @@ -31,24 +31,24 @@ describe('config', () => { describe('enabledBreadcrumbTypes', () => { it('fails when a supplied value is not a valid breadcrumb type', () => { - const enabledBreadcrumbTypesValidator = config.schema.enabledBreadcrumbTypes.validate + const enabledBreadcrumbTypesValidator = schema.enabledBreadcrumbTypes.validate expect(enabledBreadcrumbTypesValidator(['UNKNOWN_BREADCRUMB_TYPE'])).toBe(false) }) }) describe('enabledErrorTypes', () => { it('is ok with an empty object', () => { - const enabledErrorTypesValidator = config.schema.enabledErrorTypes.validate + const enabledErrorTypesValidator = schema.enabledErrorTypes.validate expect(enabledErrorTypesValidator({})).toBe(true) }) it('works with a subset of error types', () => { - const enabledErrorTypesValidator = config.schema.enabledErrorTypes.validate + const enabledErrorTypesValidator = schema.enabledErrorTypes.validate expect(enabledErrorTypesValidator({ unhandledExceptions: true })).toBe(true) }) it('fails when an additional unsupported type is provided', () => { - const enabledErrorTypesValidator = config.schema.enabledErrorTypes.validate + const enabledErrorTypesValidator = schema.enabledErrorTypes.validate expect(enabledErrorTypesValidator({ unhandledExceptions: true, unhandledRejections: false, @@ -66,19 +66,19 @@ describe('config', () => { { name: 'example' }, { length: 1000 } ])('fails when the supplied value is not an array (%p)', value => { - const validator = config.schema.featureFlags.validate + const validator = schema.featureFlags.validate expect(validator(value)).toBe(false) }) it('fails when a value does not have a "name"', () => { - const validator = config.schema.featureFlags.validate + const validator = schema.featureFlags.validate expect(validator([{ name: 'hello' }, { notName: 'oops' }])).toBe(false) }) it('passes when all values have a "name"', () => { - const validator = config.schema.featureFlags.validate + const validator = schema.featureFlags.validate const featureFlags = [ { name: 'hello' }, { name: 'abc', variant: 'xyz' }, diff --git a/packages/core/test/event.test.ts b/packages/core/test/event.test.ts index dd3863ed6..b16449d3d 100644 --- a/packages/core/test/event.test.ts +++ b/packages/core/test/event.test.ts @@ -21,6 +21,7 @@ describe('Event', () => { { foo: 10 }, { toJSON: () => { throw new Error('do not serialise me, srsly') } } ]) + // @ts-expect-error Property 'stacktrace' does not exist on type 'Error' expect(r.errors[0].stacktrace.length).toBe(0) }) }) diff --git a/packages/core/tsconfig.json b/packages/core/tsconfig.json index 3f195727e..b52e5a2c7 100644 --- a/packages/core/tsconfig.json +++ b/packages/core/tsconfig.json @@ -1,12 +1,13 @@ { - "extends": "../../tsconfig.json", "compilerOptions": { + "esModuleInterop": true, "lib": [ "dom", "es2022" ], + "strict": true, "allowJs": true, "outDir": "dist", - "removeComments": true, - "noEmitOnError": true, - "target": "es5", + "declaration": true, + "emitDeclarationOnly": true, + "declarationDir": "dist/types", }, "include": ["src/**/*.ts", "src/**/*.js"] } diff --git a/packages/core/types/common.d.ts b/packages/core/types/common.d.ts index 4fd333d23..d19344fdc 100644 --- a/packages/core/types/common.d.ts +++ b/packages/core/types/common.d.ts @@ -36,10 +36,17 @@ export type OnErrorCallback = (event: Event, cb: (err: null | Error, shouldSend? export type OnSessionCallback = (session: Session) => void | boolean; export type OnBreadcrumbCallback = (breadcrumb: Breadcrumb) => void | boolean; -export interface Plugin { +export interface Plugin { name?: string - load: (client: Client) => any + load: (client: Client) => any destroy?(): void + configSchema?: { + [key: string]: { + defaultValue: () => unknown + message: string + validate: (value: unknown) => boolean + } + } } export interface Logger { @@ -49,8 +56,10 @@ export interface Logger { error: (...args: any[]) => void } -export interface SessionDelegate { - startSession: (client: Client) => Client +export interface SessionDelegate { + startSession: (client: Client, session: Session) => Client + pauseSession: (client: Client) => void + resumeSession: (client: Client) => Client } export interface EventPayload { diff --git a/packages/electron-test-helpers/src/client.ts b/packages/electron-test-helpers/src/client.ts index 714ae10d2..91ef599da 100644 --- a/packages/electron-test-helpers/src/client.ts +++ b/packages/electron-test-helpers/src/client.ts @@ -1,4 +1,4 @@ -import { Client, schema as defaultSchema, Event, Session, SessionPayload, EventPayload, Plugin } from '@bugsnag/core' +import { Client, schema as defaultSchema, Event, Session, SessionPayload, EventPayload, Plugin, SessionDelegate } from '@bugsnag/core' interface ClientTestHelpers { client: Client @@ -34,7 +34,7 @@ export function makeClientForPlugin ({ } })) - client._sessionDelegate = { + client._sessionDelegate = ({ startSession (client: Client, session: Session) { client._delivery.sendSession(session, () => {}) }, @@ -42,7 +42,7 @@ export function makeClientForPlugin ({ }, pauseSession () { } - } + } as unknown as SessionDelegate) const sendEvent = async () => new Promise((resolve, reject) => { // @ts-expect-error - we don't have Client internals to correctly type this diff --git a/packages/node/src/bugsnag.ts b/packages/node/src/bugsnag.ts index b418cb15e..c067b5f0c 100644 --- a/packages/node/src/bugsnag.ts +++ b/packages/node/src/bugsnag.ts @@ -72,6 +72,8 @@ type NodeClient = Partial & { type Method = keyof typeof Client.prototype +const clientMethods = Object.getOwnPropertyNames(Client.prototype) as Method[] + const notifier: NodeClient = { _client: null, createClient: (opts) => { @@ -87,7 +89,7 @@ const notifier: NodeClient = { * This is useful for when client methods are called later, such as in the console breadcrumbs * plugin where we want to call `leaveBreadcrumb` on the request-scoped client, if it exists. */ - (Object.keys(Client.prototype) as Method[]).forEach((m) => { + clientMethods.forEach((m) => { const original = bugsnag[m] bugsnag[m] = function () { // if we are in an async context, use the client from that context @@ -126,7 +128,7 @@ const notifier: NodeClient = { } } -;(Object.keys(Client.prototype) as Method[]).forEach((m) => { +clientMethods.forEach((m) => { if (/^_/.test(m)) return notifier[m] = function () { // if we are in an async context, use the client from that context diff --git a/packages/node/test/notifier.test.ts b/packages/node/test/notifier.test.ts index c7251c42b..9ba99f6ee 100644 --- a/packages/node/test/notifier.test.ts +++ b/packages/node/test/notifier.test.ts @@ -28,6 +28,8 @@ describe('node notifier', () => { Bugsnag.leaveBreadcrumb('test') expect(spy).toHaveBeenCalledWith('Bugsnag.leaveBreadcrumb() was called before Bugsnag.start()') + + spy.mockRestore() }) }) diff --git a/packages/plugin-browser-device/src/device.ts b/packages/plugin-browser-device/src/device.ts index 213bf3fd5..4eb3f5de4 100644 --- a/packages/plugin-browser-device/src/device.ts +++ b/packages/plugin-browser-device/src/device.ts @@ -1,4 +1,4 @@ -import type { Device, Plugin } from '@bugsnag/core' +import type { Config, Device, Plugin } from '@bugsnag/core' import assign from '@bugsnag/core/lib/es-utils/assign' import setDefaultUserId from './set-default-user-id' import getDeviceId from './get-device-id' @@ -12,10 +12,15 @@ declare global { } } +interface PluginConfig extends Config { + generateAnonymousId?: boolean + collectUserIp?: boolean +} + /* * Automatically detects browser device details */ -export default (nav = navigator, win: Window | null = window): Plugin => ({ +export default (nav = navigator, win: Window | null = window): Plugin => ({ name: 'device', load: (client) => { const device: Device = { @@ -32,7 +37,6 @@ export default (nav = navigator, win: Window | null = window): Plugin => ({ : 'portrait' } - // @ts-expect-error _config is private API if (client._config.generateAnonymousId && win) { device.id = getDeviceId(win) } @@ -40,7 +44,6 @@ export default (nav = navigator, win: Window | null = window): Plugin => ({ client.addOnSession(session => { session.device = assign({}, session.device, device) // only set device id if collectUserIp is false - // @ts-expect-error _config is private API if (!client._config.collectUserIp) setDefaultUserId(session) }) @@ -51,11 +54,9 @@ export default (nav = navigator, win: Window | null = window): Plugin => ({ device, { time: new Date() } ) - // @ts-expect-error _config is private API if (!client._config.collectUserIp) setDefaultUserId(event) }, true) }, - // @ts-expect-error _config is private API configSchema: { generateAnonymousId: { validate: (value: unknown): value is boolean => value === true || value === false,