diff --git a/package-lock.json b/package-lock.json index c80bdcb0..27fc3c3d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6,7 +6,7 @@ "packages": { "": { "name": "bson", - "version": "4.6.3", + "version": "4.6.4", "license": "Apache-2.0", "dependencies": { "buffer": "^5.6.0" @@ -20,6 +20,7 @@ "@rollup/plugin-commonjs": "^15.0.0", "@rollup/plugin-json": "^4.1.0", "@rollup/plugin-node-resolve": "^9.0.0", + "@rollup/plugin-replace": "^4.0.0", "@rollup/plugin-typescript": "^6.0.0", "@typescript-eslint/eslint-plugin": "^3.10.1", "@typescript-eslint/parser": "^3.10.1", @@ -1945,6 +1946,19 @@ "rollup": "^1.20.0||^2.0.0" } }, + "node_modules/@rollup/plugin-replace": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-4.0.0.tgz", + "integrity": "sha512-+rumQFiaNac9y64OHtkHGmdjm7us9bo1PlbgQfdihQtuNxzjpaB064HbRnewUOggLQxVCCyINfStkgmBeQpv1g==", + "dev": true, + "dependencies": { + "@rollup/pluginutils": "^3.1.0", + "magic-string": "^0.25.7" + }, + "peerDependencies": { + "rollup": "^1.20.0 || ^2.0.0" + } + }, "node_modules/@rollup/plugin-typescript": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/@rollup/plugin-typescript/-/plugin-typescript-6.1.0.tgz", @@ -10898,6 +10912,16 @@ "resolve": "^1.17.0" } }, + "@rollup/plugin-replace": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-4.0.0.tgz", + "integrity": "sha512-+rumQFiaNac9y64OHtkHGmdjm7us9bo1PlbgQfdihQtuNxzjpaB064HbRnewUOggLQxVCCyINfStkgmBeQpv1g==", + "dev": true, + "requires": { + "@rollup/pluginutils": "^3.1.0", + "magic-string": "^0.25.7" + } + }, "@rollup/plugin-typescript": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/@rollup/plugin-typescript/-/plugin-typescript-6.1.0.tgz", diff --git a/package.json b/package.json index b3ce5a40..61acb58b 100644 --- a/package.json +++ b/package.json @@ -43,6 +43,7 @@ "@rollup/plugin-commonjs": "^15.0.0", "@rollup/plugin-json": "^4.1.0", "@rollup/plugin-node-resolve": "^9.0.0", + "@rollup/plugin-replace": "^4.0.0", "@rollup/plugin-typescript": "^6.0.0", "@typescript-eslint/eslint-plugin": "^3.10.1", "@typescript-eslint/parser": "^3.10.1", diff --git a/rollup.config.js b/rollup.config.js index f87f9e80..770e0f69 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -5,6 +5,7 @@ import { nodeResolve } from '@rollup/plugin-node-resolve'; import { babel } from '@rollup/plugin-babel'; import typescript from '@rollup/plugin-typescript'; import nodeGlobals from 'rollup-plugin-node-globals'; +import replace from '@rollup/plugin-replace'; const tsConfig = { allowJs: false, @@ -33,18 +34,26 @@ const tsConfig = { }; const input = 'src/bson.ts'; -const plugins = [ - typescript(tsConfig), - nodeResolve({ preferBuiltins: false }), - nodeBuiltins(), - nodeGlobals(), - commonjs({ extensions: ['.js', '.ts'] }), - babel({ - babelHelpers: 'external', - plugins: ['@babel/plugin-external-helpers'], - presets: [['@babel/env', { modules: false }]] - }) -]; +const plugins = (options = { browser: false }) => { + return [ + typescript(tsConfig), + nodeResolve({ preferBuiltins: false }), + nodeBuiltins(), + nodeGlobals(), + replace({ + preventAssignment: true, + values: { + 'process.browser': options.browser + } + }), + commonjs({ extensions: ['.js', '.ts'] }), + babel({ + babelHelpers: 'external', + plugins: ['@babel/plugin-external-helpers'], + presets: [['@babel/env', { modules: false }]] + }) + ]; +}; const external = Object.keys(pkg.dependencies || {}); @@ -60,7 +69,7 @@ module.exports = [ exports: 'named', sourcemap: true }, - plugins, + plugins: plugins(), external }, { @@ -88,6 +97,6 @@ module.exports = [ sourcemap: true } ], - plugins + plugins: plugins({ browser: true }) } ]; diff --git a/src/parser/utils.ts b/src/parser/utils.ts index 2cd128ad..7f623224 100644 --- a/src/parser/utils.ts +++ b/src/parser/utils.ts @@ -34,32 +34,38 @@ declare let require: Function; // eslint-disable-next-line @typescript-eslint/no-explicit-any declare let global: any; declare const self: unknown; +// eslint-disable-next-line @typescript-eslint/no-explicit-any +declare let process: any; // Used by @rollup/plugin-replace const detectRandomBytes = (): RandomBytesFunction => { - if (typeof window !== 'undefined') { - // browser crypto implementation(s) - const target = window.crypto || window.msCrypto; // allow for IE11 - if (target && target.getRandomValues) { - return size => target.getRandomValues(Buffer.alloc(size)); + if (process.browser) { + if (typeof window !== 'undefined') { + // browser crypto implementation(s) + const target = window.crypto || window.msCrypto; // allow for IE11 + if (target && target.getRandomValues) { + return size => target.getRandomValues(Buffer.alloc(size)); + } } - } - if (typeof global !== 'undefined' && global.crypto && global.crypto.getRandomValues) { - // allow for RN packages such as https://www.npmjs.com/package/react-native-get-random-values to populate global - return size => global.crypto.getRandomValues(Buffer.alloc(size)); - } + if (typeof global !== 'undefined' && global.crypto && global.crypto.getRandomValues) { + // allow for RN packages such as https://www.npmjs.com/package/react-native-get-random-values to populate global + return size => global.crypto.getRandomValues(Buffer.alloc(size)); + } - let requiredRandomBytes: RandomBytesFunction | null | undefined; - try { - // eslint-disable-next-line @typescript-eslint/no-var-requires - requiredRandomBytes = require('crypto').randomBytes; - } catch (e) { - // keep the fallback - } + return insecureRandomBytes; + } else { + let requiredRandomBytes: RandomBytesFunction | null | undefined; + try { + // eslint-disable-next-line @typescript-eslint/no-var-requires + requiredRandomBytes = require('crypto').randomBytes; + } catch (e) { + // keep the fallback + } - // NOTE: in transpiled cases the above require might return null/undefined + // NOTE: in transpiled cases the above require might return null/undefined - return requiredRandomBytes || insecureRandomBytes; + return requiredRandomBytes || insecureRandomBytes; + } }; export const randomBytes = detectRandomBytes();