Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/yaffle/babel-plugin-transform-bigint
A plugin for babel to transform `x * y` into something like `JSBI.multiply(x, y)` to support bigints.
https://github.com/yaffle/babel-plugin-transform-bigint
Last synced: 8 days ago
JSON representation
A plugin for babel to transform `x * y` into something like `JSBI.multiply(x, y)` to support bigints.
- Host: GitHub
- URL: https://github.com/yaffle/babel-plugin-transform-bigint
- Owner: Yaffle
- License: unlicense
- Created: 2018-06-22T16:51:29.000Z (over 6 years ago)
- Default Branch: master
- Last Pushed: 2024-09-22T14:50:13.000Z (about 2 months ago)
- Last Synced: 2024-10-31T13:50:42.655Z (15 days ago)
- Language: JavaScript
- Homepage:
- Size: 721 KB
- Stars: 18
- Watchers: 3
- Forks: 5
- Open Issues: 2
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# babel-plugin-transform-bigint
*Update:* Now it can convert a code using BigInt into a code using JSBI (https://github.com/GoogleChromeLabs/jsbi).
It will try to detect when an operator is used for bigints, not numbers. This will not work in many cases, so please use JSBI directly only
if you know, that the code works only with bigints.An example from https://github.com/GoogleChromeLabs/babel-plugin-transform-jsbi-to-bigint:
==========================================================================================Input using native `BigInt`s:
```javascript
const a = BigInt(Number.MAX_SAFE_INTEGER);
const b = 2n;a + b;
a - b;
a * b;
a / b;
a % b;
a ** b;
a << b;
a >> b;
a & b;
a | b;
a ^ b;-a;
~a;a === b;
a < b;
a <= b;
a > b;
a >= b;a.toString();
Number(a);
```Compiled output using `JSBI`:
```
const a = JSBI.BigInt(Number.MAX_SAFE_INTEGER);
const b = JSBI.BigInt(2);
JSBI.add(a, b);
JSBI.subtract(a, b);
JSBI.multiply(a, b);
JSBI.divide(a, b);
JSBI.remainder(a, b);
JSBI.exponentiate(a, b);
JSBI.leftShift(a, b);
JSBI.signedRightShift(a, b);
JSBI.bitwiseAnd(a, b);
JSBI.bitwiseOr(a, b);
JSBI.bitwiseXor(a, b);
JSBI.unaryMinus(a);
JSBI.bitwiseNot(a);
JSBI.equal(a, b);
JSBI.lessThan(a, b);
JSBI.lessThanOrEqual(a, b);
JSBI.greaterThan(a, b);
JSBI.greaterThanOrEqual(a, b);
a.toString();
JSBI.toNumber(a);
```Playground:
===========
1. Open https://babeljs.io/en/repl
2. Turn off all presets.
3. "Add plugin" @babel/babel-plugin-syntax-bigint
4. "Add plugin" babel-plugin-transform-bigint¡ It is buggy !
Example:
========1. Create a folder "example".
2. Create a file test.js:
```javascript
// floor(log2(n)), n >= 1
function ilog2(n) {
let i = 0n;
while (n >= 2n**(2n**i)) {
i += 1n;
}
let e = 0n;
let t = 1n;
while (i >= 0n) {
let b = 2n**i;
if (n >= t * 2n**b) {
t *= 2n**b;
e += b;
}
i -= 1n;
}
return e;
}// floor(sqrt(S)), S >= 0, https://en.wikipedia.org/wiki/Methods_of_computing_square_roots#Babylonian_method
function sqrt(S) {
let e = ilog2(S);
if (e < 2n) {
return 1n;
}
let f = e / 4n + 1n;
let x = (sqrt(S / 2n**(f * 2n)) + 1n) * 2n**f;
let xprev = x + 1n;
while (xprev > x) {
xprev = x;
x = (x + S / x) / 2n;
}
return xprev;
}function squareRoot(value, decimalDigits) {
return (sqrt(BigInt(value) * 10n**(BigInt(decimalDigits) * 2n + 2n)) + 5n).toString();
}```
3. Use babel:
```sh
npm init
npm install --save https://github.com/Yaffle/babel-plugin-transform-bigint
npm install --save-dev @babel/core @babel/cli
npm install jsbi --save
npm install --global http-server
npx babel --plugins=babel-plugin-transform-bigint test.js > test-transformed.js
http-server -p 8081
```4. Comment out the next line in test-transformed.js:
```javascript
import JSBI from "./jsbi.mjs";
```5. Create a file `test.html`.
```html
document.addEventListener("DOMContentLoaded", function (event) {
const form = document.querySelector("form");
form.oninput = function () {
const value = form.value.value;
const digits = Number(form.digits.value);
const s = squareRoot(value, digits);
// IE 11 does not support <output> element, so `form.output.value = "value";` is not working.
form.querySelector("output").textContent = '√' + value + ' ≈ ' + s.slice(0, 0 - digits - 1) + '.' + s.slice(0 - digits - 1, -1) + '…';
};
form.oninput();
}, false);
output {
overflow-wrap: break-word;
}
Value:
Number of decimal digits:
```
6. Open `http://127.0.0.1:8081/test.html` in a web browser.