Skip to content
Merged
Show file tree
Hide file tree
Changes from 6 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,7 @@
"build:bundle": "rollup -c rollup.config.mjs",
"build": "npm run build:dts && npm run build:bundle",
"check:lint": "ESLINT_USE_FLAT_CONFIG=false eslint -v && ESLINT_USE_FLAT_CONFIG=false eslint --ext '.js,.ts' --max-warnings=0 src test && npm run build:dts && npm run check:tsd",
"format": "eslint --ext '.js,.ts' src test --fix",
"format": "ESLINT_USE_FLAT_CONFIG=false eslint --ext '.js,.ts' src test --fix",
"check:coverage": "nyc --check-coverage npm run check:node",
"prepare": "node etc/prepare.js",
"release": "standard-version -i HISTORY.md"
Expand Down
6 changes: 4 additions & 2 deletions src/utils/number_utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -87,10 +87,12 @@ export const NumberUtils: NumberUtils = {
const hi = NumberUtils.getUint32LE(source, offset + 4);

/*
eslint-disable-next-line no-restricted-globals
eslint-disable no-restricted-globals
-- This is allowed since this helper should not be called unless bigint features are enabled
*/
return (BigInt(hi) << BigInt(32)) + BigInt(lo);
const intermediate = (BigInt(hi) << BigInt(32)) + BigInt(lo);
return BigInt.asIntN(64, intermediate);
/* eslint-enable no-restricted-globals */
},

/** Reads a little-endian 64-bit float from source */
Expand Down
40 changes: 40 additions & 0 deletions test/node/bigint.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,46 @@ describe('BSON BigInt support', function () {

it(description, test);
}

it('correctly deserializes min 64 bit int (-2n**63n)', function () {
expect(
BSON.deserialize(Buffer.from('10000000126100000000000000008000', 'hex'), {
useBigInt64: true
})
).to.deep.equal({ a: -(2n ** 63n) });
});

it('correctly deserializes -1n', function () {
expect(
BSON.deserialize(Buffer.from('10000000126100FFFFFFFFFFFFFFFF00', 'hex'), {
useBigInt64: true
})
).to.deep.equal({ a: -1n });
});

it('correctly deserializes 0n', function () {
expect(
BSON.deserialize(Buffer.from('10000000126100000000000000000000', 'hex'), {
useBigInt64: true
})
).to.deep.equal({ a: 0n });
});

it('correctly deserializes 1n', function () {
expect(
BSON.deserialize(Buffer.from('10000000126100010000000000000000', 'hex'), {
useBigInt64: true
})
).to.deep.equal({ a: 1n });
});

it('correctly deserializes max 64 bit int (2n**63n -1n)', function () {
expect(
BSON.deserialize(Buffer.from('10000000126100FFFFFFFFFFFFFF7F00', 'hex'), {
useBigInt64: true
})
).to.deep.equal({ a: 2n ** 63n - 1n });
});
});

describe('BSON.serialize()', function () {
Expand Down