@c9up/atom 0.1.6 → 0.1.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +60 -10
- package/dist/Decimal.d.ts +13 -1
- package/dist/Decimal.d.ts.map +1 -1
- package/dist/Decimal.js +312 -39
- package/dist/Decimal.js.map +1 -1
- package/dist/Money.d.ts +33 -0
- package/dist/Money.d.ts.map +1 -0
- package/dist/Money.js +128 -0
- package/dist/Money.js.map +1 -0
- package/dist/atlas.d.ts +22 -5
- package/dist/atlas.d.ts.map +1 -1
- package/dist/atlas.js +41 -0
- package/dist/atlas.js.map +1 -1
- package/dist/context.d.ts +15 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +46 -0
- package/dist/context.js.map +1 -0
- package/dist/index.d.ts +10 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +12 -5
- package/dist/index.js.map +1 -1
- package/dist/math.d.ts.map +1 -1
- package/dist/math.js +53 -3
- package/dist/math.js.map +1 -1
- package/dist/native.d.ts +3 -2
- package/dist/native.d.ts.map +1 -1
- package/dist/native.js +8 -2
- package/dist/native.js.map +1 -1
- package/index.darwin-arm64.node +0 -0
- package/index.darwin-x64.node +0 -0
- package/index.linux-arm64-gnu.node +0 -0
- package/index.linux-x64-gnu.node +0 -0
- package/index.win32-x64-msvc.node +0 -0
- package/package.json +2 -1
- package/scripts/bench.mjs +26 -0
- package/scripts/verify-napi.mjs +10 -1
- package/scripts/verify-wasm.mjs +32 -3
- package/src/Decimal.ts +403 -47
- package/src/Money.ts +179 -0
- package/src/atlas.ts +78 -2
- package/src/context.ts +67 -0
- package/src/index.ts +20 -5
- package/src/math.ts +56 -3
- package/src/native.ts +9 -2
package/dist/math.js
CHANGED
|
@@ -1,8 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* How far an exponent may move the decimal point.
|
|
3
|
+
*
|
|
4
|
+
* An expression like `1E1000000` is syntactically fine and would expand to a
|
|
5
|
+
* megabyte of zeroes before anything could reject it. The bound is far past any
|
|
6
|
+
* real monetary or measurement scale, and refuses the pathological input as
|
|
7
|
+
* input rather than as an out-of-memory later.
|
|
8
|
+
*/
|
|
9
|
+
const MAX_EXPONENT = 10_000;
|
|
10
|
+
/**
|
|
11
|
+
* Expand scientific notation into plain decimal text.
|
|
12
|
+
*
|
|
13
|
+
* `1E-10` is what `JSON.stringify` emits for a small number and what many APIs
|
|
14
|
+
* return, so a value that survives as a `number` has to survive as the string
|
|
15
|
+
* carrying it too — otherwise the same amount parses or throws depending on
|
|
16
|
+
* which side of a JSON boundary it arrived from.
|
|
17
|
+
*/
|
|
18
|
+
function expandScientific(input) {
|
|
19
|
+
const matched = /^([+-]?)(\d*)(?:\.(\d*))?[eE]([+-]?\d+)$/.exec(input);
|
|
20
|
+
if (!matched) {
|
|
21
|
+
throw new Error(`Invalid decimal: ${input}`);
|
|
22
|
+
}
|
|
23
|
+
const [, sign, wholeRaw = "", fracRaw = "", exponentRaw = "0"] = matched;
|
|
24
|
+
if (wholeRaw.length === 0 && fracRaw.length === 0) {
|
|
25
|
+
throw new Error(`Invalid decimal: ${input}`);
|
|
26
|
+
}
|
|
27
|
+
const exponent = Number(exponentRaw);
|
|
28
|
+
if (!Number.isInteger(exponent) || Math.abs(exponent) > MAX_EXPONENT) {
|
|
29
|
+
throw new Error(`Invalid decimal: ${input}`);
|
|
30
|
+
}
|
|
31
|
+
const digits = `${wholeRaw}${fracRaw}`;
|
|
32
|
+
const pointIndex = wholeRaw.length + exponent;
|
|
33
|
+
let expanded;
|
|
34
|
+
if (pointIndex <= 0) {
|
|
35
|
+
expanded = `0.${"0".repeat(-pointIndex)}${digits}`;
|
|
36
|
+
}
|
|
37
|
+
else if (pointIndex >= digits.length) {
|
|
38
|
+
expanded = `${digits}${"0".repeat(pointIndex - digits.length)}`;
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
expanded = `${digits.slice(0, pointIndex)}.${digits.slice(pointIndex)}`;
|
|
42
|
+
}
|
|
43
|
+
return sign === "-" ? `-${expanded}` : expanded;
|
|
44
|
+
}
|
|
1
45
|
export function parseDecimal(input) {
|
|
2
|
-
|
|
46
|
+
let s = input.trim();
|
|
3
47
|
if (!s) {
|
|
4
48
|
throw new Error("Invalid decimal: empty string");
|
|
5
49
|
}
|
|
50
|
+
if (/[eE]/.test(s)) {
|
|
51
|
+
s = expandScientific(s);
|
|
52
|
+
}
|
|
6
53
|
let sign = 1n;
|
|
7
54
|
let body = s;
|
|
8
55
|
if (body.startsWith("-")) {
|
|
@@ -21,6 +68,9 @@ export function parseDecimal(input) {
|
|
|
21
68
|
if (!/^\d*$/.test(whole) || !/^\d*$/.test(frac)) {
|
|
22
69
|
throw new Error(`Invalid decimal: ${input}`);
|
|
23
70
|
}
|
|
71
|
+
if (whole.length + frac.length === 0) {
|
|
72
|
+
throw new Error(`Invalid decimal: ${input}`);
|
|
73
|
+
}
|
|
24
74
|
const digits = `${whole}${frac}` || "0";
|
|
25
75
|
const int = BigInt(digits) * sign;
|
|
26
76
|
return { int, scale: frac.length };
|
|
@@ -136,11 +186,11 @@ export function powTs(a, exp, precision) {
|
|
|
136
186
|
let currentScale = base.scale;
|
|
137
187
|
let e = exp;
|
|
138
188
|
while (e > 0) {
|
|
139
|
-
if (e
|
|
189
|
+
if (e % 2 === 1) {
|
|
140
190
|
resultInt *= currentInt;
|
|
141
191
|
resultScale += currentScale;
|
|
142
192
|
}
|
|
143
|
-
e
|
|
193
|
+
e = Math.floor(e / 2);
|
|
144
194
|
if (e > 0) {
|
|
145
195
|
currentInt *= currentInt;
|
|
146
196
|
currentScale *= 2;
|
package/dist/math.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"math.js","sourceRoot":"","sources":["../src/math.ts"],"names":[],"mappings":"AAKA,MAAM,UAAU,YAAY,CAAC,KAAa;IACzC,
|
|
1
|
+
{"version":3,"file":"math.js","sourceRoot":"","sources":["../src/math.ts"],"names":[],"mappings":"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"}
|
package/dist/native.d.ts
CHANGED
|
@@ -5,8 +5,8 @@
|
|
|
5
5
|
* - **Browser**: loads the `.wasm` binary via the wasm-pack JS glue (async init on
|
|
6
6
|
* first module import via top-level await, then sync function calls)
|
|
7
7
|
*
|
|
8
|
-
* The
|
|
9
|
-
*
|
|
8
|
+
* The Decimal facade prefers this engine when available and falls back to the
|
|
9
|
+
* pure TypeScript BigInt implementation when unavailable.
|
|
10
10
|
*/
|
|
11
11
|
export interface NativeAtom {
|
|
12
12
|
add(a: string, b: string): string;
|
|
@@ -21,5 +21,6 @@ export interface NativeAtom {
|
|
|
21
21
|
/** Whether the native engine (NAPI or WASM) loaded successfully. */
|
|
22
22
|
export declare function isNativeAvailable(): boolean;
|
|
23
23
|
export declare function nativeAtom(): NativeAtom;
|
|
24
|
+
export declare function tryNativeAtom(): NativeAtom | undefined;
|
|
24
25
|
export declare function __overrideNativeForTesting(impl: NativeAtom | null | undefined): void;
|
|
25
26
|
//# sourceMappingURL=native.d.ts.map
|
package/dist/native.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"native.d.ts","sourceRoot":"","sources":["../src/native.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,MAAM,WAAW,UAAU;IAC1B,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAClC,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAClC,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAClC,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAAC;IACrD,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAClC,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAAC;IACvD,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAAC;IAC3C,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CAClC;AAgDD,oEAAoE;AACpE,wBAAgB,iBAAiB,IAAI,OAAO,CAI3C;AAED,wBAAgB,UAAU,IAAI,UAAU,CAmBvC;AAKD,wBAAgB,0BAA0B,CACzC,IAAI,EAAE,UAAU,GAAG,IAAI,GAAG,SAAS,GACjC,IAAI,CAEN"}
|
|
1
|
+
{"version":3,"file":"native.d.ts","sourceRoot":"","sources":["../src/native.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,MAAM,WAAW,UAAU;IAC1B,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAClC,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAClC,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAClC,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAAC;IACrD,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAClC,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAAC;IACvD,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAAC;IAC3C,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CAClC;AAgDD,oEAAoE;AACpE,wBAAgB,iBAAiB,IAAI,OAAO,CAI3C;AAED,wBAAgB,UAAU,IAAI,UAAU,CAmBvC;AAED,wBAAgB,aAAa,IAAI,UAAU,GAAG,SAAS,CAKtD;AAKD,wBAAgB,0BAA0B,CACzC,IAAI,EAAE,UAAU,GAAG,IAAI,GAAG,SAAS,GACjC,IAAI,CAEN"}
|
package/dist/native.js
CHANGED
|
@@ -5,8 +5,8 @@
|
|
|
5
5
|
* - **Browser**: loads the `.wasm` binary via the wasm-pack JS glue (async init on
|
|
6
6
|
* first module import via top-level await, then sync function calls)
|
|
7
7
|
*
|
|
8
|
-
* The
|
|
9
|
-
*
|
|
8
|
+
* The Decimal facade prefers this engine when available and falls back to the
|
|
9
|
+
* pure TypeScript BigInt implementation when unavailable.
|
|
10
10
|
*/
|
|
11
11
|
let native;
|
|
12
12
|
let loadError;
|
|
@@ -72,6 +72,12 @@ export function nativeAtom() {
|
|
|
72
72
|
}
|
|
73
73
|
return native;
|
|
74
74
|
}
|
|
75
|
+
export function tryNativeAtom() {
|
|
76
|
+
if (overrideNative !== undefined) {
|
|
77
|
+
return overrideNative ?? undefined;
|
|
78
|
+
}
|
|
79
|
+
return native;
|
|
80
|
+
}
|
|
75
81
|
// Test override (unchanged from before)
|
|
76
82
|
let overrideNative;
|
|
77
83
|
export function __overrideNativeForTesting(impl) {
|
package/dist/native.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"native.js","sourceRoot":"","sources":["../src/native.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAaH,IAAI,MAA8B,CAAC;AACnC,IAAI,SAAkB,CAAC;AAEvB,MAAM,MAAM,GACX,OAAO,UAAU,CAAC,OAAO,KAAK,WAAW;IACzC,OAAO,UAAU,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,KAAK,QAAQ,CAAC;AAEvD,IAAI,MAAM,EAAE,CAAC;IACZ,sCAAsC;IACtC,IAAI,CAAC;QACJ,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;QACtD,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC;QACpD,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,CAAC;QACnD,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,CAAC;QAExD,MAAM,WAAW,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACnD,MAAM,UAAU,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAE3D,MAAM,WAAW,GAA2B;YAC3C,WAAW,EAAE,eAAe;YAC5B,aAAa,EAAE,iBAAiB;YAChC,YAAY,EAAE,YAAY;YAC1B,cAAc,EAAE,cAAc;YAC9B,WAAW,EAAE,gBAAgB;SAC7B,CAAC;QAEF,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,QAAQ,IAAI,IAAI,EAAE,CAAC,CAAC;QAClD,IAAI,MAAM,EAAE,CAAC;YACZ,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,UAAU,EAAE,YAAY,MAAM,OAAO,CAAC,CAAC,CAAC;QACnE,CAAC;IACF,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACZ,SAAS,GAAG,CAAC,CAAC;IACf,CAAC;AACF,CAAC;KAAM,CAAC;IACP,yDAAyD;IACzD,IAAI,CAAC;QACJ,MAAM,IAAI,GAAqD,MAAM,MAAM,CAC1E,6BAA6B,CAC7B,CAAC;QACF,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;QACrB,MAAM,GAAG,IAAI,CAAC;IACf,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACZ,SAAS,GAAG,CAAC,CAAC;IACf,CAAC;AACF,CAAC;AAED,oEAAoE;AACpE,MAAM,UAAU,iBAAiB;IAChC,IAAI,cAAc,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAC1C,IAAI,cAAc,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IAC9C,OAAO,MAAM,KAAK,SAAS,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,UAAU;IACzB,IAAI,cAAc,KAAK,SAAS,EAAE,CAAC;QAClC,IAAI,cAAc,KAAK,IAAI,EAAE,CAAC;YAC7B,MAAM,IAAI,KAAK,CACd,gEAAgE,CAChE,CAAC;QACH,CAAC;QACD,OAAO,cAAc,CAAC;IACvB,CAAC;IACD,IAAI,CAAC,MAAM,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CACd,yDAAyD;YACxD,kBAAkB,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,IAAI;YACjD,aAAa,SAAS,IAAI,kBAAkB,IAAI;YAChD,qDAAqD;YACrD,sDAAsD,CACvD,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AACf,CAAC;AAED,wCAAwC;AACxC,IAAI,cAA6C,CAAC;AAElD,MAAM,UAAU,0BAA0B,CACzC,IAAmC;IAEnC,cAAc,GAAG,IAAI,CAAC;AACvB,CAAC"}
|
|
1
|
+
{"version":3,"file":"native.js","sourceRoot":"","sources":["../src/native.ts"],"names":[],"mappings":"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"}
|
package/index.darwin-arm64.node
CHANGED
|
Binary file
|
package/index.darwin-x64.node
CHANGED
|
Binary file
|
|
Binary file
|
package/index.linux-x64-gnu.node
CHANGED
|
Binary file
|
|
Binary file
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@c9up/atom",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.8",
|
|
4
4
|
"description": "Atom — exact decimal arithmetic for the Ream ecosystem (TypeScript + Rust N-API)",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -49,6 +49,7 @@
|
|
|
49
49
|
"test": "vitest run",
|
|
50
50
|
"test:rust": "cargo test -p atom-engine",
|
|
51
51
|
"test:napi": "node scripts/verify-napi.mjs",
|
|
52
|
+
"bench": "pnpm build && node scripts/bench.mjs",
|
|
52
53
|
"build:wasm": "wasm-pack build --target web crates/atom-engine-wasm --out-dir ../../wasm",
|
|
53
54
|
"lint": "biome check src/",
|
|
54
55
|
"test:coverage": "vitest run --coverage"
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { performance } from 'node:perf_hooks'
|
|
2
|
+
import { Decimal, sum } from '../dist/index.js'
|
|
3
|
+
|
|
4
|
+
const values = Array.from({ length: 10_000 }, (_, i) => `${i}.${i % 100}`)
|
|
5
|
+
|
|
6
|
+
function bench(name, iterations, fn) {
|
|
7
|
+
const start = performance.now()
|
|
8
|
+
let last
|
|
9
|
+
for (let i = 0; i < iterations; i++) {
|
|
10
|
+
last = fn(i)
|
|
11
|
+
}
|
|
12
|
+
const elapsedMs = performance.now() - start
|
|
13
|
+
const ops = Math.round((iterations / elapsedMs) * 1000)
|
|
14
|
+
console.log(`${name}: ${ops.toLocaleString('en-US')} ops/sec (${String(last)})`)
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
bench('Decimal.plus', 100_000, (i) =>
|
|
18
|
+
new Decimal(String(i)).plus('0.01').toString(),
|
|
19
|
+
)
|
|
20
|
+
bench('Decimal.times', 100_000, (i) =>
|
|
21
|
+
new Decimal(String(i)).times('1.075').toString(),
|
|
22
|
+
)
|
|
23
|
+
bench('Decimal.div', 50_000, (i) =>
|
|
24
|
+
new Decimal(String(i + 1)).div('3', { precision: 8 }).toString(),
|
|
25
|
+
)
|
|
26
|
+
bench('sum(10k)', 100, () => sum(values).toString())
|
package/scripts/verify-napi.mjs
CHANGED
|
@@ -28,7 +28,7 @@ if (!existsSync(binary)) {
|
|
|
28
28
|
const require2 = createRequire(import.meta.url)
|
|
29
29
|
const binding = require2(binary)
|
|
30
30
|
|
|
31
|
-
for (const fn of ['add', 'sub', 'mul', 'div', 'cmp']) {
|
|
31
|
+
for (const fn of ['add', 'sub', 'mul', 'div', 'rem', 'pow', 'sqrt', 'cmp']) {
|
|
32
32
|
if (typeof binding[fn] !== 'function') {
|
|
33
33
|
throw new Error(`[atom:napi] invalid exports: missing ${fn}()`)
|
|
34
34
|
}
|
|
@@ -43,5 +43,14 @@ if (binding.mul('2.5', '2') !== '5') {
|
|
|
43
43
|
if (binding.cmp('1.20', '1.2') !== 0) {
|
|
44
44
|
throw new Error('[atom:napi] cmp smoke test failed')
|
|
45
45
|
}
|
|
46
|
+
if (binding.rem('10.5', '3') !== '1.5') {
|
|
47
|
+
throw new Error('[atom:napi] rem smoke test failed')
|
|
48
|
+
}
|
|
49
|
+
if (binding.pow('2', -2, 18) !== '0.25') {
|
|
50
|
+
throw new Error('[atom:napi] pow smoke test failed')
|
|
51
|
+
}
|
|
52
|
+
if (binding.sqrt('2', 6) !== '1.414213') {
|
|
53
|
+
throw new Error('[atom:napi] sqrt smoke test failed')
|
|
54
|
+
}
|
|
46
55
|
|
|
47
56
|
console.log('[atom:napi] smoke test passed')
|
package/scripts/verify-wasm.mjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { existsSync, statSync } from 'node:fs'
|
|
1
|
+
import { existsSync, readFileSync, statSync } from 'node:fs'
|
|
2
2
|
import { dirname, join } from 'node:path'
|
|
3
|
-
import { fileURLToPath } from 'node:url'
|
|
3
|
+
import { fileURLToPath, pathToFileURL } from 'node:url'
|
|
4
4
|
|
|
5
5
|
// Publish-time gate: the `wasm-pack build --target web` output (JS glue + the
|
|
6
6
|
// binary) MUST be in the package. Without it the browser loader
|
|
@@ -24,4 +24,33 @@ for (const name of required) {
|
|
|
24
24
|
}
|
|
25
25
|
}
|
|
26
26
|
|
|
27
|
-
|
|
27
|
+
const wasm = await import(pathToFileURL(join(wasmDir, 'atom_engine_wasm.js')).href)
|
|
28
|
+
// Hand the binary over as BYTES. Called with no argument, the wasm-bindgen
|
|
29
|
+
// `--target web` glue defaults to `new URL('..._bg.wasm', import.meta.url)` and
|
|
30
|
+
// fetches it — and Node's fetch refuses a `file:` URL ("not implemented...
|
|
31
|
+
// yet..."), so this gate died on the very artifact it was verifying. Bytes skip
|
|
32
|
+
// the fetch branch entirely and go straight to WebAssembly.instantiate.
|
|
33
|
+
await wasm.default({
|
|
34
|
+
module_or_path: readFileSync(join(wasmDir, 'atom_engine_wasm_bg.wasm')),
|
|
35
|
+
})
|
|
36
|
+
|
|
37
|
+
for (const fn of ['add', 'sub', 'mul', 'div', 'rem', 'pow', 'sqrt', 'cmp']) {
|
|
38
|
+
if (typeof wasm[fn] !== 'function') {
|
|
39
|
+
throw new Error(`[atom:wasm] invalid exports: missing ${fn}()`)
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
if (wasm.add('1.2', '3.4') !== '4.6') {
|
|
44
|
+
throw new Error('[atom:wasm] add smoke test failed')
|
|
45
|
+
}
|
|
46
|
+
if (wasm.pow('2', -2, 18) !== '0.25') {
|
|
47
|
+
throw new Error('[atom:wasm] pow smoke test failed')
|
|
48
|
+
}
|
|
49
|
+
if (wasm.sqrt('2', 6) !== '1.414213') {
|
|
50
|
+
throw new Error('[atom:wasm] sqrt smoke test failed')
|
|
51
|
+
}
|
|
52
|
+
if (wasm.cmp('1.20', '1.2') !== 0) {
|
|
53
|
+
throw new Error('[atom:wasm] cmp smoke test failed')
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
console.log('[atom:wasm] browser artifacts present and functional')
|