Demo refresh

This commit is contained in:
SheetJS 2026-03-09 00:32:12 -04:00
parent 7bb2ddcaea
commit f5aabe0c29
46 changed files with 690 additions and 138 deletions

@ -124,9 +124,9 @@ This demo was last tested in the following deployments:
| `darwin-x64` | `1.3.6` | 2026-01-20 |
| `darwin-arm` | `1.3.6` | 2026-01-19 |
| `win11-x64` | `1.3.6` | 2026-01-28 |
| `win11-arm` | `1.2.3` | 2025-02-23 |
| `win11-arm` | `1.3.10` | 2026-03-07 |
| `linux-x64` | `1.3.6` | 2026-01-18 |
| `linux-arm` | `1.2.2` | 2025-02-16 |
| `linux-arm` | `1.3.10` | 2026-03-07 |
BunJS on Windows on ARM uses the X64 compatibility layer.

@ -40,12 +40,12 @@ This demo was tested in the following deployments:
| Architecture | JS Engine | Pandas | Python | Date |
|:-------------|:----------------|:-------|:-------|:-----------|
| `darwin-x64` | Duktape `2.7.0` | 2.2.3 | 3.13.1 | 2025-03-31 |
| `darwin-x64` | Duktape `2.7.0` | 3.0.1 | 3.13.7 | 2026-03-07 |
| `darwin-arm` | Duktape `2.7.0` | 2.3.3 | 3.9.6 | 2026-01-25 |
| `win11-x64` | Duktape `2.7.0` | 2.2.3 | 3.11.9 | 2025-04-28 |
| `win11-arm` | Duktape `2.7.0` | 2.2.3 | 3.13.2 | 2025-02-23 |
| `linux-x64` | Duktape `2.7.0` | 2.1.4 | 3.12.3 | 2025-06-16 |
| `linux-arm` | Duktape `2.7.0` | 1.5.3 | 3.11.2 | 2025-02-16 |
| `win11-x64` | Duktape `2.7.0` | 3.0.1 | 3.11.9 | 2026-03-08 |
| `win11-arm` | Duktape `2.7.0` | 2.2.3 | 3.11.5 | 2026-03-07 |
| `linux-x64` | Duktape `2.7.0` | 3.0.1 | 3.13.9 | 2026-03-07 |
| `linux-arm` | Duktape `2.7.0` | 2.2.3 | 3.13.5 | 2026-03-07 |
:::
@ -544,12 +544,12 @@ This demo was tested in the following deployments:
| Architecture | JS Engine | Polars | Python | Date |
|:-------------|:----------------|:-------|:-------|:-----------|
| `darwin-x64` | Duktape `2.7.0` | 1.26.0 | 3.13.1 | 2025-03-31 |
| `darwin-x64` | Duktape `2.7.0` | 1.38.1 | 3.13.7 | 2026-03-07 |
| `darwin-arm` | Duktape `2.7.0` | 1.36.1 | 3.9.6 | 2026-01-25 |
| `win11-x64` | Duktape `2.7.0` | 1.28.1 | 3.11.9 | 2025-04-28 |
| `win11-arm` | Duktape `2.7.0` | 1.23.0 | 3.13.2 | 2025-02-23 |
| `linux-x64` | Duktape `2.7.0` | 1.30.0 | 3.12.3 | 2025-06-16 |
| `linux-arm` | Duktape `2.7.0` | 1.22.0 | 3.11.2 | 2025-02-16 |
| `win11-x64` | Duktape `2.7.0` | 1.38.1 | 3.11.9 | 2026-03-08 |
| `win11-arm` | Duktape `2.7.0` | 1.23.0 | 3.11.5 | 2026-03-07 |
| `linux-x64` | Duktape `2.7.0` | 1.38.1 | 3.13.9 | 2026-03-07 |
| `linux-arm` | Duktape `2.7.0` | 1.38.1 | 3.13.5 | 2026-03-07 |
:::

@ -295,8 +295,8 @@ This demo was tested in the following deployments:
| Architecture | Date |
|:-------------|:-----------|
| `darwin-x64` | 2025-04-17 |
| `darwin-arm` | 2025-04-24 |
| `darwin-x64` | 2026-03-07 |
| `darwin-arm` | 2026-03-07 |
| `win11-x64` | 2025-04-17 |
| `win11-arm` | 2025-04-24 |

@ -211,8 +211,8 @@ This demo was tested in the following environments:
| KnockoutJS | Date | Live Demo |
|:-----------|:-----------|:-----------------------------------------------|
| `3.5.0` | 2025-01-08 | [**KO3**](pathname:///knockout/knockout3.html) |
| `2.3.0` | 2025-01-08 | [**KO2**](pathname:///knockout/knockout2.html) |
| `3.5.0` | 2026-03-06 | [**KO3**](pathname:///knockout/knockout3.html) |
| `2.3.0` | 2026-03-06 | [**KO2**](pathname:///knockout/knockout2.html) |
:::

@ -333,9 +333,9 @@ This demo was tested in the following environments:
| Architecture | PhantomJS | Date |
|:-------------|:----------|:-----------|
| `darwin-x64` | `2.1.1` | 2025-03-31 |
| `win11-x64` | `2.1.1` | 2025-06-18 |
| `linux-x64` | `2.1.1` | 2025-06-16 |
| `darwin-x64` | `2.1.1` | 2026-03-07 |
| `win11-x64` | `2.1.1` | 2026-03-07 |
| `linux-x64` | `2.1.1` | 2026-03-07 |
:::

@ -374,12 +374,12 @@ This demo was tested in the following deployments:
| Architecture | DenoDOM | Deno | Date |
|:-------------|:--------|:-------|:-----------|
| `darwin-x64` | 0.1.48 | 2.2.6 | 2025-03-31 |
| `darwin-x64` | 0.1.48 | 2.7.4 | 2026-03-07 |
| `darwin-arm` | 0.1.48 | 2.2.12 | 2025-04-24 |
| `win11-x64` | 0.1.48 | 2.2.12 | 2025-04-28 |
| `win11-arm` | 0.1.48 | 2.2.1 | 2025-02-23 |
| `linux-x64` | 0.1.48 | 2.3.6 | 2025-06-16 |
| `linux-arm` | 0.1.48 | 2.1.10 | 2025-02-16 |
| `linux-x64` | 0.1.48 | 2.7.4 | 2026-03-07 |
| `linux-arm` | 0.1.48 | 2.7.4 | 2026-03-07 |
:::

@ -238,7 +238,7 @@ This demo was tested in the following environments:
| OS and Version | Architecture | Electron | Date |
|:---------------|:-------------|:---------|:-----------|
| macOS 15.3 | `darwin-x64` | `35.1.2` | 2025-03-31 |
| macOS 15.7.4 | `darwin-x64` | `40.8.0` | 2026-03-08 |
| macOS 14.5 | `darwin-arm` | `35.1.2` | 2025-08-30 |
| Windows 11 | `win11-x64` | `33.2.1` | 2025-02-11 |
| Windows 11 | `win11-arm` | `33.2.1` | 2025-02-23 |

@ -38,11 +38,11 @@ This demo was tested in the following deployments:
| Architecture | Version | NodeJS | Source | Date |
|:-------------|:---------------|:----------|:----------|:-----------|
| `darwin-x64` | `5.0.0-beta.4` | `14.15.3` | Pre-built | 2026-01-21 |
| `darwin-arm` | `5.0.0-beta.4` | `22.14.0` | Compiled | 2025-06-18 |
| `win11-x64` | `5.0.0-beta.4` | `14.15.3` | Pre-built | 2025-05-07 |
| `darwin-arm` | `5.0.0-beta.4` | `20.18.0` | Compiled | 2026-03-07 |
| `win11-x64` | `5.0.0-beta.4` | `14.15.3` | Pre-built | 2026-03-08 |
| `win11-arm` | `4.0.0-rc.6` | `22.14.0` | Compiled | 2025-02-23 |
| `linux-x64` | `5.0.0-beta.4` | `14.15.3` | Pre-built | 2026-01-18 |
| `linux-arm` | `4.0.0-rc.6` | `22.13.0` | Compiled | 2025-02-15 |
| `linux-arm` | `5.0.0-beta.4` | `24.14.0` | Compiled | 2026-03-07 |
:::

@ -38,11 +38,11 @@ This demo was tested in the following deployments:
| Architecture | Version | NodeJS | Date |
|:-------------|:--------|:---------|:-----------|
| `darwin-x64` | `5.8.1` | `18.5.0` | 2026-01-21 |
| `darwin-arm` | `5.8.1` | `18.5.0` | 2025-06-18 |
| `win11-x64` | `5.8.1` | `18.5.0` | 2025-05-07 |
| `darwin-arm` | `5.8.1` | `18.5.0` | 2026-03-07 |
| `win11-x64` | `5.8.1` | `18.5.0` | 2026-03-08 |
| `win11-arm` | `5.8.1` | `18.5.0` | 2025-02-23 |
| `linux-x64` | `5.8.1` | `18.5.0` | 2026-01-18 |
| `linux-arm` | `5.8.1` | `18.5.0` | 2025-02-15 |
| `linux-arm` | `5.8.1` | `18.5.0` | 2026-03-07 |
:::

@ -30,10 +30,10 @@ This demo was tested in the following deployments:
| Architecture | Version | NodeJS | Date |
|:-------------|:--------|:----------|:-----------|
| `darwin-x64` | `2.4.4` | `23.11.0` | 2025-04-21 |
| `darwin-x64` | `3.0.0` | `25.8.0` | 2026-03-08 |
| `darwin-arm` | `2.4.4` | `23.11.0` | 2025-06-18 |
| `win11-x64` | `2.4.4` | `16.20.2` | 2025-05-07 |
| `linux-x64` | `2.4.4` | `23.11.0` | 2025-04-21 |
| `linux-x64` | `3.0.0` | `25.8.0` | 2026-03-08 |
| `linux-arm` | `2.4.4` | `23.8.0` | 2025-02-15 |
:::

@ -160,10 +160,10 @@ This demo was tested in the following deployments:
|:-------------|:----------|:-----------|
| `darwin-x64` | `24.13.0` | 2026-01-21 |
| `darwin-arm` | `24.2.0` | 2025-06-18 |
| `win11-x64` | `24.2.0` | 2025-06-17 |
| `win11-x64` | `24.13.0` | 2026-03-08 |
| `win11-arm` | `22.14.0` | 2025-02-23 |
| `linux-x64` | `24.2.0` | 2025-06-16 |
| `linux-arm` | `22.13.0` | 2025-02-16 |
| `linux-x64` | `24.11.0` | 2026-03-08 |
| `linux-arm` | `24.14.0` | 2026-03-07 |
:::

@ -80,11 +80,11 @@ This demo was last tested in the following deployments:
| Architecture | BunJS | Date |
|:-------------|:---------|:-----------|
| `darwin-x64` | `1.3.6` | 2026-01-21 |
| `darwin-arm` | `1.2.16` | 2025-06-18 |
| `win11-x64` | `1.2.13` | 2025-05-07 |
| `darwin-arm` | `1.3.10` | 2026-03-07 |
| `win11-x64` | `1.3.10` | 2026-03-08 |
| `win11-arm` | `1.2.3` | 2025-02-23 |
| `linux-x64` | `1.2.16` | 2025-06-16 |
| `linux-arm` | `1.2.2` | 2025-02-16 |
| `linux-x64` | `1.3.10` | 2026-03-08 |
| `linux-arm` | `1.3.10` | 2026-03-07 |
:::

@ -103,11 +103,11 @@ This demo was last tested in the following deployments:
| Architecture | Deno | Date |
|:-------------|:---------|:-----------|
| `darwin-x64` | `2.6.5` | 2026-01-21 |
| `darwin-arm` | `2.3.6` | 2025-06-18 |
| `win11-x64` | `2.3.6` | 2025-06-17 |
| `darwin-arm` | `2.7.4` | 2026-03-07 |
| `win11-x64` | `2.7.4` | 2026-03-08 |
| `win11-arm` | `2.2.1` | 2025-02-23 |
| `linux-x64` | `2.3.6` | 2025-06-16 |
| `linux-arm` | `2.1.10` | 2025-02-15 |
| `linux-x64` | `2.7.4` | 2026-03-08 |
| `linux-arm` | `2.7.4` | 2026-03-07 |
:::

@ -92,7 +92,7 @@ This demo was tested in the following deployments:
|:-------------|:----------|:----------|:-----------|
| `darwin-x64` | `24.12.0` | `793dd9d` | 2026-01-21 |
| `darwin-arm` | `24.12.0` | `793dd9d` | 2026-01-18 |
| `win11-x64` | `24.12.0` | | 2025-04-19 |
| `win11-x64` | `24.12.0` | | 2026-03-08 |
| `win11-arm` | `24.12.0` | | 2025-04-19 |
| `linux-x64` | `24.12.0` | `65e5595` | 2026-01-18 |
| `linux-arm` | `24.12.0` | `65e5595` | 2026-01-21 |

@ -69,7 +69,7 @@ imported from any script in the extension.
The SheetJS NodeJS module must be installed as a development dependency. If the
module is installed as a normal dependency, the `vsce`[^3] command-line tool
will fail to package or publish the exxtension.
will fail to package or publish the extension.
<Tabs groupId="pm">
<TabItem value="npm" label="npm">

@ -129,11 +129,11 @@ This demo was tested in the following deployments:
| Architecture | Version | Date |
|:-------------|:--------|:-----------|
| `darwin-x64` | `2.7.0` | 2026-01-21 |
| `darwin-arm` | `2.7.0` | 2025-09-03 |
| `darwin-arm` | `2.7.0` | 2026-03-07 |
| `win11-x64` | `2.7.0` | 2025-04-28 |
| `win11-arm` | `2.7.0` | 2025-02-23 |
| `linux-x64` | `2.7.0` | 2025-04-21 |
| `linux-arm` | `2.7.0` | 2025-02-15 |
| `linux-arm` | `2.7.0` | 2026-03-07 |
:::
@ -409,7 +409,7 @@ This demo was tested in the following deployments:
| `darwin-x64` | `2.7.0` | `8.4.11` | 2026-01-21 |
| `darwin-arm` | `2.7.0` | `8.4.8` | 2026-01-23 |
| `linux-x64` | `2.7.0` | `8.3.6` | 2025-04-21 |
| `linux-arm` | `2.7.0` | `8.2.26` | 2025-02-15 |
| `linux-arm` | `2.7.0` | `8.4.16` | 2026-03-07 |
:::
@ -553,7 +553,7 @@ This demo was tested in the following deployments:
| `win11-x64` | `2.7.0` | `3.11.9` | 2026-02-02 |
| `win11-arm` | `2.7.0` | `3.11.9` | 2026-02-02 |
| `linux-x64` | `2.7.0` | `3.12.3` | 2025-04-21 |
| `linux-arm` | `2.7.0` | `3.11.2` | 2025-02-15 |
| `linux-arm` | `2.7.0` | `3.13.5` | 2026-03-07 |
:::
@ -911,7 +911,7 @@ This demo was tested in the following deployments:
| `win11-x64` | `2.7.0` | `0.14.0` | 2025-04-28 |
| `win11-arm` | `2.7.0` | `0.13.0` | 2025-02-23 |
| `linux-x64` | `2.7.0` | `0.14.0` | 2025-04-21 |
| `linux-arm` | `2.7.0` | `0.13.0` | 2025-02-15 |
| `linux-arm` | `2.7.0` | `0.15.2` | 2026-03-07 |
On Windows, due to incompatibilities between WSL and PowerShell, some commands
must be run in WSL Bash.
@ -960,9 +960,9 @@ tar -xf zig-linux-*.tar
For AArch64 Linux:
```bash
curl -LO https://ziglang.org/download/0.13.0/zig-linux-aarch64-0.13.0.tar.xz
xz -d zig-linux-*.tar.xz
tar -xf zig-linux-*.tar
curl -LO https://ziglang.org/download/0.15.2/zig-aarch64-linux-0.15.2.tar.xz
xz -d zig-*.tar.xz
tar -xf zig-*.tar
```
</TabItem>
@ -1140,9 +1140,9 @@ This demo was tested in the following deployments:
| Architecture | Version | Date |
|:-------------|:--------|:-----------|
| `darwin-x64` | `2.2.0` | 2026-01-21 |
| `darwin-arm` | `2.2.0` | 2026-01-23 |
| `darwin-arm` | `2.2.0` | 2026-03-07 |
| `linux-x64` | `2.2.0` | 2025-04-21 |
| `linux-arm` | `2.2.0` | 2025-02-15 |
| `linux-arm` | `2.2.0` | 2026-03-07 |
:::
@ -1235,11 +1235,11 @@ This demo was tested in the following deployments:
| Architecture | Version | Date |
|:-------------|:--------|:-----------|
| `darwin-x64` | `2.2.1` | 2026-01-21 |
| `darwin-arm` | `2.2.1` | 2026-01-23 |
| `darwin-arm` | `2.2.1` | 2026-03-07 |
| `win11-x64` | `2.2.1` | 2026-02-02 |
| `win11-arm` | `2.2.1` | 2026-02-02 |
| `linux-x64` | `2.2.1` | 2026-01-08 |
| `linux-arm` | `2.2.1` | 2025-04-18 |
| `linux-arm` | `2.2.1` | 2026-03-07 |
:::

@ -1096,12 +1096,12 @@ This demo was last tested in the following deployments:
| Architecture | V8 Crate | Date |
|:-------------|:----------|:-----------|
| `darwin-x64` | `136.0.0` | 2025-04-21 |
| `darwin-x64` | `146.3.0` | 2026-03-08 |
| `darwin-arm` | `134.3.0` | 2025-02-13 |
| `win11-x64` | `137.1.0` | 2025-05-11 |
| `win11-arm` | `145.0.0` | 2026-02-02 |
| `linux-x64` | `142.2.0` | 2026-01-08 |
| `linux-arm` | `134.4.0` | 2025-02-15 |
| `linux-arm` | `146.3.0` | 2026-03-07 |
:::
@ -1445,12 +1445,12 @@ This demo was last tested in the following deployments:
| Architecture | V8 Version | Date |
|:-------------|:--------------|:-----------|
| `darwin-x64` | `13.3.415.23` | 2025-03-31 |
| `darwin-arm` | `13.3.415.23` | 2025-03-31 |
| `darwin-x64` | `13.3.415.23` | 2026-03-06 |
| `darwin-arm` | `13.3.415.23` | 2026-03-06 |
| `win11-x64` | `13.3.415.23` | 2025-05-11 |
| `win11-arm` | `12.3.219.12` | 2025-02-23 |
| `linux-x64` | `12.3.219.12` | 2025-06-16 |
| `linux-arm` | `12.3.219.12` | 2025-02-16 |
| `linux-x64` | `12.3.219.12` | 2026-03-06 |
| `linux-arm` | `13.3.415.23` | 2026-03-07 |
:::
@ -1738,11 +1738,11 @@ This demo was last tested in the following deployments:
| Architecture | V8 Version | Crate | Date |
|:-------------|:--------------|:----------|:-----------|
| `darwin-x64` | `13.5.212.10` | `136.0.0` | 2025-04-21 |
| `darwin-x64` | `13.5.212.10` | `136.0.0` | 2026-03-08 |
| `darwin-arm` | `13.5.212.10` | `136.0.0` | 2025-04-24 |
| `win11-x64` | `13.5.212.10` | `136.0.0` | 2025-05-11 |
| `linux-x64` | `13.5.212.10` | `136.0.0` | 2025-06-16 |
| `linux-arm` | `13.4.114.9` | `134.4.0` | 2025-02-15 |
| `linux-arm` | `13.5.212.10` | `136.0.0` | 2026-03-07 |
:::

@ -168,7 +168,7 @@ This demo was tested in the following deployments:
| `win11-x64` | `4.2.2` | 2026-04-28 |
| `win11-arm` | `4.2.0` | 2025-02-23 |
| `linux-x64` | `4.2.2` | 2025-06-16 |
| `linux-arm` | `4.2.0` | 2025-02-15 |
| `linux-arm` | `4.5.0` | 2026-03-07 |
:::

@ -106,11 +106,11 @@ This demo was tested in the following deployments:
| Architecture | Git Commit | Go version | Date |
|:-------------|:-----------|:-----------|:-----------|
| `darwin-x64` | `651366f` | `1.25.6` | 2026-01-21 |
| `darwin-arm` | `cb187b0` | `1.24.0` | 2025-06-18 |
| `win11-x64` | `bcd7cc6` | `1.24.2` | 2025-04-28 |
| `darwin-arm` | `6a7976c` | `1.24.0` | 2026-03-07 |
| `win11-x64` | `6a7976c` | `1.24.2` | 2026-03-08 |
| `win11-arm` | `5ef83b8` | `1.24.0` | 2025-02-23 |
| `linux-x64` | `cb187b0` | `1.22.2` | 2025-06-16 |
| `linux-arm` | `5ef83b8` | `1.19.8` | 2025-02-15 |
| `linux-arm` | `6a7976c` | `1.24.4` | 2026-03-07 |
At the time of writing, Goja did not have proper version numbers. Versions are
identified by Git commit hashes.

@ -264,11 +264,11 @@ This demo was tested in the following deployments:
| Architecture | Library | Git Commit | Date |
|:-------------|:-----------|:-----------|:-----------|
| `darwin-x64` | QuickJS | `f113949` | 2026-01-21 |
| `darwin-arm` | QuickJS | `3306254` | 2025-09-03 |
| `win11-x64` | QuickJS-NG | `865ba1f` | 2025-04-18 |
| `darwin-arm` | QuickJS | `f113949` | 2026-03-07 |
| `win11-x64` | QuickJS-NG | `4951c83` | 2025-04-18 |
| `win11-arm` | QuickJS-NG | `865ba1f` | 2025-04-18 |
| `linux-x64` | QuickJS | `3306254` | 2025-06-18 |
| `linux-arm` | QuickJS | `6e2e68f` | 2025-02-15 |
| `linux-x64` | QuickJS | `f113949` | 2026-03-08 |
| `linux-arm` | QuickJS | `f113949` | 2026-03-07 |
When the demo was tested, `f113949` was the HEAD commit on the `master` branch.
@ -369,7 +369,7 @@ cd sheetjs-quick
```bash
git clone https://github.com/quickjs-ng/quickjs
cd quickjs
git checkout 865ba1f1
git checkout 4951c83
cmake -B build -DQJS_BUILD_EXAMPLES=ON
cmake --build build --config Release
build\Release\qjs.exe amalgam.js
@ -386,7 +386,7 @@ copy quickjs\quickjs.h .
3) Download [`sheetjs.quick.c`](pathname:///quickjs/sheetjs.quick.c):
```bash
curl -LO https://docs.sheetjs.com/quickjs/sheetjs.quick.c
curl.exe -LO https://docs.sheetjs.com/quickjs/sheetjs.quick.c
```
4) Build the sample application:
@ -406,8 +406,8 @@ the project directory:
</ul>
<CodeBlock language="bash">{`\
curl -LO https://cdn.sheetjs.com/xlsx-${current}/package/dist/xlsx.full.min.js
curl -LO https://docs.sheetjs.com/pres.numbers`}
curl.exe -LO https://cdn.sheetjs.com/xlsx-${current}/package/dist/xlsx.full.min.js
curl.exe -LO https://docs.sheetjs.com/pres.numbers`}
</CodeBlock>
6) Run the test program:

@ -364,10 +364,10 @@ This demo was tested in the following deployments:
| Architecture | Git Commit | Date |
|:-------------|:-----------|:-----------|
| `darwin-x64` | `8ef11b4` | 2025-03-31 |
| `darwin-x64` | `f45c6bc` | 2026-03-06 |
| `darwin-arm` | `f45c6bc` | 2026-01-23 |
| `linux-x64` | `8ef11b4` | 2025-04-21 |
| `linux-arm` | `388376f` | 2025-02-15 |
| `linux-arm` | `f45c6bc` | 2026-03-07 |
The main Hermes source tree does not have Windows support. The `hermes-windows`
fork, which powers React Native for Windows, does have built-in support[^5]
@ -853,12 +853,12 @@ This demo was tested in the following deployments:
| Architecture | Hermes | Date |
|:-------------|:---------|:-----------|
| `darwin-x64` | `0.13.0` | 2025-03-31 |
| `darwin-arm` | `0.13.0` | 2026-01-23 |
| `darwin-x64` | `0.13.0` | 2026-03-06 |
| `darwin-arm` | `0.13.0` | 2026-03-06 |
| `win11-x64` | `0.13.0` | 2025-04-28 |
| `win11-arm` | `0.13.0` | 2025-02-23 |
| `linux-x64` | `0.13.0` | 2025-04-21 |
| `linux-arm` | `0.13.0` | 2026-01-10 |
| `linux-arm` | `0.13.0` | 2026-03-07 |
When this demo was last tested, `jsvu` did not install a native `linux-arm`
binary. Nevertheless, the process was tested using `qemu-user` to simulate the

@ -88,11 +88,11 @@ This demo was tested in the following deployments:
| Platform | Ruby | ExecJS | Date |
|:-------------|:---------|:---------|:-----------|
| `darwin-x64` | `2.6.10` | `2.10.0` | 2026-01-21 |
| `darwin-arm` | `2.6.10` | `2.10.0` | 2025-09-03 |
| `darwin-arm` | `2.6.10` | `2.10.0` | 2026-03-07 |
| `win11-x64` | `3.3.8` | `2.10.0` | 2025-04-28 |
| `win11-arm` | `3.2.3` | `2.10.0` | 2025-02-23 |
| `linux-x64` | `3.2.3` | `2.10.0` | 2025-04-21 |
| `linux-arm` | `3.1.2` | `2.10.0` | 2025-02-15 |
| `linux-x64` | `3.3.8` | `2.10.0` | 2026-03-08 |
| `linux-arm` | `3.3.8` | `2.10.0` | 2026-03-07 |
When the demo was last tested, there was no official Ruby release for Windows
on ARM. The `win11-arm` test was run in WSL.

@ -132,10 +132,10 @@ This demo was tested in the following deployments:
| Architecture | Git Commit | Date |
|:-------------|:-----------|:-----------|
| `darwin-x64` | `792ee76` | 2026-01-20 |
| `darwin-arm` | `792ee76` | 2026-01-20 |
| `darwin-arm` | `792ee76` | 2026-03-08 |
| `win11-x64` | `36becec` | 2025-04-28 |
| `win11-arm` | `e26c81f` | 2025-02-23 |
| `linux-x64` | `36becec` | 2025-06-18 |
| `linux-x64` | `792ee76` | 2026-03-08 |
| `linux-arm` | `792ee76` | 2026-01-10 |
:::
@ -233,7 +233,7 @@ This was fixed with a local symlink to the `icu4c` folder before the build step:
cd ChakraCore
mkdir -p usr/local/opt
ln -s /opt/homebrew/opt/icu4c usr/local/opt/icu4c
./build.sh --static --icu=/usr/local/opt/icu4c/include --test-build -j=8 --system-icu --no-jit
./build.sh --static --icu=usr/local/opt/icu4c/include --test-build -j=8 --system-icu --no-jit
cd ..
```

@ -106,11 +106,11 @@ This demo was tested in the following deployments:
| Architecture | Boa | Date |
|:-------------|:---------|:-----------|
| `darwin-x64` | `0.20.1` | 2026-01-21 |
| `darwin-arm` | `0.20.0` | 2025-09-03 |
| `darwin-arm` | `0.21.0` | 2026-03-07 |
| `win11-x64` | `0.20.0` | 2025-04-28 |
| `win11-arm` | `0.20.0` | 2025-02-23 |
| `linux-x64` | `0.21.0` | 2026-01-08 |
| `linux-arm` | `0.20.0` | 2025-02-15 |
| `linux-arm` | `0.21.0` | 2026-03-07 |
:::

@ -130,11 +130,11 @@ This demo was tested in the following deployments:
| Architecture | Version | Date |
|:-------------|:--------|:-----------|
| `darwin-x64` | `0.066` | 2026-01-21 |
| `darwin-arm` | `0.066` | 2025-09-03 |
| `darwin-arm` | `0.066` | 2026-03-07 |
| `win11-x64` | `0.066` | 2026-01-10 |
| `win11-arm` | `0.066` | 2026-01-10 |
| `linux-x64` | `0.066` | 2025-06-16 |
| `linux-arm` | `0.066` | 2025-02-15 |
| `linux-x64` | `0.066` | 2026-03-07 |
| `linux-arm` | `0.066` | 2026-03-07 |
The Windows tests were run in WSL.

@ -37,11 +37,11 @@ This demo was tested in the following environments:
| Architecture | Commit | Date |
|:-------------|:----------|:-----------|
| `darwin-x64` | `b706935` | 2026-01-21 |
| `darwin-arm` | `355ab24` | 2025-09-03 |
| `darwin-arm` | `b706935` | 2026-03-07 |
| `win11-x64` | `5020015` | 2025-04-23 |
| `win11-arm` | `5020015` | 2025-02-23 |
| `linux-x64` | `5020015` | 2025-04-21 |
| `linux-arm` | `5020015` | 2025-02-15 |
| `linux-x64` | `b706935` | 2026-03-07 |
| `linux-arm` | `b706935` | 2026-03-07 |
The Windows tests were run in WSL.
@ -366,6 +366,18 @@ python3 tools/build.py --error-messages=ON --logging=ON --mem-heap=8192 --cpoint
cd ..
```
:::caution pass
In some tests, the build step failed with compiler warnings treated as errors.
The flags `-Wno-error` and `-Wno-unterminated-string-initialization` should be
added to the build:
```bash
python3 tools/build.py --error-messages=ON --logging=ON --mem-heap=8192 --cpointer-32bit=ON --compile-flag="-Wno-error" --compile-flag="-Wno-unterminated-string-initialization"
```
:::
3) Download the SheetJS Standalone script, shim script and test file. Move all
three files to the `SheetJSJerry` directory:

@ -324,9 +324,9 @@ This demo was tested in the following deployments:
|:-------------|:--------|:-----------|
| `darwin-x64` | `1.3.8` | 2026-01-20 |
| `darwin-arm` | `1.3.8` | 2026-01-20 |
| `win11-x64` | `1.3.6` | 2025-04-23 |
| `win11-x64` | `1.3.8` | 2026-03-08 |
| `win11-arm` | `1.3.5` | 2025-02-23 |
| `linux-x64` | `1.3.6` | 2025-06-16 |
| `linux-x64` | `1.3.8` | 2026-03-07 |
| `linux-arm` | `1.3.8` | 2026-01-10 |
:::

@ -177,11 +177,11 @@ This demo was tested in the following deployments:
| Architecture | Jurassic | Date |
|:-------------|:---------|:-----------|
| `darwin-x64` | `3.2.9` | 2026-01-21 |
| `darwin-arm` | `3.2.9` | 2025-09-03 |
| `darwin-arm` | `3.2.9` | 2026-03-07 |
| `win11-x64` | `3.2.9` | 2025-04-23 |
| `win11-arm` | `3.2.9` | 2025-02-23 |
| `linux-x64` | `3.2.9` | 2025-06-16 |
| `linux-arm` | `3.2.9` | 2025-02-15 |
| `linux-x64` | `3.2.9` | 2026-03-07 |
| `linux-arm` | `3.2.9` | 2026-03-07 |
:::

@ -46,7 +46,7 @@ These instructions were tested on the following platforms:
| MacOS 15.6 (x64) | `darwin-x64` | 2026-01-21 |
| MacOS 15.7 (ARM64) | `darwin-arm` | 2026-02-02 |
| Windows 11 (x64) + WSL Ubuntu | `win11-x64` | 2025-06-20 |
| Windows 11 (ARM) + WSL Ubuntu | `win11-arm` | 2025-02-23 |
| Windows 11 (ARM) + WSL Ubuntu | `win11-arm` | 2026-03-08 |
With some additional dependencies, the unminified scripts are reproducible and
tests will pass in Windows XP with NodeJS 5.10.0.

@ -6,7 +6,7 @@
"version": "0.0.0",
"main": "main.js",
"dependencies": {
"@electron/remote": "2.1.2",
"@electron/remote": "2.1.3",
"xlsx": "https://sheet.lol/balls/xlsx-0.20.3.tgz"
},
"scripts": {
@ -15,12 +15,12 @@
"make": "electron-forge make"
},
"devDependencies": {
"@electron-forge/cli": "7.8.0",
"@electron-forge/maker-deb": "7.8.0",
"@electron-forge/maker-rpm": "7.8.0",
"@electron-forge/maker-squirrel": "7.8.0",
"@electron-forge/maker-zip": "7.8.0",
"electron": "35.1.2"
"@electron-forge/cli": "7.11.1",
"@electron-forge/maker-deb": "7.11.1",
"@electron-forge/maker-rpm": "7.11.1",
"@electron-forge/maker-squirrel": "7.11.1",
"@electron-forge/maker-zip": "7.11.1",
"electron": "40.8.0"
},
"config": {
"forge": {

@ -45,8 +45,8 @@ sheetjs-hermes: sheetjs-hermes.cpp init
-Lbuild_release/external/llvh/lib/Demangle/ -lLLVHDemangle \
-Lbuild_release/external/llvh/lib/Support/ -lLLVHSupport \
-Lbuild_release/jsi/ -ljsi \
-Lbuild_release/lib/ -lhermesFrontend \
-Lbuild_release/lib/ -lhermesOptimizer \
-Lbuild_release/lib/ -lhermesFrontend \
-Lbuild_release/lib/ADT -lhermesADT \
-Lbuild_release/lib/AST/ -lhermesAST \
-Lbuild_release/lib/AST2JS/ -lhermesAST2JS \

34
tests/dom/denodom.sh Executable file

@ -0,0 +1,34 @@
#!/bin/bash
# https://docs.sheetjs.com/docs/demos/net/dom#denodom
set -e
cd /tmp
rm -rf sheetjs-denodom
mkdir -p sheetjs-denodom
cd sheetjs-denodom
# Create the TypeScript file
cat > SheetJSDenoDOM.ts << 'EOF'
// @deno-types="https://cdn.sheetjs.com/xlsx-0.20.3/package/types/index.d.ts"
import * as XLSX from 'https://cdn.sheetjs.com/xlsx-0.20.3/package/xlsx.mjs';
import { DOMParser } from 'https://deno.land/x/deno_dom@v0.1.48/deno-dom-wasm.ts';
const doc = new DOMParser().parseFromString(
await (await fetch('https://docs.sheetjs.com/dom/SheetJSTable.html')).text(),
"text/html",
)!;
const tbl = doc.querySelector("table");
/* patch DenoDOM element */
tbl.rows = tbl.querySelectorAll("tr");
tbl.rows.forEach(row => row.cells = row.querySelectorAll("td, th"))
/* generate workbook */
const workbook = XLSX.utils.table_to_book(tbl);
XLSX.writeFile(workbook, "SheetJSDenoDOM.xlsx");
EOF
deno run --allow-net --allow-write --allow-import SheetJSDenoDOM.ts
npx -y xlsx-cli SheetJSDenoDOM.xlsx

@ -1,9 +1,22 @@
#!/bin/bash
# https://docs.sheetjs.com/docs/demos/engines/chakra
OS=$(uname -s)
ARCH=$(uname -m)
case "$OS" in
Darwin|Linux) ;;
*) echo "Unsupported OS: $OS"; exit 1 ;;
esac
case "$ARCH" in
x86_64) ARCH="x64" ;;
arm64|aarch64) ARCH="arm64" ;;
*) echo "Unsupported architecture: $ARCH"; exit 1 ;;
esac
cd /tmp
rm -rf sheetjs-chakra
mkdir sheetjs-chakra
cd sheetjs-chakra
@ -13,12 +26,65 @@ git checkout 792ee76
cd ..
cd ChakraCore
./build.sh --static --icu=/usr/local/opt/icu4c/include --test-build -j=8 --no-jit
case "$OS" in
Darwin)
BREW_PREFIX=$(brew --prefix)
# Check for required commands
if ! command -v cmake &> /dev/null; then
echo "cmake not found. Please install cmake (e.g., brew install cmake)"
exit 1
fi
if ! brew list icu4c &> /dev/null; then
echo "icu4c not found. Please install icu4c (e.g., brew install icu4c)"
exit 1
fi
if [ ! -d usr/local/opt ] && [ -d "${BREW_PREFIX}/opt/icu4c" ]; then
mkdir -p usr/local/opt
ln -sf "${BREW_PREFIX}/opt/icu4c" usr/local/opt/icu4c
fi
for f in CMakeLists.txt pal/CMakeLists.txt pal/src/CMakeLists.txt lib/wabt/CMakeLists.txt; do
if [ -f "$f" ] && grep -q "cmake_minimum_required(VERSION 3.2)" "$f"; then
sed -i '' 's/cmake_minimum_required(VERSION 3.2)/cmake_minimum_required(VERSION 4.0)/g' "$f"
fi
done
if [ "$ARCH" = "arm64" ]; then
if grep -q "^operator new(" lib/Common/Memory/Allocator.h 2>/dev/null; then
sed -i '' ':a;N;$!ba;s/#ifndef __PLACEMENT_NEW_INLINE.*#endif/#include <new>/g' lib/Common/Memory/Allocator.h
fi
./build.sh --static --no-icu --test-build -j=8 --no-jit
else
./build.sh --static --icu=${BREW_PREFIX}/opt/icu4c/include --test-build -j=8 --system-icu --no-jit
fi
;;
Linux)
# Check for required commands
if ! command -v cmake &> /dev/null; then
echo "cmake not found. Please install cmake (e.g., sudo apt-get install cmake or sudo pacman -S cmake)"
exit 1
fi
if ! command -v clang++ &> /dev/null; then
echo "clang++ not found. Please install clang (e.g., sudo apt-get install clang or sudo pacman -S clang)"
exit 1
fi
./build.sh --static --embed-icu --test-build -j=8 --no-jit
;;
esac
cd ..
curl -L -O https://docs.sheetjs.com/chakra/sheetjs.ch.cpp
curl -L -O https://docs.sheetjs.com/chakra/Makefile
if [[ "$OS" == "Darwin" && "$ARCH" == "x64" && ! -d /usr/local/opt/icu4c ]]; then
sudo mkdir -p /usr/local/opt 2>/dev/null || true
sudo ln -sf "${BREW_PREFIX}/opt/icu4c" /usr/local/opt 2>/dev/null || true
fi
make
curl -L -O https://cdn.sheetjs.com/xlsx-latest/package/dist/xlsx.full.min.js
@ -30,11 +96,11 @@ cp ChakraCore/out/Test/ch .
node -e "fs.writeFileSync('payload.js', 'var payload = \"' + fs.readFileSync('pres.numbers').toString('base64') + '\";')"
cat <<EOF >global.js
cat >global.js <<'EOF'
var global = (function(){ return this; }).call(null);
EOF
cat <<EOF >chakra.js
cat >chakra.js <<'EOF'
var wb = XLSX.read(payload, {type:'base64'});
console.log(XLSX.utils.sheet_to_csv(wb.Sheets[wb.SheetNames[0]]));
EOF

58
tests/engines/clearscript.sh Executable file

@ -0,0 +1,58 @@
#!/bin/bash
# https://docs.sheetjs.com/docs/demos/engines/v8#c
set -e
cd /tmp
rm -rf SheetJSClearScript
mkdir -p SheetJSClearScript
cd SheetJSClearScript
# Disable .NET telemetry
export DOTNET_CLI_TELEMETRY_OPTOUT=1
# Create new console project
dotnet new console
dotnet run
# Add ClearScript package
dotnet add package Microsoft.ClearScript.Complete --version 7.5.0
# Download SheetJS and test file
curl -LO https://cdn.sheetjs.com/xlsx-latest/package/dist/xlsx.full.min.js
curl -LO https://docs.sheetjs.com/pres.xlsx
# Replace Program.cs with the demo code
cat > Program.cs << 'EOF'
using Microsoft.ClearScript.JavaScript;
using Microsoft.ClearScript.V8;
/* initialize ClearScript */
var engine = new V8ScriptEngine();
/* Load SheetJS Scripts */
engine.Evaluate(File.ReadAllText("xlsx.full.min.js"));
Console.WriteLine("SheetJS version {0}", engine.Evaluate("XLSX.version"));
/* Read and Parse File */
byte[] filedata = File.ReadAllBytes(args[0]);
engine.Script.buf = engine.Script.Array.from(filedata);
engine.Evaluate("var wb = XLSX.read(buf, {type: 'array'});");
/* Print CSV of first worksheet */
engine.Evaluate("var ws = wb.Sheets[wb.SheetNames[0]];");
var csv = engine.Evaluate("XLSX.utils.sheet_to_csv(ws)");
Console.Write(csv);
/* Generate XLSB file and save to SheetJSClearScript.xlsb */
var xlsb = (ITypedArray<byte>)engine.Evaluate("XLSX.write(wb, {bookType: 'xlsb', type: 'buffer'})");
File.WriteAllBytes("SheetJSClearScript.xlsb", xlsb.ToArray());
Console.WriteLine("\nOutput saved to SheetJSClearScript.xlsb");
EOF
# Run the program
dotnet run pres.xlsx
# Verify the XLSB file is valid
npx -y xlsx-cli SheetJSClearScript.xlsb

@ -13,4 +13,13 @@ curl -LO https://docs.sheetjs.com/pres.xlsx
perl SheetJSDuk.pl pres.xlsx; echo $?
npx -y xlsx-cli SheetJSDuk.xlsb
npx -y xlsx-cli SheetJSDuk.xlsb
cat <<EOF
If the script failed with an error about XS, install dependencies:
$ cpan install JavaScript::Duktape::XS
This command may need to be run as root:
$ sudo cpan install JavaScript::Duktape::XS
EOF

@ -16,7 +16,7 @@ OS="$(uname -s)"
case "$OS" in
Darwin) LIB_NAME="libduktape.207.20700.so" ;;
Linux) LIB_NAME="libduktape.so.207.20700" ;;
Linux) LIB_NAME="./libduktape.so.207.20700" ;;
*) echo "Unsupported OS: $OS"; exit 1 ;;
esac

@ -6,15 +6,33 @@ rm -rf sheetjs-zig
mkdir -p sheetjs-zig
cd sheetjs-zig
## NOTE: these steps are for darwin
OS="$(uname -s)"
ARCH="$(uname -m)"
case "$ARCH" in
arm64) curl -LO https://ziglang.org/download/0.15.2/zig-aarch64-macos-0.15.2.tar.xz ;;
x86_64) curl -LO https://ziglang.org/download/0.15.2/zig-x86_64-macos-0.15.2.tar.xz ;;
x86_64) ZIG_ARCH="x86_64" ;;
aarch64|arm64) ZIG_ARCH="aarch64" ;;
*) echo "unsupported arch $ARCH"; exit 1 ;;
esac
tar -xzf zig-*.tar.xz
ZIG_VERSION="0.15.2"
case "$OS" in
Darwin)
FILENAME="zig-${ZIG_ARCH}-macos-${ZIG_VERSION}.tar.xz"
curl -LO "https://ziglang.org/download/${ZIG_VERSION}/${FILENAME}"
tar -xzf "${FILENAME}"
;;
Linux)
FILENAME="zig-${ZIG_ARCH}-linux-${ZIG_VERSION}.tar.xz"
curl -LO "https://ziglang.org/download/${ZIG_VERSION}/${FILENAME}"
xz -d zig-*.tar.xz
tar -xf zig-*.tar
;;
*)
echo "unsupported OS: $OS"
exit 1
;;
esac
./zig-*/zig init
@ -29,11 +47,11 @@ mv *.js src
curl -L -o src/main.zig https://docs.sheetjs.com/duk/main.zig
sed -i '' '/b.installArtifact(exe);/ i\
sed '/b.installArtifact(exe);/ i\
exe.addCSourceFile(.{ .file = b.path("duktape-2.7.0/src/duktape.c"), .flags = &.{ "-std=c99", "-fno-sanitize=undefined" } });\
exe.addIncludePath(b.path("duktape-2.7.0/src"));\
exe.linkSystemLibrary("c");\
exe.linkSystemLibrary("m");' build.zig
exe.linkSystemLibrary("m");' build.zig > build.zig.tmp && mv build.zig.tmp build.zig
./zig-*/zig build run -- pres.numbers; echo $?

28
tests/engines/goja.ps1 Normal file

@ -0,0 +1,28 @@
#!/usr/bin/env pwsh
# https://docs.sheetjs.com/docs/demos/engines/goja
$ErrorActionPreference = "Stop"
$oldDir = Get-Location
$tempDir = Join-Path -Path $env:TEMP -ChildPath "SheetGoja"
if (Test-Path -Path $tempDir) { Remove-Item -Path $tempDir -Recurse -Force }
New-Item -ItemType Directory -Path $tempDir | Out-Null
Set-Location -Path $tempDir
go mod init SheetGoja
go get github.com/dop251/goja
Invoke-WebRequest -Uri "https://cdn.sheetjs.com/xlsx-latest/package/dist/shim.min.js" -OutFile "shim.min.js"
Invoke-WebRequest -Uri "https://cdn.sheetjs.com/xlsx-latest/package/dist/xlsx.full.min.js" -OutFile "xlsx.full.min.js"
Invoke-WebRequest -Uri "https://sheetjs.com/pres.numbers" -OutFile "pres.numbers"
Invoke-WebRequest -Uri "https://docs.sheetjs.com/goja/SheetGoja.go" -OutFile "SheetGoja.go"
go build SheetGoja.go
if ($LASTEXITCODE -ne 0) { throw "Build failed" }
.\SheetGoja.exe pres.numbers
if ($LASTEXITCODE -ne 0) { throw "Execution failed" }
Set-Location $oldDir
Remove-Item -Path $tempDir -Recurse -Force

37
tests/engines/hermes-cli.sh Executable file

@ -0,0 +1,37 @@
#!/bin/bash
# https://docs.sheetjs.com/docs/demos/engines/hermes#cli-test
set -e
HERMES_VERSION="0.13.0"
cd /tmp
rm -rf sheetjs-hermes-cli
mkdir -p sheetjs-hermes-cli
cd sheetjs-hermes-cli
npx -y jsvu hermes@${HERMES_VERSION}
HERMES_BIN=$(find ~/.jsvu/engines/hermes-${HERMES_VERSION} -name "hermes-${HERMES_VERSION}" -type f | head -1)
if [ -z "$HERMES_BIN" ]; then echo "Failed to find Hermes binary"; exit 1; fi
cp "$HERMES_BIN" .
curl -LO https://cdn.sheetjs.com/xlsx-latest/package/dist/xlsx.full.min.js
curl -LO https://docs.sheetjs.com/pres.numbers
node -e "fs.writeFileSync('payload.js', 'var payload = \"' + fs.readFileSync('pres.numbers').toString('base64') + '\";')"
cat > global.js << 'EOF'
var global = (function(){ return this; }).call(null);
var console = { log: function(x) { print(x); } };
EOF
cat > hermes.js << 'EOF'
var wb = XLSX.read(payload, {type:'base64'});
console.log(XLSX.utils.sheet_to_csv(wb.Sheets[wb.SheetNames[0]]));
EOF
cat global.js xlsx.full.min.js payload.js hermes.js > sheetjs.hermes.js
./hermes-${HERMES_VERSION} sheetjs.hermes.js

@ -7,7 +7,7 @@ cd SheetJSJerry
git clone --depth=1 https://github.com/jerryscript-project/jerryscript.git
cd jerryscript
python3 tools/build.py --error-messages=ON --logging=ON --mem-heap=8192 --cpointer-32bit=ON
python3 tools/build.py --error-messages=ON --logging=ON --mem-heap=8192 --cpointer-32bit=ON --compile-flag="-Wno-error" --compile-flag="-Wno-unterminated-string-initialization"
cd ..
curl -LO https://cdn.sheetjs.com/xlsx-latest/package/dist/xlsx.full.min.js

@ -1,5 +1,6 @@
#!/bin/bash
# https://docs.sheetjs.com/docs/demos/engines/quickjs
cd /tmp
rm -rf sheetjs-quickjs
mkdir -p sheetjs-quickjs

110
tests/frontend/knockout.sh Executable file

@ -0,0 +1,110 @@
#!/bin/bash
# https://docs.sheetjs.com/docs/demos/frontend/legacy#knockoutjs
# Tests both Knockout 2 and Knockout 3
cd /tmp
rm -rf sheetjs-knockout-tests
mkdir -p sheetjs-knockout-tests
cd sheetjs-knockout-tests
cat >test.cjs <<'EOF'
const puppeteer = require('puppeteer');
const express = require('express');
const fs = require('fs');
(async() => {
const app = express();
app.use(express.static('./'));
const server = app.listen(7263, async() => {
console.log('[START] Server on port 7263');
const browser = await puppeteer.launch({ headless: 'new', args: ['--no-sandbox'] });
const page = await browser.newPage();
page.on('console', msg => console.log('PAGE:', msg.text()));
await page.setViewport({ width: 1920, height: 1080 });
const cdp = await page.target().createCDPSession();
await cdp.send('Browser.setDownloadBehavior', { behavior: 'allow', downloadPath: process.cwd() });
await page.goto('http://localhost:7263/', { waitUntil: 'networkidle0' });
/* Verify Knockout binding */
const hasBinding = await page.$('table[data-bind]');
if(!hasBinding) throw new Error('Knockout binding not found');
/* Verify initial data */
const initialRows = await page.$$eval('table tr', rs => rs.length);
if(initialRows !== 3) throw new Error('Expected 3 rows, got ' + initialRows);
/* Verify SheetJS loaded */
const hasXLSX = await page.evaluate(() => typeof XLSX !== 'undefined');
if(!hasXLSX) throw new Error('SheetJS not loaded');
/* Test file import */
const buf = fs.readFileSync('./pres.xlsx');
await page.evaluate((b64) => {
const input = document.getElementById('xlf');
const bytes = Uint8Array.from(atob(b64), c => c.charCodeAt(0));
const file = new File([bytes], 'pres.xlsx', { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' });
const dt = new DataTransfer();
dt.items.add(file);
input.files = dt.files;
input.dispatchEvent(new Event('change', { bubbles: true }));
}, buf.toString('base64'));
await new Promise(r => setTimeout(r, 2000));
const importedRows = await page.$$eval('table tr', rs => rs.length);
if(importedRows <= 3) throw new Error('Import failed: ' + importedRows + ' rows');
/* Cell mutation test */
await page.evaluate(() => {
const input = document.querySelector('table input');
if(input) { input.value = 'MODIFIED_TEST_VALUE'; input.dispatchEvent(new Event('change', { bubbles: true })); }
});
/* Export test */
const exportPath = './SheetJSKnockoutDemo.xlsx';
if(fs.existsSync(exportPath)) fs.unlinkSync(exportPath);
await page.click('#export');
for(let i = 0; i < 10 && !fs.existsSync(exportPath); ++i) await new Promise(r => setTimeout(r, 500));
if(!fs.existsSync(exportPath)) throw new Error('Export failed');
const stats = fs.statSync(exportPath);
if(stats.size < 100) throw new Error('Export file too small: ' + stats.size);
console.log('[PASS] All tests passed (' + stats.size + ' bytes)');
await browser.close();
server.close();
process.exit(0);
});
})();
EOF
curl -LO https://docs.sheetjs.com/pres.xlsx
npm init -y
npm install --save puppeteer express@4
for KNOCKOUT_VERSION in knockout{2,3}; do
curl -L -o index.html "https://docs.sheetjs.com/knockout/${KNOCKOUT_VERSION}.html"
node test.cjs
TEST_EXIT=$?
if [ $TEST_EXIT -ne 0 ]; then echo "Puppeteer tests failed with exit code $TEST_EXIT"; exit $TEST_EXIT; fi
if [ -f "./SheetJSKnockoutDemo.xlsx" ]; then
OUTPUT=$(npx -y xlsx-cli SheetJSKnockoutDemo.xlsx)
echo "$OUTPUT"
if echo "$OUTPUT" | grep -q "MODIFIED_TEST_VALUE"; then
rm SheetJSKnockoutDemo.xlsx
else
echo "ERROR: Exported file does not contain MODIFIED_TEST_VALUE"; exit 1
fi
else
echo "ERROR: Exported file not found"; exit 1
fi
done

88
tests/math/pandas.ps1 Normal file

@ -0,0 +1,88 @@
#!/usr/bin/env pwsh
# https://docs.sheetjs.com/docs/demos/math/pandas
$oldDir = Get-Location
$tempDir = Join-Path -Path $env:TEMP -ChildPath "sheetjs-pandas"
if (Test-Path -Path $tempDir) { Remove-Item -Path $tempDir -Recurse -Force }
New-Item -ItemType Directory -Path $tempDir | Out-Null
Set-Location -Path $tempDir
Invoke-WebRequest -Uri "https://www.7-zip.org/a/7z2501-extra.7z" -OutFile "7z2501-extra.7z"
$7zrPath = "7zr.exe"
if (-not (Test-Path $7zrPath)) {
Invoke-WebRequest -Uri "https://www.7-zip.org/a/7zr.exe" -OutFile $7zrPath
}
.\7zr.exe x 7z2501-extra.7z -y -o"7za" | Out-Null
Move-Item -Path "7za\7za.exe" -Destination "7za.exe" -Force
Remove-Item -Path "7z2501-extra.7z" -Force
Remove-Item -Path "7za" -Recurse -Force
Invoke-WebRequest -Uri "https://duktape.org/duktape-2.7.0.tar.xz" -OutFile "duktape-2.7.0.tar.xz"
.\7za.exe x duktape-2.7.0.tar.xz -y | Out-Null
.\7za.exe x duktape-2.7.0.tar -y | Out-Null
$vsVersions = @("2022\Community", "2022\Professional", "2022\Enterprise", "2019\Community")
foreach ($vsVersion in $vsVersions) {
$vcvarsPath = "${env:ProgramFiles}\Microsoft Visual Studio\$vsVersion\VC\Auxiliary\Build\vcvars64.bat"
if (Test-Path -Path $vcvarsPath) { break }
}
$tempEnvFile = [System.IO.Path]::GetTempFileName()
$vcvarsArg = if ($env:PROCESSOR_ARCHITECTURE -eq 'ARM64') { 'arm64' } else { '' }
Push-Location "$vcvarsPath\..\.."
if ($vcvarsArg) {
cmd.exe /c "`"$vcvarsPath`" $vcvarsArg && set > `"$tempEnvFile`""
} else {
cmd.exe /c "`"$vcvarsPath`" && set > `"$tempEnvFile`""
}
Pop-Location
Get-Content "$tempEnvFile" | ForEach-Object { if ($_ -match '^([^=]+)=(.*)$') {
$name = $matches[1]
$value = $matches[2]
if ($name -ne 'PATH') {
Set-Item -Path "Env:$name" -Value $value
} else {
$env:PATH = "$value;$env:PATH"
}
} }
Remove-Item "$tempEnvFile" -Force -ErrorAction SilentlyContinue
$dukSrcDir = Join-Path -Path (Join-Path -Path $tempDir -ChildPath "duktape-2.7.0") -ChildPath "src"
$dukConfigPath = Join-Path -Path $dukSrcDir -ChildPath "duk_config.h"
$dukConfigContent = [System.IO.File]::ReadAllText($dukConfigPath)
$exportDefs = "`n`n#define DUK_EXTERNAL_DECL extern __declspec(dllexport)`n#define DUK_EXTERNAL __declspec(dllexport)`n"
$dukConfigContent += $exportDefs
[System.IO.File]::WriteAllText($dukConfigPath, $dukConfigContent)
$dukBuildDir = Join-Path -Path $tempDir -ChildPath "duktape-2.7.0"
$dukDllPath = Join-Path -Path $dukBuildDir -ChildPath "duktape.dll"
cl /O2 /W3 /I"$dukSrcDir" /LD /DDUK_SINGLE_FILE /DDUK_F_DLL_BUILD /DDUK_F_WINDOWS /DDUK_COMPILING_DUKTAPE "/Fe:$dukDllPath" "$dukSrcDir\duktape.c"
Copy-Item $dukDllPath -Destination $tempDir
Invoke-WebRequest -Uri "https://cdn.sheetjs.com/xlsx-latest/package/dist/shim.min.js" -OutFile "shim.min.js"
Invoke-WebRequest -Uri "https://cdn.sheetjs.com/xlsx-latest/package/dist/xlsx.full.min.js" -OutFile "xlsx.full.min.js"
Invoke-WebRequest -Uri "https://docs.sheetjs.com/pres.numbers" -OutFile "pres.numbers"
Invoke-WebRequest -Uri "https://docs.sheetjs.com/pandas/sheetjs.py" -OutFile "sheetjs.py"
Invoke-WebRequest -Uri "https://docs.sheetjs.com/pandas/SheetJSPandas.py" -OutFile "SheetJSPandas.py"
$sheetjspy = Get-Content "sheetjs.py" -Raw
$sheetjspy = $sheetjspy -replace 'libduktape\.207\.20700\.so', '.\\duktape.dll'
$sheetjspy = $sheetjspy -replace 'with open\(path, "r"\)', 'with open(path, "rb")'
$sheetjspy = $sheetjspy -replace 'def str_to_c\(s\):\r?\n b = s\.encode\("utf8"\)\r?\n return \[c_char_p\(b\), len\(b\)\]', "def str_to_c(s):`r`n if type(s) == bytes:`r`n b = s`r`n else:`r`n b = s.encode(`"utf8`")`r`n return [c_char_p(b), len(b)]"
$sheetjspy | Set-Content "sheetjs.py"
$pandasInstalled = Get-Module -ListAvailable -Name pandas -ErrorAction SilentlyContinue
if (-not $pandasInstalled) { pip install pandas }
python SheetJSPandas.py pres.numbers
npm init -y
npm i --save xlsx-cli
.\node_modules\.bin\xlsx-cli SheetJSPandas.xlsb
Set-Location $oldDir
Remove-Item -Path $tempDir -Recurse -Force

@ -3,6 +3,12 @@
OS=$(uname -s)
case "$OS" in
Darwin) LIB_NAME="libduktape.207.20700.so" ;;
Linux) LIB_NAME="./libduktape.so.207.20700" ;;
*) echo "Unsupported OS: $OS"; exit 1 ;;
esac
cd /tmp
rm -rf sheetjs-pandas
mkdir sheetjs-pandas
@ -14,14 +20,6 @@ cd duktape-2.7.0
make -f Makefile.sharedlibrary
cd ..
OS="$(uname -s)"
case "$OS" in
Darwin) LIB_NAME="libduktape.207.20700.so" ;;
Linux) LIB_NAME="libduktape.so.207.20700" ;;
*) echo "Unsupported OS: $OS"; exit 1 ;;
esac
cp "duktape-2.7.0/$LIB_NAME" .
curl -LO https://cdn.sheetjs.com/xlsx-latest/package/dist/shim.min.js

95
tests/math/polars.ps1 Normal file

@ -0,0 +1,95 @@
#!/usr/bin/env pwsh
# https://docs.sheetjs.com/docs/demos/math/pandas
$oldDir = Get-Location
$tempDir = Join-Path -Path $env:TEMP -ChildPath "sheetjs-polars"
if (Test-Path -Path $tempDir) { Remove-Item -Path $tempDir -Recurse -Force }
New-Item -ItemType Directory -Path $tempDir | Out-Null
Set-Location -Path $tempDir
Invoke-WebRequest -Uri "https://www.7-zip.org/a/7z2501-extra.7z" -OutFile "7z2501-extra.7z"
$7zrPath = "7zr.exe"
if (-not (Test-Path $7zrPath)) {
Invoke-WebRequest -Uri "https://www.7-zip.org/a/7zr.exe" -OutFile $7zrPath
}
.\7zr.exe x 7z2501-extra.7z -y -o"7za" | Out-Null
Move-Item -Path "7za\7za.exe" -Destination "7za.exe" -Force
Remove-Item -Path "7z2501-extra.7z" -Force
Remove-Item -Path "7za" -Recurse -Force
Invoke-WebRequest -Uri "https://duktape.org/duktape-2.7.0.tar.xz" -OutFile "duktape-2.7.0.tar.xz"
.\7za.exe x duktape-2.7.0.tar.xz -y | Out-Null
.\7za.exe x duktape-2.7.0.tar -y | Out-Null
$vsVersions = @("2022\Community", "2022\Professional", "2022\Enterprise", "2019\Community")
foreach ($vsVersion in $vsVersions) {
$vcvarsPath = "${env:ProgramFiles}\Microsoft Visual Studio\$vsVersion\VC\Auxiliary\Build\vcvars64.bat"
if (Test-Path -Path $vcvarsPath) { break }
}
$tempEnvFile = [System.IO.Path]::GetTempFileName()
$vcvarsArg = if ($env:PROCESSOR_ARCHITECTURE -eq 'ARM64') { 'arm64' } else { '' }
Push-Location "$vcvarsPath\..\.."
if ($vcvarsArg) {
cmd.exe /c "`"$vcvarsPath`" $vcvarsArg && set > `"$tempEnvFile`""
} else {
cmd.exe /c "`"$vcvarsPath`" && set > `"$tempEnvFile`""
}
Pop-Location
Get-Content "$tempEnvFile" | ForEach-Object { if ($_ -match '^([^=]+)=(.*)$') {
$name = $matches[1]
$value = $matches[2]
if ($name -ne 'PATH') {
Set-Item -Path "Env:$name" -Value $value
} else {
$env:PATH = "$value;$env:PATH"
}
} }
Remove-Item "$tempEnvFile" -Force -ErrorAction SilentlyContinue
$dukSrcDir = Join-Path -Path (Join-Path -Path $tempDir -ChildPath "duktape-2.7.0") -ChildPath "src"
$dukConfigPath = Join-Path -Path $dukSrcDir -ChildPath "duk_config.h"
$dukConfigContent = [System.IO.File]::ReadAllText($dukConfigPath)
$exportDefs = "`n`n#define DUK_EXTERNAL_DECL extern __declspec(dllexport)`n#define DUK_EXTERNAL __declspec(dllexport)`n"
$dukConfigContent += $exportDefs
[System.IO.File]::WriteAllText($dukConfigPath, $dukConfigContent)
$dukBuildDir = Join-Path -Path $tempDir -ChildPath "duktape-2.7.0"
$dukDllPath = Join-Path -Path $dukBuildDir -ChildPath "duktape.dll"
cl /O2 /W3 /I"$dukSrcDir" /LD /DDUK_SINGLE_FILE /DDUK_F_DLL_BUILD /DDUK_F_WINDOWS /DDUK_COMPILING_DUKTAPE "/Fe:$dukDllPath" "$dukSrcDir\duktape.c"
Copy-Item $dukDllPath -Destination $tempDir
Invoke-WebRequest -Uri "https://cdn.sheetjs.com/xlsx-latest/package/dist/shim.min.js" -OutFile "shim.min.js"
Invoke-WebRequest -Uri "https://cdn.sheetjs.com/xlsx-latest/package/dist/xlsx.full.min.js" -OutFile "xlsx.full.min.js"
Invoke-WebRequest -Uri "https://docs.sheetjs.com/pres.numbers" -OutFile "pres.numbers"
Invoke-WebRequest -Uri "https://docs.sheetjs.com/pandas/sheetjs.py" -OutFile "sheetjs.py"
Invoke-WebRequest -Uri "https://docs.sheetjs.com/pandas/SheetJSPandas.py" -OutFile "SheetJSPandas.py"
$sheetjspy = Get-Content "sheetjs.py" -Raw
$sheetjspy = $sheetjspy -replace 'libduktape\.207\.20700\.so', '.\\duktape.dll'
$sheetjspy = $sheetjspy -replace 'with open\(path, "r"\)', 'with open(path, "rb")'
$sheetjspy = $sheetjspy -replace 'def str_to_c\(s\):\r?\n b = s\.encode\("utf8"\)\r?\n return \[c_char_p\(b\), len\(b\)\]', "def str_to_c(s):`r`n if type(s) == bytes:`r`n b = s`r`n else:`r`n b = s.encode(`"utf8`")`r`n return [c_char_p(b), len(b)]"
$sheetjspy = $sheetjspy -replace 'from pandas import read_csv', 'from polars import read_csv'
$sheetjspy = $sheetjspy -replace 'json = df\.to_json\(orient="records"\)', 'json = df.write_json()'
$sheetjspy | Set-Content "sheetjs.py"
$sheetJsPandasContent = Get-Content "SheetJSPandas.py" -Raw
$sheetJsPandasContent = $sheetJsPandasContent -replace 'print\(df\.info\(\)\)', 'print(df)'
$sheetJsPandasContent = $sheetJsPandasContent -replace 'SheetJSPandas\.xlsb', 'SheetJSPolars.xlsb'
$sheetJsPandasContent | Set-Content "SheetJSPandas.py"
$polarsInstalled = Get-Module -ListAvailable -Name polars -ErrorAction SilentlyContinue
if (-not $polarsInstalled) { pip install polars }
python SheetJSPandas.py pres.numbers
npm init -y
npm i --save xlsx-cli
.\node_modules\.bin\xlsx-cli SheetJSPolars.xlsb
Set-Location $oldDir
Remove-Item -Path $tempDir -Recurse -Force

@ -3,6 +3,12 @@
OS=$(uname -s)
case "$OS" in
Darwin) LIB_NAME="libduktape.207.20700.so" ;;
Linux) LIB_NAME="./libduktape.so.207.20700" ;;
*) echo "Unsupported OS: $OS"; exit 1 ;;
esac
cd /tmp
rm -rf sheetjs-polars
mkdir sheetjs-polars
@ -14,14 +20,6 @@ cd duktape-2.7.0
make -f Makefile.sharedlibrary
cd ..
OS="$(uname -s)"
case "$OS" in
Darwin) LIB_NAME="libduktape.207.20700.so" ;;
Linux) LIB_NAME="libduktape.so.207.20700" ;;
*) echo "Unsupported OS: $OS"; exit 1 ;;
esac
cp "duktape-2.7.0/$LIB_NAME" .
curl -LO https://cdn.sheetjs.com/xlsx-latest/package/dist/shim.min.js