diff --git a/bin/local-test-util b/bin/local-test-util index 9b2cfc91bc..7c35964a85 100755 --- a/bin/local-test-util +++ b/bin/local-test-util @@ -121,7 +121,7 @@ async function buildNotifiers (notifier) { async function packNotifiers (notifier) { const notifiers = notifier ? [ notifier ] - : [ 'js', 'browser', 'node', 'web-worker', 'plugin-angular', 'plugin-react', 'plugin-vue' ] + : [ 'core', 'js', 'browser', 'node', 'web-worker', 'plugin-angular', 'plugin-react', 'plugin-vue' ] for (const n of notifiers) { let packageLocation = `packages/${n}/` if (n === 'plugin-angular') packageLocation += 'dist/' @@ -138,9 +138,11 @@ async function installNotifiers (notifier) { `--no-save`, ].concat(notifier ? [ + `../../../../bugsnag-core-${require(`../packages/core/package.json`).version}.tgz`, `../../../../bugsnag-${notifier}-${require(`../packages/${notifier}/package.json`).version}.tgz` ] : [ + `../../../../bugsnag-core-${require('../packages/core/package.json').version}.tgz`, `../../../../bugsnag-browser-${require('../packages/browser/package.json').version}.tgz`, `../../../../bugsnag-web-worker-${require('../packages/web-worker/package.json').version}.tgz`, `../../../../bugsnag-plugin-react-${require('../packages/plugin-react/package.json').version}.tgz`, @@ -158,6 +160,7 @@ async function installNgNotifier (notifier, version = '12') { `install`, `--no-package-lock`, `--no-save`, + `../../../../../../bugsnag-core-${require('../packages/core/package.json').version}.tgz`, `../../../../../../bugsnag-browser-${require('../packages/browser/package.json').version}.tgz`, `../../../../../../bugsnag-js-${require('../packages/js/package.json').version}.tgz`, `../../../../../../bugsnag-node-${require('../packages/node/package.json').version}.tgz`, diff --git a/config/electron-jest.config.js b/config/electron-jest.config.js index 32c67a9cc7..99a4a1cb69 100644 --- a/config/electron-jest.config.js +++ b/config/electron-jest.config.js @@ -1,6 +1,7 @@ module.exports = { projects: [ { + resolver: '/jest/node-exports-resolver', setupFilesAfterEnv: ['/test/electron/setup.ts'], clearMocks: true, modulePathIgnorePatterns: ['.verdaccio', 'fixtures', 'examples'], @@ -9,6 +10,7 @@ module.exports = { testMatch: ['**/test/**/*.test-main.ts'] }, { + resolver: '/jest/node-exports-resolver', setupFilesAfterEnv: ['/test/electron/setup.ts'], clearMocks: true, modulePathIgnorePatterns: ['.verdaccio', 'fixtures', 'examples'], diff --git a/jest.config.js b/jest.config.js index 472b782d71..5841dd404f 100644 --- a/jest.config.js +++ b/jest.config.js @@ -1,6 +1,7 @@ const testsForPackage = (packageName) => `/packages/${packageName}/**/*.test.[jt]s?(x)` const project = (displayName, packageNames, config = {}) => ({ + resolver: '/jest/node-exports-resolver', roots: ['/packages'], displayName, testMatch: packageNames.map(testsForPackage), diff --git a/jest/node-exports-resolver.js b/jest/node-exports-resolver.js new file mode 100644 index 0000000000..e9c57889b4 --- /dev/null +++ b/jest/node-exports-resolver.js @@ -0,0 +1,183 @@ +const fs = require('fs') +const path = require('path') +const packageUp = require('pkg-up') + +const defaultConditions = ['require', 'node', 'default'] + +function findMainPackageJson (entryPath, packageName) { + entryPath = entryPath.replace(/\//g, path.sep) + + let directoryName = path.dirname(entryPath) + + let suspect = packageUp.sync({ cwd: directoryName }) + if (fs.existsSync(suspect)) { + return JSON.parse(fs.readFileSync(suspect).toString()) + } + + while (directoryName && !directoryName.endsWith(packageName)) { + const parentDirectoryName = path.resolve(directoryName, '..') + + if (parentDirectoryName === directoryName) break + + directoryName = parentDirectoryName + } + + suspect = path.resolve(directoryName, 'package.json') + if (fs.existsSync(suspect)) { + return JSON.parse(fs.readFileSync(suspect).toString()) + } + + return null +} + +function getSelfReferencePath (packageName) { + let parentDirectoryName = __dirname + let directoryName + + while (directoryName !== parentDirectoryName) { + directoryName = parentDirectoryName + + try { + const { name } = require(path.resolve(directoryName, 'package.json')) + + if (name === packageName) return directoryName + } catch {} + + parentDirectoryName = path.resolve(directoryName, '..') + } +} + +function getPackageJson (packageName) { + // Require `package.json` from the package, both from exported `exports` field + // in ESM packages, or directly from the file itself in CommonJS packages. + try { + return require(`${packageName}/package.json`) + } catch (requireError) { + if (requireError.code === 'MODULE_NOT_FOUND') { + throw requireError + } + if (requireError.code !== 'ERR_PACKAGE_PATH_NOT_EXPORTED') { + return console.error( + `Unexpected error while requiring ${packageName}:`, requireError + ) + } + } + + // modules's `package.json` does not provide the "./package.json" path at it's + // "exports" field. Get package level export or main field and try to resolve + // the package.json from it. + try { + const requestPath = require.resolve(packageName) + + return requestPath && findMainPackageJson(requestPath, packageName) + } catch (resolveError) { + if (resolveError.code !== 'ERR_PACKAGE_PATH_NOT_EXPORTED') { + console.log( + `Unexpected error while performing require.resolve(${packageName}):` + ) + + return console.error(resolveError) + } + } + + // modules's `package.json` does not provide a package level export nor main + // field. Try to find the package manually from `node_modules` folder. + const suspect = path.resolve(__dirname, '..', packageName, 'package.json') + if (fs.existsSync(suspect)) { + return JSON.parse(fs.readFileSync(suspect).toString()) + } + + console.warn( + 'Could not retrieve package.json neither through require (package.json ' + + 'itself is not within "exports" field), nor through require.resolve ' + + '(package.json does not specify "main" field) - falling back to default ' + + 'resolver logic' + ) +} + +module.exports = (request, options) => { + const { conditions = defaultConditions, defaultResolver } = options + + // NOTE: jest-sequencer is a special prefixed jest request + const isNodeModuleRequest = + !( + request.startsWith('.') || + path.isAbsolute(request) || + request.startsWith('jest-sequencer') + ) + + if (isNodeModuleRequest) { + const pkgPathParts = request.split('/') + const { length } = pkgPathParts + + let packageName + let submoduleName + + if (!request.startsWith('@')) { + packageName = pkgPathParts.shift() + submoduleName = length > 1 ? `./${pkgPathParts.join('/')}` : '.' + } else if (length >= 2) { + packageName = `${pkgPathParts.shift()}/${pkgPathParts.shift()}` + submoduleName = length > 2 ? `./${pkgPathParts.join('/')}` : '.' + } + + if (packageName && submoduleName !== '.') { + const selfReferencePath = getSelfReferencePath(packageName) + if (selfReferencePath) packageName = selfReferencePath + + const packageJson = getPackageJson(packageName) + + if (!packageJson) { + console.error(`Failed to find package.json for ${packageName}`) + } + + const { exports } = packageJson || {} + if (exports) { + let targetFilePath + + if (typeof exports === 'string') { targetFilePath = exports } else if (Object.keys(exports).every((k) => k.startsWith('.'))) { + const [exportKey, exportValue] = Object.entries(exports) + .find(([k]) => { + if (k === submoduleName) return true + if (k.endsWith('*')) return submoduleName.startsWith(k.slice(0, -1)) + + return false + }) || [] + + if (typeof exportValue === 'string') { + targetFilePath = exportKey.endsWith('*') + ? exportValue.replace( + /\*/, submoduleName.slice(exportKey.length - 1) + ) + : exportValue + } else if ( + conditions && exportValue != null && typeof exportValue === 'object' + ) { + function resolveExport (exportValue, prevKeys) { + for (const [key, value] of Object.entries(exportValue)) { + // Duplicated nested conditions are undefined behaviour (and + // probably a format error or spec loop-hole), abort and + // delegate to Jest default resolver + if (prevKeys.includes(key)) return + + if (!conditions.includes(key)) continue + + if (typeof value === 'string') return value + + return resolveExport(value, prevKeys.concat(key)) + } + } + + targetFilePath = resolveExport(exportValue, []) + } + } + + if (targetFilePath) { + request = targetFilePath.replace('./', `${packageName}/`) + } + } + } + } + + return defaultResolver(request, options) +} diff --git a/package-lock.json b/package-lock.json index e1a5594b16..0950e718e9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -34,7 +34,6 @@ "@rollup/plugin-replace": "^6.0.1", "@rollup/plugin-typescript": "^12.1.0", "@types/jest": "^26.0.14", - "@types/node": "^18", "@typescript-eslint/eslint-plugin": "^8.22.0", "@typescript-eslint/parser": "^8.22.0", "aws-sdk": "^2.1303.0", @@ -54,6 +53,7 @@ "lerna": "^8.1.8", "metro-react-native-babel-preset": "^0.58.0", "ncp": "^2.0.0", + "pkg-up": "3.1.0", "playwright": "^1.10.0", "ps-list": "^7.2.0", "rimraf": "^3.0.0", @@ -38484,6 +38484,85 @@ "node": ">=8" } }, + "node_modules/pkg-up": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", + "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-up/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-up/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-up/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-up/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-up/node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/pkginfo": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.4.1.tgz", @@ -45602,6 +45681,49 @@ "error-stack-parser": "^2.0.3", "iserror": "^0.0.2", "stack-generator": "^2.0.3" + }, + "devDependencies": { + "@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", + "@types/jest": "^26", + "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==", + "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/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/delivery-electron": { @@ -54828,9 +54950,36 @@ "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", + "@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==", + "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/cuid": { @@ -61096,7 +61245,7 @@ "dev": true, "requires": { "@jest/types": "^26.6.2", - "@types/node": "*", + "@types/node": "^18", "chalk": "^4.0.0", "jest-message-util": "^26.6.2", "jest-util": "^26.6.2", @@ -61111,7 +61260,7 @@ "requires": { "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", + "@types/node": "^18", "@types/yargs": "17.0.10", "chalk": "^4.0.0" } @@ -61292,7 +61441,7 @@ "@jest/test-result": "^26.6.2", "@jest/transform": "^26.6.2", "@jest/types": "^26.6.2", - "@types/node": "*", + "@types/node": "^18", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", "exit": "^0.1.2", @@ -61336,7 +61485,7 @@ "requires": { "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", + "@types/node": "^18", "@types/yargs": "17.0.10", "chalk": "^4.0.0" } @@ -61464,7 +61613,7 @@ "requires": { "@jest/types": "^26.6.2", "@types/graceful-fs": "^4.1.2", - "@types/node": "*", + "@types/node": "^18", "anymatch": "^3.0.3", "fb-watchman": "^2.0.0", "fsevents": "^2.1.2", @@ -61515,7 +61664,7 @@ "@jest/environment": "^26.6.2", "@jest/test-result": "^26.6.2", "@jest/types": "^26.6.2", - "@types/node": "*", + "@types/node": "^18", "chalk": "^4.0.0", "emittery": "^0.7.1", "exit": "^0.1.2", @@ -61574,7 +61723,7 @@ "integrity": "sha512-S5wqyz0DXnNJPd/xfIzZ5Xnp1HrJWBczg8mMfMpN78OJ5eDxXyf+Ygld9wX1DnUWbIbhM1YDY95NjR4CBXkb2g==", "dev": true, "requires": { - "@types/node": "*", + "@types/node": "^18", "graceful-fs": "^4.2.4" } }, @@ -61734,7 +61883,7 @@ "requires": { "@jest/fake-timers": "^26.6.2", "@jest/types": "^26.6.2", - "@types/node": "*", + "@types/node": "^18", "jest-mock": "^26.6.2" }, "dependencies": { @@ -61746,7 +61895,7 @@ "requires": { "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", + "@types/node": "^18", "@types/yargs": "17.0.10", "chalk": "^4.0.0" } @@ -61859,7 +62008,7 @@ "@jest/schemas": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", + "@types/node": "^18", "@types/yargs": "17.0.10", "chalk": "^4.0.0" } @@ -62067,7 +62216,7 @@ "requires": { "@jest/types": "^29.6.3", "@types/graceful-fs": "^4.1.3", - "@types/node": "*", + "@types/node": "^18", "anymatch": "^3.0.3", "fb-watchman": "^2.0.0", "fsevents": "^2.3.2", @@ -62159,7 +62308,7 @@ "peer": true, "requires": { "@jest/types": "^29.6.3", - "@types/node": "*", + "@types/node": "^18", "chalk": "^4.0.0", "ci-info": "^3.2.0", "graceful-fs": "^4.2.9", @@ -62174,7 +62323,7 @@ "optional": true, "peer": true, "requires": { - "@types/node": "*", + "@types/node": "^18", "jest-util": "^29.7.0", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" @@ -62328,7 +62477,7 @@ "requires": { "@jest/types": "^26.6.2", "@sinonjs/fake-timers": "^6.0.1", - "@types/node": "*", + "@types/node": "^18", "jest-message-util": "^26.6.2", "jest-mock": "^26.6.2", "jest-util": "^26.6.2" @@ -62342,7 +62491,7 @@ "requires": { "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", + "@types/node": "^18", "@types/yargs": "17.0.10", "chalk": "^4.0.0" } @@ -62782,7 +62931,7 @@ "requires": { "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", + "@types/node": "^18", "@types/yargs": "17.0.10", "chalk": "^4.0.0" } @@ -62868,7 +63017,7 @@ "requires": { "@jest/types": "^26.6.2", "@types/graceful-fs": "^4.1.2", - "@types/node": "*", + "@types/node": "^18", "anymatch": "^3.0.3", "fb-watchman": "^2.0.0", "fsevents": "^2.1.2", @@ -62888,7 +63037,7 @@ "integrity": "sha512-S5wqyz0DXnNJPd/xfIzZ5Xnp1HrJWBczg8mMfMpN78OJ5eDxXyf+Ygld9wX1DnUWbIbhM1YDY95NjR4CBXkb2g==", "dev": true, "requires": { - "@types/node": "*", + "@types/node": "^18", "graceful-fs": "^4.2.4" } }, @@ -62982,7 +63131,7 @@ "requires": { "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", + "@types/node": "^18", "@types/yargs": "17.0.10", "chalk": "^4.0.0" } @@ -63079,7 +63228,7 @@ "requires": { "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", + "@types/node": "^18", "@types/yargs": "17.0.10", "chalk": "^4.0.0" } @@ -63207,7 +63356,7 @@ "requires": { "@jest/types": "^26.6.2", "@types/graceful-fs": "^4.1.2", - "@types/node": "*", + "@types/node": "^18", "anymatch": "^3.0.3", "fb-watchman": "^2.0.0", "fsevents": "^2.1.2", @@ -63258,7 +63407,7 @@ "@jest/environment": "^26.6.2", "@jest/test-result": "^26.6.2", "@jest/types": "^26.6.2", - "@types/node": "*", + "@types/node": "^18", "chalk": "^4.0.0", "emittery": "^0.7.1", "exit": "^0.1.2", @@ -63317,7 +63466,7 @@ "integrity": "sha512-S5wqyz0DXnNJPd/xfIzZ5Xnp1HrJWBczg8mMfMpN78OJ5eDxXyf+Ygld9wX1DnUWbIbhM1YDY95NjR4CBXkb2g==", "dev": true, "requires": { - "@types/node": "*", + "@types/node": "^18", "graceful-fs": "^4.2.4" } }, @@ -63500,7 +63649,7 @@ "requires": { "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", + "@types/node": "^18", "@types/yargs": "17.0.10", "chalk": "^4.0.0" } @@ -63586,7 +63735,7 @@ "requires": { "@jest/types": "^26.6.2", "@types/graceful-fs": "^4.1.2", - "@types/node": "*", + "@types/node": "^18", "anymatch": "^3.0.3", "fb-watchman": "^2.0.0", "fsevents": "^2.1.2", @@ -63606,7 +63755,7 @@ "integrity": "sha512-S5wqyz0DXnNJPd/xfIzZ5Xnp1HrJWBczg8mMfMpN78OJ5eDxXyf+Ygld9wX1DnUWbIbhM1YDY95NjR4CBXkb2g==", "dev": true, "requires": { - "@types/node": "*", + "@types/node": "^18", "graceful-fs": "^4.2.4" } }, @@ -66736,7 +66885,7 @@ "integrity": "sha512-Pay9fq2lM2wXPWbteBsRAGiWH2hig4ZE2asK+mm7kUzlxRTfL961rj89I6zV/E3PcIkDqyuBEcMxFT7rccugeQ==", "dev": true, "requires": { - "@types/node": "*" + "@types/node": "^18" } }, "@types/aws-lambda": { @@ -66792,7 +66941,7 @@ "integrity": "sha512-y59PRZBTo2/HuN94qRjyJD+465vGoXMsqz9MMJDbtJL9oT5/B+tAL6c3k10epIinC2/BBkLqKzKC6keukl8wdQ==", "dev": true, "requires": { - "@types/node": "*" + "@types/node": "^18" } }, "@types/body-parser": { @@ -66802,7 +66951,7 @@ "dev": true, "requires": { "@types/connect": "*", - "@types/node": "*" + "@types/node": "^18" } }, "@types/bonjour": { @@ -66811,7 +66960,7 @@ "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==", "dev": true, "requires": { - "@types/node": "*" + "@types/node": "^18" } }, "@types/bunyan": { @@ -66820,7 +66969,7 @@ "integrity": "sha512-758fRH7umIMk5qt5ELmRMff4mLDlN+xyYzC+dkPTdKwbSkJFvz6xwyScrytPU0QIBbRRwbiE8/BIg8bpajerNQ==", "dev": true, "requires": { - "@types/node": "*" + "@types/node": "^18" } }, "@types/cacheable-request": { @@ -66831,7 +66980,7 @@ "requires": { "@types/http-cache-semantics": "*", "@types/keyv": "^3.1.4", - "@types/node": "*", + "@types/node": "^18", "@types/responselike": "^1.0.0" } }, @@ -66859,7 +67008,7 @@ "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", "dev": true, "requires": { - "@types/node": "*" + "@types/node": "^18" } }, "@types/connect-history-api-fallback": { @@ -66869,7 +67018,7 @@ "dev": true, "requires": { "@types/express-serve-static-core": "4.17.28", - "@types/node": "*" + "@types/node": "^18" } }, "@types/content-disposition": { @@ -66887,7 +67036,7 @@ "@types/connect": "*", "@types/express": "*", "@types/keygrip": "*", - "@types/node": "*" + "@types/node": "^18" } }, "@types/eslint": { @@ -66934,7 +67083,7 @@ "integrity": "sha512-P1BJAEAW3E2DJUlkgq4tOL3RyMunoWXqbSCygWo5ZIWTjUgN1YnaXWW4VWl/oc8vs/XoYibEGBKP0uZyF4AHig==", "dev": true, "requires": { - "@types/node": "*", + "@types/node": "^18", "@types/qs": "*", "@types/range-parser": "*" } @@ -66945,7 +67094,7 @@ "integrity": "sha512-6psvrUy5VDYb+yaPJReF1WrRsz+FBwyJutK9Twz1Efa27tm07bARNIkK2B8ZPWq80dXqpKfrxTO96xrtPp+AuA==", "dev": true, "requires": { - "@types/node": "*" + "@types/node": "^18" } }, "@types/graceful-fs": { @@ -66954,7 +67103,7 @@ "integrity": "sha512-AiHRaEB50LQg0pZmm659vNBb9f4SJ0qrAnteuzhSeAUcJKxoYgEnprg/83kppCnc2zvtCKbdZry1a5pVY3lOTQ==", "dev": true, "requires": { - "@types/node": "*" + "@types/node": "^18" } }, "@types/http-assert": { @@ -66981,7 +67130,7 @@ "integrity": "sha512-25g5atgiVNTIv0LBDTg1H74Hvayx0ajtJPLLcYE3whFv75J0pWNtOBzaXJQgDTmrX1bx5U9YC2w/n65BN1HwRQ==", "dev": true, "requires": { - "@types/node": "*" + "@types/node": "^18" } }, "@types/istanbul-lib-coverage": { @@ -67027,7 +67176,7 @@ "requires": { "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", + "@types/node": "^18", "@types/yargs": "17.0.10", "chalk": "^4.0.0" } @@ -67118,7 +67267,7 @@ "optional": true, "peer": true, "requires": { - "@types/node": "*", + "@types/node": "^18", "@types/tough-cookie": "*", "parse5": "^7.0.0" }, @@ -67160,7 +67309,7 @@ "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", "dev": true, "requires": { - "@types/node": "*" + "@types/node": "^18" } }, "@types/koa": { @@ -67176,7 +67325,7 @@ "@types/http-errors": "*", "@types/keygrip": "*", "@types/koa-compose": "*", - "@types/node": "*" + "@types/node": "^18" } }, "@types/koa-compose": { @@ -67227,7 +67376,7 @@ "integrity": "sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==", "dev": true, "requires": { - "@types/node": "*" + "@types/node": "^18" } }, "@types/normalize-package-data": { @@ -67248,7 +67397,7 @@ "integrity": "sha512-qTxFi6Buiu8+50/+3DGIWLHM6QuWsEKugJnnP6iv2Mc4ncxE4A/OJkjuVOA+5X0X1S/nq5VJRa8Lu+nwcvbrKA==", "dev": true, "requires": { - "@types/node": "*", + "@types/node": "^18", "kleur": "^3.0.3" } }, @@ -67311,7 +67460,7 @@ "integrity": "sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==", "dev": true, "requires": { - "@types/node": "*" + "@types/node": "^18" } }, "@types/restify": { @@ -67322,7 +67471,7 @@ "requires": { "@types/bunyan": "*", "@types/formidable": "^1", - "@types/node": "*", + "@types/node": "^18", "@types/spdy": "*" } }, @@ -67351,7 +67500,7 @@ "dev": true, "requires": { "@types/mime": "^1", - "@types/node": "*" + "@types/node": "^18" } }, "@types/serve-index": { @@ -67370,7 +67519,7 @@ "dev": true, "requires": { "@types/http-errors": "*", - "@types/node": "*", + "@types/node": "^18", "@types/send": "*" } }, @@ -67380,7 +67529,7 @@ "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==", "dev": true, "requires": { - "@types/node": "*" + "@types/node": "^18" } }, "@types/spdy": { @@ -67389,7 +67538,7 @@ "integrity": "sha512-ZYGzQrZX6j4GEy9x9+e4bjWOPOiZqFPm/3GnZ9xS0SMJqs+FbNiF6hBzr8EjSF2Z6TFY/PzUWOswUiRcZxW3FQ==", "dev": true, "requires": { - "@types/node": "*" + "@types/node": "^18" } }, "@types/stack-utils": { @@ -67418,7 +67567,7 @@ "integrity": "sha512-osM/gWBTPKgHV8XkTunnegTRIsvF6owmf5w+JtAfOw472dptdm0dlGv4xCt6GwQRcC2XVOvvRE/0bAoQcL2QkA==", "dev": true, "requires": { - "@types/node": "*" + "@types/node": "^18" } }, "@types/yargs": { @@ -67443,7 +67592,7 @@ "dev": true, "optional": true, "requires": { - "@types/node": "*" + "@types/node": "^18" } }, "@typescript-eslint/eslint-plugin": { @@ -68715,7 +68864,7 @@ "@jest/schemas": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", + "@types/node": "^18", "@types/yargs": "17.0.10", "chalk": "^4.0.0" } @@ -68813,7 +68962,7 @@ "requires": { "@jest/types": "^29.6.3", "@types/graceful-fs": "^4.1.3", - "@types/node": "*", + "@types/node": "^18", "anymatch": "^3.0.3", "fb-watchman": "^2.0.0", "fsevents": "^2.3.2", @@ -68838,7 +68987,7 @@ "dev": true, "requires": { "@jest/types": "^29.6.3", - "@types/node": "*", + "@types/node": "^18", "chalk": "^4.0.0", "ci-info": "^3.2.0", "graceful-fs": "^4.2.9", @@ -68851,7 +69000,7 @@ "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", "dev": true, "requires": { - "@types/node": "*", + "@types/node": "^18", "jest-util": "^29.7.0", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" @@ -71058,7 +71207,7 @@ "peer": true, "requires": { "@jest/types": "^29.6.3", - "@types/node": "*", + "@types/node": "^18", "chalk": "^4.0.0", "jest-message-util": "^29.7.0", "jest-util": "^29.7.0", @@ -71075,7 +71224,7 @@ "requires": { "@jest/fake-timers": "^29.7.0", "@jest/types": "^29.6.3", - "@types/node": "*", + "@types/node": "^18", "jest-mock": "^29.7.0" } }, @@ -71089,7 +71238,7 @@ "requires": { "@jest/types": "^29.6.3", "@sinonjs/fake-timers": "^10.0.2", - "@types/node": "*", + "@types/node": "^18", "jest-message-util": "^29.7.0", "jest-mock": "^29.7.0", "jest-util": "^29.7.0" @@ -71186,7 +71335,7 @@ "@jest/schemas": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", + "@types/node": "^18", "@types/yargs": "17.0.10", "chalk": "^4.0.0" } @@ -71476,7 +71625,7 @@ "@jest/environment": "^29.7.0", "@jest/fake-timers": "^29.7.0", "@jest/types": "^29.6.3", - "@types/node": "*", + "@types/node": "^18", "jest-mock": "^29.7.0", "jest-util": "^29.7.0" } @@ -71499,7 +71648,7 @@ "requires": { "@jest/types": "^29.6.3", "@types/graceful-fs": "^4.1.3", - "@types/node": "*", + "@types/node": "^18", "anymatch": "^3.0.3", "fb-watchman": "^2.0.0", "fsevents": "^2.3.2", @@ -71565,7 +71714,7 @@ "peer": true, "requires": { "@jest/types": "^29.6.3", - "@types/node": "*", + "@types/node": "^18", "jest-util": "^29.7.0" } }, @@ -71609,7 +71758,7 @@ "@jest/test-result": "^29.7.0", "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", - "@types/node": "*", + "@types/node": "^18", "chalk": "^4.0.0", "emittery": "^0.13.1", "graceful-fs": "^4.2.9", @@ -71642,7 +71791,7 @@ "@jest/test-result": "^29.7.0", "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", - "@types/node": "*", + "@types/node": "^18", "chalk": "^4.0.0", "cjs-module-lexer": "^1.0.0", "collect-v8-coverage": "^1.0.0", @@ -71698,7 +71847,7 @@ "peer": true, "requires": { "@jest/types": "^29.6.3", - "@types/node": "*", + "@types/node": "^18", "chalk": "^4.0.0", "ci-info": "^3.2.0", "graceful-fs": "^4.2.9", @@ -71731,7 +71880,7 @@ "requires": { "@jest/test-result": "^29.7.0", "@jest/types": "^29.6.3", - "@types/node": "*", + "@types/node": "^18", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", "emittery": "^0.13.1", @@ -71747,7 +71896,7 @@ "optional": true, "peer": true, "requires": { - "@types/node": "*", + "@types/node": "^18", "jest-util": "^29.7.0", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" @@ -72672,7 +72821,7 @@ "dev": true, "requires": { "@electron/get": "^2.0.0", - "@types/node": "^18.11.18", + "@types/node": "^18", "extract-zip": "^2.0.1" } }, @@ -73980,7 +74129,7 @@ "requires": { "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", + "@types/node": "^18", "@types/yargs": "17.0.10", "chalk": "^4.0.0" } @@ -76950,7 +77099,7 @@ "requires": { "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", + "@types/node": "^18", "@types/yargs": "17.0.10", "chalk": "^4.0.0" } @@ -77141,7 +77290,7 @@ "requires": { "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", + "@types/node": "^18", "@types/yargs": "17.0.10", "chalk": "^4.0.0" } @@ -77340,7 +77489,7 @@ "requires": { "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", + "@types/node": "^18", "@types/yargs": "17.0.10", "chalk": "^4.0.0" } @@ -77536,7 +77685,7 @@ "requires": { "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", + "@types/node": "^18", "@types/yargs": "17.0.10", "chalk": "^4.0.0" } @@ -77649,7 +77798,7 @@ "requires": { "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", + "@types/node": "^18", "@types/yargs": "17.0.10", "chalk": "^4.0.0" } @@ -77741,7 +77890,7 @@ "@jest/environment": "^26.6.2", "@jest/fake-timers": "^26.6.2", "@jest/types": "^26.6.2", - "@types/node": "*", + "@types/node": "^18", "jest-mock": "^26.6.2", "jest-util": "^26.6.2", "jsdom": "^16.4.0" @@ -77755,7 +77904,7 @@ "requires": { "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", + "@types/node": "^18", "@types/yargs": "17.0.10", "chalk": "^4.0.0" } @@ -78046,7 +78195,7 @@ "@jest/environment": "^26.6.2", "@jest/fake-timers": "^26.6.2", "@jest/types": "^26.6.2", - "@types/node": "*", + "@types/node": "^18", "jest-mock": "^26.6.2", "jest-util": "^26.6.2" }, @@ -78059,7 +78208,7 @@ "requires": { "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", + "@types/node": "^18", "@types/yargs": "17.0.10", "chalk": "^4.0.0" } @@ -78288,7 +78437,7 @@ "@jest/source-map": "^26.6.2", "@jest/test-result": "^26.6.2", "@jest/types": "^26.6.2", - "@types/node": "*", + "@types/node": "^18", "chalk": "^4.0.0", "co": "^4.6.0", "expect": "^26.6.2", @@ -78322,7 +78471,7 @@ "requires": { "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", + "@types/node": "^18", "@types/yargs": "17.0.10", "chalk": "^4.0.0" } @@ -78441,7 +78590,7 @@ "requires": { "@jest/types": "^26.6.2", "@types/graceful-fs": "^4.1.2", - "@types/node": "*", + "@types/node": "^18", "anymatch": "^3.0.3", "fb-watchman": "^2.0.0", "fsevents": "^2.1.2", @@ -78513,7 +78662,7 @@ "integrity": "sha512-S5wqyz0DXnNJPd/xfIzZ5Xnp1HrJWBczg8mMfMpN78OJ5eDxXyf+Ygld9wX1DnUWbIbhM1YDY95NjR4CBXkb2g==", "dev": true, "requires": { - "@types/node": "*", + "@types/node": "^18", "graceful-fs": "^4.2.4" } }, @@ -78703,7 +78852,7 @@ "requires": { "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", + "@types/node": "^18", "@types/yargs": "17.0.10", "chalk": "^4.0.0" } @@ -78861,7 +79010,7 @@ "dev": true, "requires": { "@jest/types": "^26.6.2", - "@types/node": "*" + "@types/node": "^18" }, "dependencies": { "@jest/types": { @@ -78872,7 +79021,7 @@ "requires": { "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", + "@types/node": "^18", "@types/yargs": "17.0.10", "chalk": "^4.0.0" } @@ -78974,7 +79123,7 @@ "requires": { "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", + "@types/node": "^18", "@types/yargs": "17.0.10", "chalk": "^4.0.0" } @@ -79156,7 +79305,7 @@ "requires": { "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", + "@types/node": "^18", "@types/yargs": "17.0.10", "chalk": "^4.0.0" } @@ -80622,7 +80771,7 @@ "requires": { "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", + "@types/node": "^18", "@types/yargs": "17.0.10", "chalk": "^4.0.0" } @@ -80720,7 +80869,7 @@ "requires": { "@jest/types": "^26.6.2", "@types/graceful-fs": "^4.1.2", - "@types/node": "*", + "@types/node": "^18", "anymatch": "^3.0.3", "fb-watchman": "^2.0.0", "fsevents": "^2.1.2", @@ -80757,7 +80906,7 @@ "integrity": "sha512-S5wqyz0DXnNJPd/xfIzZ5Xnp1HrJWBczg8mMfMpN78OJ5eDxXyf+Ygld9wX1DnUWbIbhM1YDY95NjR4CBXkb2g==", "dev": true, "requires": { - "@types/node": "*", + "@types/node": "^18", "graceful-fs": "^4.2.4" } }, @@ -80837,7 +80986,7 @@ "dev": true, "requires": { "@jest/types": "^26.6.2", - "@types/node": "*", + "@types/node": "^18", "chalk": "^4.0.0", "graceful-fs": "^4.2.4", "is-ci": "^2.0.0", @@ -80852,7 +81001,7 @@ "requires": { "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", + "@types/node": "^18", "@types/yargs": "17.0.10", "chalk": "^4.0.0" } @@ -80982,7 +81131,7 @@ "requires": { "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", + "@types/node": "^18", "@types/yargs": "17.0.10", "chalk": "^4.0.0" } @@ -81079,7 +81228,7 @@ "requires": { "@jest/test-result": "^26.6.2", "@jest/types": "^26.6.2", - "@types/node": "*", + "@types/node": "^18", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", "jest-util": "^26.6.2", @@ -81094,7 +81243,7 @@ "requires": { "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", + "@types/node": "^18", "@types/yargs": "17.0.10", "chalk": "^4.0.0" } @@ -81165,7 +81314,7 @@ "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", "dev": true, "requires": { - "@types/node": "*", + "@types/node": "^18", "merge-stream": "^2.0.0", "supports-color": "^7.0.0" }, @@ -86886,6 +87035,60 @@ } } }, + "pkg-up": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", + "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", + "dev": true, + "requires": { + "find-up": "^3.0.0" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + } + } + }, "pkginfo": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.4.1.tgz", @@ -87355,7 +87558,7 @@ "@protobufjs/pool": "^1.1.0", "@protobufjs/utf8": "^1.1.0", "@types/long": "^4.0.1", - "@types/node": ">=13.7.0", + "@types/node": "^18", "long": "^4.0.0" } }, @@ -90046,7 +90249,7 @@ "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", "dev": true, "requires": { - "@types/node": "*", + "@types/node": "^18", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" } diff --git a/package.json b/package.json index cd077016fb..7efde422a7 100644 --- a/package.json +++ b/package.json @@ -26,7 +26,6 @@ "@rollup/plugin-replace": "^6.0.1", "@rollup/plugin-typescript": "^12.1.0", "@types/jest": "^26.0.14", - "@types/node": "^18", "@typescript-eslint/eslint-plugin": "^8.22.0", "@typescript-eslint/parser": "^8.22.0", "aws-sdk": "^2.1303.0", @@ -46,6 +45,7 @@ "lerna": "^8.1.8", "metro-react-native-babel-preset": "^0.58.0", "ncp": "^2.0.0", + "pkg-up": "3.1.0", "playwright": "^1.10.0", "ps-list": "^7.2.0", "rimraf": "^3.0.0", @@ -86,6 +86,7 @@ "@types/express-serve-static-core": "4.17.28", "@types/prettier": "2.6.0", "@types/yargs": "17.0.10", + "@types/node": "^18", "node-fetch": "^2.6.7", "hermes-engine": "^0.10.0", "json-schema": "^0.4.0", diff --git a/packages/browser/src/bugsnag.ts b/packages/browser/src/bugsnag.ts index 9af8b76146..36bf6e6c05 100644 --- a/packages/browser/src/bugsnag.ts +++ b/packages/browser/src/bugsnag.ts @@ -1,5 +1,5 @@ import ClientWithInternals from '@bugsnag/core/client' -import type { BugsnagStatic, Config } from '@bugsnag/core' +import type { BugsnagStatic, Config, Client } from '@bugsnag/core' import map from '@bugsnag/core/lib/es-utils/map' import keys from '@bugsnag/core/lib/es-utils/keys' @@ -45,8 +45,8 @@ export interface BrowserConfig extends Config { } export interface BrowserBugsnagStatic extends BugsnagStatic { - start(apiKeyOrOpts: string | BrowserConfig): ClientWithInternals - createClient(apiKeyOrOpts: string | BrowserConfig): ClientWithInternals + start(apiKeyOrOpts: string | BrowserConfig): Client + createClient(apiKeyOrOpts: string | BrowserConfig): Client } declare global { @@ -57,7 +57,7 @@ declare global { type BrowserClient = Partial & { _client: ClientWithInternals | null - createClient: (opts?: Config) => ClientWithInternals + createClient: (opts?: Config) => Client start: (opts?: Config) => ClientWithInternals isStarted: () => boolean } @@ -108,7 +108,7 @@ const notifier: BrowserClient = { notifier._client._logger.warn('Bugsnag.start() was called more than once. Ignoring.') return notifier._client } - notifier._client = notifier.createClient(opts) + notifier._client = notifier.createClient(opts) as ClientWithInternals return notifier._client }, isStarted: () => { diff --git a/packages/core/lib/test/clone-client.test.ts b/packages/core/lib/test/clone-client.test.ts deleted file mode 100644 index cd0e4e2210..0000000000 --- a/packages/core/lib/test/clone-client.test.ts +++ /dev/null @@ -1,220 +0,0 @@ -import Client from '../../client' -import cloneClient from '../clone-client' - -describe('clone-client', () => { - it('should not copy the configuration', () => { - const apiKey = '123456abcdef123456abcdef123456ab' - - const original = new Client({ apiKey }) - const clone = cloneClient(original) - - expect(clone._config).toBe(original._config) - expect(clone._config.apiKey).toBe(original._config.apiKey) - }) - - it('should not copy the logger', () => { - const logger = { - debug: () => {}, - info: () => {}, - warn: () => {}, - error: () => {} - } - - const original = new Client({ apiKey: '123456abcdef123456abcdef123456ab', logger }) - const clone = cloneClient(original) - - expect(clone._logger).toBe(logger) - expect(clone._logger).toBe(original._logger) - }) - - it('should not copy the delivery implementation', () => { - const delivery = { - sendEvent: () => {}, - sendSession: () => {} - } - - const original = new Client({ apiKey: '123456abcdef123456abcdef123456ab' }) - original._setDelivery(() => delivery) - - const clone = cloneClient(original) - - expect(clone._delivery).toBe(delivery) - expect(clone._delivery).toBe(original._delivery) - }) - - it('should not copy the session delegate', () => { - const sessionDelegate = { - startSession: (client: Client) => client, - resumeSession: (client: Client) => client, - pauseSession: () => {} - } - - const original = new Client({ apiKey: '123456abcdef123456abcdef123456ab' }) - original._sessionDelegate = sessionDelegate - - const clone = cloneClient(original) - - expect(clone._sessionDelegate).toBe(sessionDelegate) - expect(clone._sessionDelegate).toBe(original._sessionDelegate) - }) - - it('should not copy the context', () => { - const original = new Client({ apiKey: '123456abcdef123456abcdef123456ab' }) - original.setContext('abc') - - const clone = cloneClient(original) - - expect(clone.getContext()).toBe('abc') - expect(clone.getContext()).toBe(original.getContext()) - - // changing the clone's context shouldn't affect the original's context - clone.setContext('xyz') - - expect(clone.getContext()).toBe('xyz') - expect(original.getContext()).toBe('abc') - }) - - it('should clone breadcrumbs', () => { - const original = new Client({ apiKey: '123456abcdef123456abcdef123456ab' }) - original.leaveBreadcrumb('breadcrumb 1') - - expect(original._breadcrumbs).toHaveLength(1) - const breadcrumb = original._breadcrumbs[0] - - const clone = cloneClient(original) - - expect(clone._breadcrumbs).toHaveLength(1) - expect(clone._breadcrumbs[0]).toBe(breadcrumb) - expect(clone._breadcrumbs).not.toBe(original._breadcrumbs) - - // leaving a new breadcrumb on the clone shouldn't affect the original - clone.leaveBreadcrumb('breadcrumb 2') - - expect(clone._breadcrumbs).toHaveLength(2) - expect(original._breadcrumbs).toHaveLength(1) - }) - - it('should clone metadata', () => { - const original = new Client({ apiKey: '123456abcdef123456abcdef123456ab' }) - original.addMetadata('abc', 'xyz', 123) - - const clone = cloneClient(original) - - expect(clone._metadata).toStrictEqual({ abc: { xyz: 123 } }) - expect(clone._metadata).not.toBe(original._metadata) - - // changing the clone's metadata shouldn't affect the original - clone.addMetadata('abc', 'xyz', 999) - - expect(clone._metadata).toStrictEqual({ abc: { xyz: 999 } }) - expect(original._metadata).toStrictEqual({ abc: { xyz: 123 } }) - }) - - it('should clone feature flags', () => { - const original = new Client({ apiKey: '123456abcdef123456abcdef123456ab' }) - original.addFeatureFlag('abc', '123') - - const clone = cloneClient(original) - - expect(clone._features).toStrictEqual([{ name: 'abc', variant: '123' }]) - expect(clone._features).not.toBe(original._features) - - // changing the clone's feature flags shouldn't affect the original - clone.addFeatureFlag('xyz', '999') - - expect(clone._features).toStrictEqual([{ name: 'abc', variant: '123' }, { name: 'xyz', variant: '999' }]) - expect(original._features).toStrictEqual([{ name: 'abc', variant: '123' }]) - }) - - it('should clone user information', () => { - const original = new Client({ apiKey: '123456abcdef123456abcdef123456ab' }) - original.setUser('123', 'abc@example.com', 'abc') - - const clone = cloneClient(original) - - expect(clone.getUser()).toStrictEqual({ id: '123', email: 'abc@example.com', name: 'abc' }) - expect(clone.getUser()).not.toBe(original.getUser()) - - // changing the clone's user shouldn't affect the original - clone.setUser('999', 'xyz@example.com', 'xyz') - - expect(clone.getUser()).toStrictEqual({ id: '999', email: 'xyz@example.com', name: 'xyz' }) - expect(original.getUser()).toStrictEqual({ id: '123', email: 'abc@example.com', name: 'abc' }) - }) - - it('should clone the on error callback array', () => { - const onError = () => {} - - const original = new Client({ apiKey: '123456abcdef123456abcdef123456ab' }) - original.addOnError(onError) - - const clone = cloneClient(original) - - expect(clone._cbs.e).toHaveLength(1) - expect(clone._cbs.e[0]).toBe(onError) - expect(clone._cbs.e).not.toBe(original._cbs.e) - - // changing the clone's callbacks shouldn't affect the original - clone.addOnError(onError) - - expect(clone._cbs.e).toHaveLength(2) - expect(original._cbs.e).toHaveLength(1) - }) - - it('should clone the on session callback array', () => { - const onSession = () => {} - - const original = new Client({ apiKey: '123456abcdef123456abcdef123456ab' }) - original.addOnSession(onSession) - - const clone = cloneClient(original) - - expect(clone._cbs.s).toHaveLength(1) - expect(clone._cbs.s[0]).toBe(onSession) - expect(clone._cbs.s).not.toBe(original._cbs.s) - - // changing the clone's callbacks shouldn't affect the original - clone.addOnSession(onSession) - - expect(clone._cbs.s).toHaveLength(2) - expect(original._cbs.s).toHaveLength(1) - }) - - it('should clone the on session payload callback array', () => { - const onSessionPayload = () => {} - - const original = new Client({ apiKey: '123456abcdef123456abcdef123456ab' }) - original._addOnSessionPayload(onSessionPayload) - - const clone = cloneClient(original) - - expect(clone._cbs.sp).toHaveLength(1) - expect(clone._cbs.sp[0]).toBe(onSessionPayload) - expect(clone._cbs.sp).not.toBe(original._cbs.sp) - - // changing the clone's callbacks shouldn't affect the original - clone._addOnSessionPayload(onSessionPayload) - - expect(clone._cbs.sp).toHaveLength(2) - expect(original._cbs.sp).toHaveLength(1) - }) - - it('should clone the on breadcrumb callback array', () => { - const onBreadcrumb = () => {} - - const original = new Client({ apiKey: '123456abcdef123456abcdef123456ab' }) - original.addOnBreadcrumb(onBreadcrumb) - - const clone = cloneClient(original) - - expect(clone._cbs.b).toHaveLength(1) - expect(clone._cbs.b[0]).toBe(onBreadcrumb) - expect(clone._cbs.b).not.toBe(original._cbs.b) - - // changing the clone's callbacks shouldn't affect the original - clone.addOnBreadcrumb(onBreadcrumb) - - expect(clone._cbs.b).toHaveLength(2) - expect(original._cbs.b).toHaveLength(1) - }) -}) diff --git a/packages/core/package.json b/packages/core/package.json index e179bea905..78709ffedf 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,8 +1,40 @@ { "name": "@bugsnag/core", - "main": "index.js", + "main": "src/index.js", "version": "8.2.0", "types": "types/index.d.ts", + "exports": { + ".": { + "types": "./types/index.d.ts", + "import": "./src/index.js", + "default": "./src/index.js" + }, + "./lib/clone-client": "./src/lib/clone-client.js", + "./lib/json-payload": "./src/lib/json-payload.js", + "./lib/es-utils/assign":"./src/lib/es-utils/assign.js", + "./lib/validators/int-range": "./src/lib/validators/int-range.js", + "./lib/es-utils/map": "./src/lib/es-utils/map.js", + "./lib/es-utils/includes": "./src/lib/es-utils/includes.js", + "./lib/es-utils/filter": "./src/lib/es-utils/filter.js", + "./lib/iserror": "./src/lib/iserror.js", + "./lib/es-utils/reduce": "./src/lib/es-utils/reduce.js", + "./lib/es-utils/keys": "./src/lib/es-utils/keys.js", + "./lib/derecursify": "./src/lib/derecursify.js", + "./lib/metadata-delegate": "./src/lib/metadata-delegate.js", + "./lib/callback-runner": "./src/lib/callback-runner.js", + "./lib/node-fallback-stack": "./src/lib/node-fallback-stack.js", + "./lib/sync-callback-runner": "./src/lib/sync-callback-runner.js", + "./lib/path-normalizer": "./src/lib/path-normalizer.js", + "./lib/validators/string-with-length": "./src/lib/validators/string-with-length.js", + "./lib/validators/list-of-functions": "./src/lib/validators/list-of-functions.js", + "./lib/extract-object": "./src/lib/extract-object.js", + "./lib/feature-flag-delegate": "./src/lib/feature-flag-delegate.js", + "./client": { "import": "./src/client.js", "default": "./src/client.js", "types": "./src/client.d.ts" }, + "./config": "./src/config.js", + "./event": { "import": "./src/event.js", "default": "./src/event.js", "types": "./src/event.d.ts" }, + "./session": "./src/session.js", + "./breadcrumb": "./src/breadcrumb.js" + }, "description": "Core classes and utilities for Bugsnag notifiers", "homepage": "https://www.bugsnag.com/", "repository": { @@ -13,10 +45,17 @@ "access": "public" }, "files": [ - "lib", + "src", "types", - "*.js" + "*.js", + "dist" ], + "scripts": { + "size": "../../bin/size dist/bugsnag.min.js", + "clean": "rm -fr dist && mkdir dist", + "build": "npm run clean && npm run build:npm", + "build:npm": "rollup --config rollup.config.npm.mjs" + }, "author": "Bugsnag", "license": "MIT", "dependencies": { @@ -25,5 +64,13 @@ "error-stack-parser": "^2.0.3", "iserror": "^0.0.2", "stack-generator": "^2.0.3" + }, + "devDependencies": { + "@types/jest": "^26", + "@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": "^4.24.0" } } diff --git a/packages/core/rollup.config.npm.mjs b/packages/core/rollup.config.npm.mjs new file mode 100644 index 0000000000..d85ebe9520 --- /dev/null +++ b/packages/core/rollup.config.npm.mjs @@ -0,0 +1,47 @@ +import babel from '@rollup/plugin-babel'; +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" + +const plugins = [ + nodeResolve({ + browser: true + }), + commonjs(), + typescript(), + babel({ babelHelpers: 'bundled' }), +] + +const external = [ + // '@bugsnag/cuid', +] + +export default [ + createRollupConfig({ + input: "src/index.ts", + external, + output: [ + { + ...sharedOutput, + preserveModules: false, + entryFileNames: '[name].mjs', + format: 'esm' + } + ], + plugins + }), + createRollupConfig({ + input: "src/index.ts", + external, + output: [ + { + ...sharedOutput, + entryFileNames: '[name].cjs', + format: 'cjs', + }, + ], + plugins + }) +]; diff --git a/packages/core/breadcrumb.d.ts b/packages/core/src/breadcrumb.d.ts similarity index 89% rename from packages/core/breadcrumb.d.ts rename to packages/core/src/breadcrumb.d.ts index 793e2a73ec..cdf705ad1e 100644 --- a/packages/core/breadcrumb.d.ts +++ b/packages/core/src/breadcrumb.d.ts @@ -1,4 +1,4 @@ -import { Breadcrumb } from './types' +import { Breadcrumb } from '../types' export default class BreadcrumbWithInternals extends Breadcrumb { constructor (message: string, metadata: Breadcrumb['metadata'], type: Breadcrumb['type'], timestamp?: Date) diff --git a/packages/core/breadcrumb.js b/packages/core/src/breadcrumb.js similarity index 100% rename from packages/core/breadcrumb.js rename to packages/core/src/breadcrumb.js diff --git a/packages/core/client.d.ts b/packages/core/src/client.d.ts similarity index 98% rename from packages/core/client.d.ts rename to packages/core/src/client.d.ts index 46f0818a54..1ef35b4dc8 100644 --- a/packages/core/client.d.ts +++ b/packages/core/src/client.d.ts @@ -1,4 +1,4 @@ -import { Client, OnErrorCallback, Config, Breadcrumb, Session, OnSessionCallback, OnBreadcrumbCallback, Plugin, Device, App, User, FeatureFlag } from './types' +import { Client, OnErrorCallback, Config, Breadcrumb, Session, OnSessionCallback, OnBreadcrumbCallback, Plugin, Device, App, User, FeatureFlag } from '../types' import EventWithInternals from './event' interface LoggerConfig { diff --git a/packages/core/client.js b/packages/core/src/client.js similarity index 100% rename from packages/core/client.js rename to packages/core/src/client.js diff --git a/packages/core/config.d.ts b/packages/core/src/config.d.ts similarity index 100% rename from packages/core/config.d.ts rename to packages/core/src/config.d.ts diff --git a/packages/core/config.js b/packages/core/src/config.js similarity index 100% rename from packages/core/config.js rename to packages/core/src/config.js diff --git a/packages/core/event.d.ts b/packages/core/src/event.d.ts similarity index 95% rename from packages/core/event.d.ts rename to packages/core/src/event.d.ts index 85f70cfe99..d5d7852aa9 100644 --- a/packages/core/event.d.ts +++ b/packages/core/src/event.d.ts @@ -1,5 +1,5 @@ -import { App, Device, Event, Request, Breadcrumb, User, Session, FeatureFlag } from './types' -import { Error } from './types/event' +import { App, Device, Event, Request, Breadcrumb, User, Session, FeatureFlag } from '../types' +import { Error } from '../types/event' interface HandledState { unhandled: boolean diff --git a/packages/core/event.js b/packages/core/src/event.js similarity index 100% rename from packages/core/event.js rename to packages/core/src/event.js diff --git a/packages/core/index.js b/packages/core/src/index.js similarity index 100% rename from packages/core/index.js rename to packages/core/src/index.js diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts new file mode 100644 index 0000000000..21bbf6ec80 --- /dev/null +++ b/packages/core/src/index.ts @@ -0,0 +1,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' diff --git a/packages/core/lib/async-every.d.ts b/packages/core/src/lib/async-every.d.ts similarity index 100% rename from packages/core/lib/async-every.d.ts rename to packages/core/src/lib/async-every.d.ts diff --git a/packages/core/lib/async-every.js b/packages/core/src/lib/async-every.js similarity index 100% rename from packages/core/lib/async-every.js rename to packages/core/src/lib/async-every.js diff --git a/packages/core/lib/breadcrumb-types.js b/packages/core/src/lib/breadcrumb-types.js similarity index 100% rename from packages/core/lib/breadcrumb-types.js rename to packages/core/src/lib/breadcrumb-types.js diff --git a/packages/core/lib/callback-runner.d.ts b/packages/core/src/lib/callback-runner.d.ts similarity index 100% rename from packages/core/lib/callback-runner.d.ts rename to packages/core/src/lib/callback-runner.d.ts diff --git a/packages/core/lib/callback-runner.js b/packages/core/src/lib/callback-runner.js similarity index 100% rename from packages/core/lib/callback-runner.js rename to packages/core/src/lib/callback-runner.js diff --git a/packages/core/lib/clone-client.js b/packages/core/src/lib/clone-client.js similarity index 100% rename from packages/core/lib/clone-client.js rename to packages/core/src/lib/clone-client.js diff --git a/packages/core/lib/derecursify.js b/packages/core/src/lib/derecursify.js similarity index 100% rename from packages/core/lib/derecursify.js rename to packages/core/src/lib/derecursify.js diff --git a/packages/core/lib/error-stack-parser.js b/packages/core/src/lib/error-stack-parser.js similarity index 100% rename from packages/core/lib/error-stack-parser.js rename to packages/core/src/lib/error-stack-parser.js diff --git a/packages/core/lib/es-utils/assign.d.ts b/packages/core/src/lib/es-utils/assign.d.ts similarity index 100% rename from packages/core/lib/es-utils/assign.d.ts rename to packages/core/src/lib/es-utils/assign.d.ts diff --git a/packages/core/lib/es-utils/assign.js b/packages/core/src/lib/es-utils/assign.js similarity index 100% rename from packages/core/lib/es-utils/assign.js rename to packages/core/src/lib/es-utils/assign.js diff --git a/packages/core/lib/es-utils/filter.d.ts b/packages/core/src/lib/es-utils/filter.d.ts similarity index 100% rename from packages/core/lib/es-utils/filter.d.ts rename to packages/core/src/lib/es-utils/filter.d.ts diff --git a/packages/core/lib/es-utils/filter.js b/packages/core/src/lib/es-utils/filter.js similarity index 100% rename from packages/core/lib/es-utils/filter.js rename to packages/core/src/lib/es-utils/filter.js diff --git a/packages/core/lib/es-utils/includes.d.ts b/packages/core/src/lib/es-utils/includes.d.ts similarity index 100% rename from packages/core/lib/es-utils/includes.d.ts rename to packages/core/src/lib/es-utils/includes.d.ts diff --git a/packages/core/lib/es-utils/includes.js b/packages/core/src/lib/es-utils/includes.js similarity index 100% rename from packages/core/lib/es-utils/includes.js rename to packages/core/src/lib/es-utils/includes.js diff --git a/packages/core/lib/es-utils/is-array.d.ts b/packages/core/src/lib/es-utils/is-array.d.ts similarity index 100% rename from packages/core/lib/es-utils/is-array.d.ts rename to packages/core/src/lib/es-utils/is-array.d.ts diff --git a/packages/core/lib/es-utils/is-array.js b/packages/core/src/lib/es-utils/is-array.js similarity index 100% rename from packages/core/lib/es-utils/is-array.js rename to packages/core/src/lib/es-utils/is-array.js diff --git a/packages/core/lib/es-utils/keys.d.ts b/packages/core/src/lib/es-utils/keys.d.ts similarity index 100% rename from packages/core/lib/es-utils/keys.d.ts rename to packages/core/src/lib/es-utils/keys.d.ts diff --git a/packages/core/lib/es-utils/keys.js b/packages/core/src/lib/es-utils/keys.js similarity index 100% rename from packages/core/lib/es-utils/keys.js rename to packages/core/src/lib/es-utils/keys.js diff --git a/packages/core/lib/es-utils/map.d.ts b/packages/core/src/lib/es-utils/map.d.ts similarity index 100% rename from packages/core/lib/es-utils/map.d.ts rename to packages/core/src/lib/es-utils/map.d.ts diff --git a/packages/core/lib/es-utils/map.js b/packages/core/src/lib/es-utils/map.js similarity index 100% rename from packages/core/lib/es-utils/map.js rename to packages/core/src/lib/es-utils/map.js diff --git a/packages/core/lib/es-utils/reduce.d.ts b/packages/core/src/lib/es-utils/reduce.d.ts similarity index 100% rename from packages/core/lib/es-utils/reduce.d.ts rename to packages/core/src/lib/es-utils/reduce.d.ts diff --git a/packages/core/lib/es-utils/reduce.js b/packages/core/src/lib/es-utils/reduce.js similarity index 100% rename from packages/core/lib/es-utils/reduce.js rename to packages/core/src/lib/es-utils/reduce.js diff --git a/packages/core/lib/extract-object.js b/packages/core/src/lib/extract-object.js similarity index 100% rename from packages/core/lib/extract-object.js rename to packages/core/src/lib/extract-object.js diff --git a/packages/core/lib/feature-flag-delegate.js b/packages/core/src/lib/feature-flag-delegate.js similarity index 100% rename from packages/core/lib/feature-flag-delegate.js rename to packages/core/src/lib/feature-flag-delegate.js diff --git a/packages/core/lib/has-stack.js b/packages/core/src/lib/has-stack.js similarity index 100% rename from packages/core/lib/has-stack.js rename to packages/core/src/lib/has-stack.js diff --git a/packages/core/lib/iserror.d.ts b/packages/core/src/lib/iserror.d.ts similarity index 100% rename from packages/core/lib/iserror.d.ts rename to packages/core/src/lib/iserror.d.ts diff --git a/packages/core/lib/iserror.js b/packages/core/src/lib/iserror.js similarity index 100% rename from packages/core/lib/iserror.js rename to packages/core/src/lib/iserror.js diff --git a/packages/core/lib/json-payload.d.ts b/packages/core/src/lib/json-payload.d.ts similarity index 100% rename from packages/core/lib/json-payload.d.ts rename to packages/core/src/lib/json-payload.d.ts diff --git a/packages/core/lib/json-payload.js b/packages/core/src/lib/json-payload.js similarity index 100% rename from packages/core/lib/json-payload.js rename to packages/core/src/lib/json-payload.js diff --git a/packages/core/lib/metadata-delegate.js b/packages/core/src/lib/metadata-delegate.js similarity index 100% rename from packages/core/lib/metadata-delegate.js rename to packages/core/src/lib/metadata-delegate.js diff --git a/packages/core/lib/node-fallback-stack.js b/packages/core/src/lib/node-fallback-stack.js similarity index 100% rename from packages/core/lib/node-fallback-stack.js rename to packages/core/src/lib/node-fallback-stack.js diff --git a/packages/core/lib/path-normalizer.js b/packages/core/src/lib/path-normalizer.js similarity index 100% rename from packages/core/lib/path-normalizer.js rename to packages/core/src/lib/path-normalizer.js diff --git a/packages/core/lib/sync-callback-runner.js b/packages/core/src/lib/sync-callback-runner.js similarity index 100% rename from packages/core/lib/sync-callback-runner.js rename to packages/core/src/lib/sync-callback-runner.js diff --git a/packages/core/lib/validators/int-range.d.ts b/packages/core/src/lib/validators/int-range.d.ts similarity index 100% rename from packages/core/lib/validators/int-range.d.ts rename to packages/core/src/lib/validators/int-range.d.ts diff --git a/packages/core/lib/validators/int-range.js b/packages/core/src/lib/validators/int-range.js similarity index 100% rename from packages/core/lib/validators/int-range.js rename to packages/core/src/lib/validators/int-range.js diff --git a/packages/core/lib/validators/list-of-functions.js b/packages/core/src/lib/validators/list-of-functions.js similarity index 100% rename from packages/core/lib/validators/list-of-functions.js rename to packages/core/src/lib/validators/list-of-functions.js diff --git a/packages/core/lib/validators/string-with-length.js b/packages/core/src/lib/validators/string-with-length.js similarity index 100% rename from packages/core/lib/validators/string-with-length.js rename to packages/core/src/lib/validators/string-with-length.js diff --git a/packages/core/session.d.ts b/packages/core/src/session.d.ts similarity index 90% rename from packages/core/session.d.ts rename to packages/core/src/session.d.ts index c60d922ce3..ba319e74dd 100644 --- a/packages/core/session.d.ts +++ b/packages/core/src/session.d.ts @@ -1,4 +1,4 @@ -import Session from './types/session' +import Session from '../types/session' interface MinimalEvent { _handledState: { diff --git a/packages/core/session.js b/packages/core/src/session.js similarity index 100% rename from packages/core/session.js rename to packages/core/src/session.js diff --git a/packages/core/test/breadcrumb.test.ts b/packages/core/test/breadcrumb.test.ts index 9a8b9ece21..b48e1489e2 100644 --- a/packages/core/test/breadcrumb.test.ts +++ b/packages/core/test/breadcrumb.test.ts @@ -1,4 +1,4 @@ -import Breadcrumb from '../breadcrumb' +import Breadcrumb from '../src/breadcrumb' describe('@bugsnag/core/breadcrumb', () => { describe('toJSON()', () => { diff --git a/packages/core/test/client.test.ts b/packages/core/test/client.test.ts index 39441937de..f6c090afda 100644 --- a/packages/core/test/client.test.ts +++ b/packages/core/test/client.test.ts @@ -1,7 +1,7 @@ -import Client from '../client' -import Event from '../event' -import Session from '../session' -import breadcrumbTypes from '../lib/breadcrumb-types' +import Client from '../src/client' +import Event from '../src/event' +import Session from '../src/session' +import breadcrumbTypes from '../src/lib/breadcrumb-types' import { BreadcrumbType } from '../types/common' const noop = () => {} diff --git a/packages/core/test/config.test.ts b/packages/core/test/config.test.ts index 26a169043c..829b4cf2be 100644 --- a/packages/core/test/config.test.ts +++ b/packages/core/test/config.test.ts @@ -1,4 +1,4 @@ -import config from '../config' +import config from '../src/config' describe('@bugsnag/core/config', () => { describe('schema', () => { diff --git a/packages/core/test/event.test.ts b/packages/core/test/event.test.ts index 17e2268bdf..143c4b151f 100644 --- a/packages/core/test/event.test.ts +++ b/packages/core/test/event.test.ts @@ -1,5 +1,5 @@ import ErrorStackParser from 'error-stack-parser' -import Event from '../event' +import Event from '../src/event' jest.mock('stack-generator', () => ({ backtrace: () => [{}, {}] diff --git a/packages/core/lib/test/async-every.test.ts b/packages/core/test/lib/async-every.test.ts similarity index 96% rename from packages/core/lib/test/async-every.test.ts rename to packages/core/test/lib/async-every.test.ts index 8aff108e4f..1e02ba1e61 100644 --- a/packages/core/lib/test/async-every.test.ts +++ b/packages/core/test/lib/async-every.test.ts @@ -1,4 +1,4 @@ -import every from '../async-every' +import every from '../../src/lib/async-every' describe('async-every', () => { it('handles iterator errors', done => { diff --git a/packages/core/lib/test/callback-runner.test.ts b/packages/core/test/lib/callback-runner.test.ts similarity index 95% rename from packages/core/lib/test/callback-runner.test.ts rename to packages/core/test/lib/callback-runner.test.ts index 1d2ccda067..ad5d5e283e 100644 --- a/packages/core/lib/test/callback-runner.test.ts +++ b/packages/core/test/lib/callback-runner.test.ts @@ -1,5 +1,5 @@ -import runCallbacks from '../callback-runner' -import { NodeCallbackType } from '../async-every' +import runCallbacks from '../../src/lib/callback-runner' +import { NodeCallbackType } from '../../src/lib/async-every' interface TestEvent { name: string diff --git a/packages/core/test/lib/clone-client.test.ts b/packages/core/test/lib/clone-client.test.ts index 13bc6782d8..a5bb728c9c 100644 --- a/packages/core/test/lib/clone-client.test.ts +++ b/packages/core/test/lib/clone-client.test.ts @@ -1,5 +1,5 @@ -import Client from '../../client' -import clone from '../../lib/clone-client' +import Client from '../../src/client' +import clone from '../../src/lib/clone-client' const apiKey = 'abcabcabcabcabcabcabc1234567890f' diff --git a/packages/core/lib/test/derecursify.test.ts b/packages/core/test/lib/derecursify.test.ts similarity index 98% rename from packages/core/lib/test/derecursify.test.ts rename to packages/core/test/lib/derecursify.test.ts index 5e6cf12ae0..d0db9ef867 100644 --- a/packages/core/lib/test/derecursify.test.ts +++ b/packages/core/test/lib/derecursify.test.ts @@ -1,4 +1,4 @@ -import derecursift from '../derecursify' +import derecursift from '../../src/lib/derecursify' describe('delivery: react native makeSafe', () => { it('leaves simple types intact', () => { diff --git a/packages/core/lib/test/es-utils.test.ts b/packages/core/test/lib/es-utils.test.ts similarity index 84% rename from packages/core/lib/test/es-utils.test.ts rename to packages/core/test/lib/es-utils.test.ts index dc4e96c953..c40d19f83b 100644 --- a/packages/core/lib/test/es-utils.test.ts +++ b/packages/core/test/lib/es-utils.test.ts @@ -1,9 +1,9 @@ -import map from '../es-utils/map' -import reduce from '../es-utils/reduce' -import filter from '../es-utils/filter' -import keys from '../es-utils/keys' -import isArray from '../es-utils/is-array' -import includes from '../es-utils/includes' +import map from '../../src/lib/es-utils/map' +import reduce from '../../src/lib/es-utils/reduce' +import filter from '../../src/lib/es-utils/filter' +import keys from '../../src/lib/es-utils/keys' +import isArray from '../../src/lib/es-utils/is-array' +import includes from '../../src/lib/es-utils/includes' describe('es-utils', () => { describe('reduce(arr, fn, accum)', () => { diff --git a/packages/core/lib/test/extract-object.test.ts b/packages/core/test/lib/extract-object.test.ts similarity index 85% rename from packages/core/lib/test/extract-object.test.ts rename to packages/core/test/lib/extract-object.test.ts index fb78f31e51..713c434b75 100644 --- a/packages/core/lib/test/extract-object.test.ts +++ b/packages/core/test/lib/extract-object.test.ts @@ -1,4 +1,4 @@ -import extractObject from '../extract-object' +import extractObject from '../../src/lib/extract-object' describe('extractObject', () => { it('returns undefined if the key is not an object, or the value otherwise', () => { diff --git a/packages/core/lib/test/feature-flag-delegate.test.ts b/packages/core/test/lib/feature-flag-delegate.test.ts similarity index 99% rename from packages/core/lib/test/feature-flag-delegate.test.ts rename to packages/core/test/lib/feature-flag-delegate.test.ts index 8d8a2d69f3..7164f82488 100644 --- a/packages/core/lib/test/feature-flag-delegate.test.ts +++ b/packages/core/test/lib/feature-flag-delegate.test.ts @@ -1,4 +1,4 @@ -import delegate from '../feature-flag-delegate' +import delegate from '../../src/lib/feature-flag-delegate' describe('feature flag delegate', () => { describe('#add', () => { diff --git a/packages/core/lib/test/json-payload.test.ts b/packages/core/test/lib/json-payload.test.ts similarity index 98% rename from packages/core/lib/test/json-payload.test.ts rename to packages/core/test/lib/json-payload.test.ts index 44cf86c760..e576ae9a58 100644 --- a/packages/core/lib/test/json-payload.test.ts +++ b/packages/core/test/lib/json-payload.test.ts @@ -1,4 +1,4 @@ -import jsonPayload from '../json-payload' +import jsonPayload from '../../src/lib/json-payload' function makeBigObject () { var big: Record = {} diff --git a/packages/core/lib/test/validators.test.ts b/packages/core/test/lib/validators.test.ts similarity index 88% rename from packages/core/lib/test/validators.test.ts rename to packages/core/test/lib/validators.test.ts index f95b80c531..8fad64f23b 100644 --- a/packages/core/lib/test/validators.test.ts +++ b/packages/core/test/lib/validators.test.ts @@ -1,5 +1,5 @@ -import intRange from '../validators/int-range' -import stringWithLength from '../validators/string-with-length' +import intRange from '../../src/lib/validators/int-range' +import stringWithLength from '../../src/lib/validators/string-with-length' describe('intRange(min, max)(val)', () => { it('work with various values', () => { diff --git a/packages/core/test/metadata-delegate.test.js b/packages/core/test/metadata-delegate.test.js index 3dded77630..ebcaee2593 100644 --- a/packages/core/test/metadata-delegate.test.js +++ b/packages/core/test/metadata-delegate.test.js @@ -1,4 +1,4 @@ -import { add, clear } from '../lib/metadata-delegate' +import { add, clear } from '../src/lib/metadata-delegate' // it doesn't seem easy or even impossible to check whether __proto__ keys can be overwritten // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/proto diff --git a/packages/core/test/session.test.ts b/packages/core/test/session.test.ts index 931570e567..098a28e304 100644 --- a/packages/core/test/session.test.ts +++ b/packages/core/test/session.test.ts @@ -1,4 +1,4 @@ -import Session from '../session' +import Session from '../src/session' describe('@bugsnag/core/session', () => { describe('toJSON()', () => { diff --git a/packages/core/tsconfig.json b/packages/core/tsconfig.json new file mode 100644 index 0000000000..3f195727e2 --- /dev/null +++ b/packages/core/tsconfig.json @@ -0,0 +1,12 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "lib": [ "dom", "es2022" ], + "allowJs": true, + "outDir": "dist", + "removeComments": true, + "noEmitOnError": true, + "target": "es5", + }, + "include": ["src/**/*.ts", "src/**/*.js"] +} diff --git a/packages/delivery-x-domain-request/src/delivery.ts b/packages/delivery-x-domain-request/src/delivery.ts index ae281840d8..72179c636a 100644 --- a/packages/delivery-x-domain-request/src/delivery.ts +++ b/packages/delivery-x-domain-request/src/delivery.ts @@ -5,8 +5,8 @@ import { Client, Config, Event, Session } from '@bugsnag/core' import getApiUrl from './get-api-url' import matchPageProtocol from './match-page-protocol' -import type ClientWithInternals from 'packages/core/client' -import type { Delivery } from 'packages/core/client' +import type ClientWithInternals from '@bugsnag/core/client' +import type { Delivery } from '@bugsnag/core/client' const delivery = (client: Client, win = window): Delivery => ({ sendEvent: (event, cb = () => {}) => { diff --git a/packages/delivery-xml-http-request/src/delivery.ts b/packages/delivery-xml-http-request/src/delivery.ts index e357a88022..b7b04e7523 100644 --- a/packages/delivery-xml-http-request/src/delivery.ts +++ b/packages/delivery-xml-http-request/src/delivery.ts @@ -1,8 +1,8 @@ import type { Client, Config } from '@bugsnag/core' import payload from '@bugsnag/core/lib/json-payload' -import { Event } from 'packages/core' -import ClientWithInternals, { Delivery } from 'packages/core/client' +import { Event } from '@bugsnag/core' +import ClientWithInternals, { Delivery } from '@bugsnag/core/client' function getIntegrityHeaderValue (windowOrWorkerGlobalScope: Window, requestBody: string) { diff --git a/packages/node/src/bugsnag.ts b/packages/node/src/bugsnag.ts index 2752b6fbb5..400b6aca76 100644 --- a/packages/node/src/bugsnag.ts +++ b/packages/node/src/bugsnag.ts @@ -6,8 +6,6 @@ import assign from '@bugsnag/core/lib/es-utils/assign' import { schema as baseConfig } from '@bugsnag/core/config' import browserConfig from './config' -import Event from '@bugsnag/core/event' - import delivery from '@bugsnag/delivery-node' import pluginApp from '@bugsnag/plugin-app-duration' @@ -22,8 +20,9 @@ import pluginIntercept from '@bugsnag/plugin-intercept' import pluginContextualize from '@bugsnag/plugin-contextualize' import pluginStackframePathNormaliser from '@bugsnag/plugin-stackframe-path-normaliser' import pluginConsoleBreadcrumbs from '@bugsnag/plugin-console-breadcrumbs' -import { BugsnagStatic, Config, Logger } from '@bugsnag/core' +import { BugsnagStatic, Client, Config, Event, Logger } from '@bugsnag/core' import ClientWithInternals from '@bugsnag/core/client' +import EventWithInternals from '@bugsnag/core/event' type AfterErrorCb = (err: any, event: Event, logger: Logger) => void; @@ -39,8 +38,8 @@ export interface NodeConfig extends Config { } export interface NodeBugsnagStatic extends BugsnagStatic { - start(apiKeyOrOpts: string | NodeConfig): ClientWithInternals - createClient(apiKeyOrOpts: string | NodeConfig): ClientWithInternals + start(apiKeyOrOpts: string | NodeConfig): Client + createClient(apiKeyOrOpts: string | NodeConfig): Client } const name = 'Bugsnag Node' @@ -48,7 +47,7 @@ const version = '__BUGSNAG_NOTIFIER_VERSION__' const url = 'https://github.com/bugsnag/bugsnag-js' // @ts-ignore -Event.__type = 'nodejs' +EventWithInternals.__type = 'nodejs' // extend the base config schema with some node-specific options const internalPlugins = [ @@ -68,7 +67,7 @@ const internalPlugins = [ type NodeClient = Partial & { _client: ClientWithInternals | null - createClient: (opts?: Config) => ClientWithInternals + createClient: (opts?: Config) => Client start: (opts?: Config) => ClientWithInternals isStarted: () => boolean } @@ -121,7 +120,7 @@ const notifier: NodeClient = { notifier._client._logger.warn('Bugsnag.start() was called more than once. Ignoring.') return notifier._client } - notifier._client = notifier.createClient(opts) + notifier._client = notifier.createClient(opts) as ClientWithInternals return notifier._client }, isStarted: () => { diff --git a/packages/node/src/config.ts b/packages/node/src/config.ts index 157ee4c434..adaa286b23 100644 --- a/packages/node/src/config.ts +++ b/packages/node/src/config.ts @@ -5,8 +5,8 @@ import { inspect } from 'util' import assign from '@bugsnag/core/lib/es-utils/assign' import getPrefixedConsole from './get-prefixed-console' -import EventWithInternals from 'packages/core/event' -import { LoggerConfig } from 'packages/core/client' +import EventWithInternals from '@bugsnag/core/event' +import { LoggerConfig } from '@bugsnag/core/client' const config = { appType: { diff --git a/packages/plugin-app-duration/src/app-duration.ts b/packages/plugin-app-duration/src/app-duration.ts index 7b96b7c9ba..6eef4ff7b6 100644 --- a/packages/plugin-app-duration/src/app-duration.ts +++ b/packages/plugin-app-duration/src/app-duration.ts @@ -1,4 +1,4 @@ -import { Plugin } from 'packages/core/types' +import { Plugin } from '@bugsnag/core' let appStart = new Date() const reset = () => { appStart = new Date() } diff --git a/packages/plugin-client-ip/src/client-ip.ts b/packages/plugin-client-ip/src/client-ip.ts index 4fb6c08885..c81fb03cef 100644 --- a/packages/plugin-client-ip/src/client-ip.ts +++ b/packages/plugin-client-ip/src/client-ip.ts @@ -1,4 +1,4 @@ -import { Client, Plugin } from 'packages/core/types' +import { Client, Plugin } from '@bugsnag/core' import assign from '@bugsnag/core/lib/es-utils/assign' interface InternalClient extends Client { diff --git a/packages/plugin-interaction-breadcrumbs/src/interaction-breadcrumbs.ts b/packages/plugin-interaction-breadcrumbs/src/interaction-breadcrumbs.ts index d910565175..33941db5d9 100644 --- a/packages/plugin-interaction-breadcrumbs/src/interaction-breadcrumbs.ts +++ b/packages/plugin-interaction-breadcrumbs/src/interaction-breadcrumbs.ts @@ -1,5 +1,5 @@ import { Plugin } from '@bugsnag/core' -import type ClientWithInternals from 'packages/core/client' +import type ClientWithInternals from '@bugsnag/core/client' /* * Leaves breadcrumbs when the user interacts with the DOM diff --git a/packages/plugin-navigation-breadcrumbs/src/navigation-breadcrumbs.ts b/packages/plugin-navigation-breadcrumbs/src/navigation-breadcrumbs.ts index 10559b8053..7766fcc2e3 100644 --- a/packages/plugin-navigation-breadcrumbs/src/navigation-breadcrumbs.ts +++ b/packages/plugin-navigation-breadcrumbs/src/navigation-breadcrumbs.ts @@ -1,4 +1,4 @@ -import { Client, Plugin } from 'packages/core/types' +import { Client, Plugin } from '@bugsnag/core' interface PluginClient extends Client { _isBreadcrumbTypeEnabled: (type: string) => boolean diff --git a/packages/plugin-strip-query-string/test/strip-query-string.test.ts b/packages/plugin-strip-query-string/test/strip-query-string.test.ts index d1a8568fc1..4eb1f0cd29 100644 --- a/packages/plugin-strip-query-string/test/strip-query-string.test.ts +++ b/packages/plugin-strip-query-string/test/strip-query-string.test.ts @@ -1,7 +1,7 @@ import plugin from '../' import Client, { EventDeliveryPayload } from '@bugsnag/core/client' -import { Stackframe } from '@bugsnag/core/types/common' +import { Stackframe } from '@bugsnag/core' describe('plugin: strip query string', () => { it('should strip querystrings and fragments from urls', () => { diff --git a/packages/plugin-window-onerror/src/onerror.ts b/packages/plugin-window-onerror/src/onerror.ts index 3e9f199329..950c2be1f3 100644 --- a/packages/plugin-window-onerror/src/onerror.ts +++ b/packages/plugin-window-onerror/src/onerror.ts @@ -2,7 +2,7 @@ * Automatically notifies Bugsnag when window.onerror is called */ -import type { Plugin, Stackframe } from 'packages/core/types' +import type { Plugin, Stackframe } from '@bugsnag/core' export default (win = window, component = 'window onerror'): Plugin => ({ load: (client) => { diff --git a/packages/plugin-window-unhandled-rejection/src/fix-bluebird-stacktrace.ts b/packages/plugin-window-unhandled-rejection/src/fix-bluebird-stacktrace.ts index 1e4740c82a..8c2d46f051 100644 --- a/packages/plugin-window-unhandled-rejection/src/fix-bluebird-stacktrace.ts +++ b/packages/plugin-window-unhandled-rejection/src/fix-bluebird-stacktrace.ts @@ -1,4 +1,4 @@ -import { Stackframe } from 'packages/core/types' +import { Stackframe } from '@bugsnag/core' // The stack parser on bluebird stacks in FF get a suprious first frame: // diff --git a/tsconfig.json b/tsconfig.json index 0627e1bd2c..4ab55f2541 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,9 +1,11 @@ { "compilerOptions": { "target": "es5", - "module": "commonjs", + "module": "es2015", + "moduleResolution": "bundler", "lib": [ "dom", "esnext" ], "allowJs": true, + // "checkJs": true, "jsx": "preserve", "noEmit": true, "strict": true,