diff --git a/docz/data/desktop.xls b/docz/data/desktop.xls
index 972bd6a..9c0129e 100644
--- a/docz/data/desktop.xls
+++ b/docz/data/desktop.xls
@@ -72,7 +72,7 @@
| ✔ |
✔ |
✔ |
- ✱ |
+ ✔ |
| Wails |
diff --git a/docz/data/mobile.xls b/docz/data/mobile.xls
index f7dbfd0..7e44da0 100644
--- a/docz/data/mobile.xls
+++ b/docz/data/mobile.xls
@@ -34,7 +34,7 @@
-
+
@@ -44,9 +44,9 @@
|
Real Device |
- MacOS Sim |
- Windows Sim |
- Linux Sim |
+ MacOS |
+ Windows |
+ Linux |
| Platform |
@@ -54,9 +54,7 @@
Android |
iOS |
Android |
- iOS |
Android |
- iOS |
Android |
@@ -65,9 +63,7 @@
| ✔ |
✔ |
✔ |
- ✘ |
✔ |
- ✘ |
✔ |
@@ -76,9 +72,7 @@
| ✔ |
✔ |
✔ |
- ✘ |
✔ |
- ✘ |
✔ |
@@ -87,9 +81,7 @@
| ✔ |
✔ |
✔ |
- ✘ |
✔ |
- ✘ |
✔ |
@@ -98,9 +90,7 @@
| ✔ |
✔ |
✔ |
- ✘ |
✔ |
- ✘ |
|
@@ -109,9 +99,7 @@
| ✔ |
✔ |
✔ |
- ✘ |
✔ |
- ✘ |
|
@@ -120,9 +108,7 @@
| ✔ |
✔ |
✔ |
- ✘ |
✔ |
- ✘ |
|
@@ -131,9 +117,7 @@
|
✔ |
✔ |
- ✘ |
- |
- ✘ |
+ ✔ |
|
diff --git a/docz/docs/02-getting-started/01-installation/07-bun.md b/docz/docs/02-getting-started/01-installation/07-bun.md
index 4980a6f..57ad8c3 100644
--- a/docz/docs/02-getting-started/01-installation/07-bun.md
+++ b/docz/docs/02-getting-started/01-installation/07-bun.md
@@ -121,7 +121,7 @@ This demo was last tested in the following deployments:
| Architecture | BunJS | Date |
|:-------------|:---------|:-----------|
-| `darwin-x64` | `1.3.6` | 2026-01-20 |
+| `darwin-x64` | `1.3.14` | 2026-06-13 |
| `darwin-arm` | `1.3.6` | 2026-01-19 |
| `win11-x64` | `1.3.6` | 2026-01-28 |
| `win11-arm` | `1.3.10` | 2026-03-07 |
diff --git a/docz/docs/03-demos/17-mobile/02-nativescript.md b/docz/docs/03-demos/17-mobile/02-nativescript.md
index f0a13bc..13fbbab 100644
--- a/docz/docs/03-demos/17-mobile/02-nativescript.md
+++ b/docz/docs/03-demos/17-mobile/02-nativescript.md
@@ -56,15 +56,15 @@ This demo was tested in the following environments:
| OS | Device | NS | Date |
|:-----------|:--------------------|:---------|:-----------|
-| Android 30 | NVIDIA Shield | `8.9.2` | 2025-05-06 |
-| iOS 15.1 | iPad Pro | `8.9.2` | 2025-05-06 |
+| Android 33 | AYN Thor Max | `9.0.3` | 2026-06-13 |
+| iOS 26.5 | iPhone 17 Pro Max | `9.0.3` | 2026-06-13 |
**Simulators**
| OS | Device | NS | Dev Platform | Date |
|:-----------|:--------------------|:---------|:-------------|:-----------|
-| Android 35 | Pixel 9 Pro XL | `8.9.2` | `darwin-x64` | 2025-05-06 |
-| iOS 18.4 | iPhone 16 Pro Max | `8.9.2` | `darwin-x64` | 2025-05-06 |
+| Android 36 | Pixel 9 Pro XL | `9.0.3` | `darwin-arm` | 2026-06-13 |
+| iOS 18.4 | iPhone 16 Pro Max | `9.0.3` | `darwin-arm` | 2026-06-13 |
| Android 35 | Pixel 9 | `8.9.2` | `win11-x64` | 2025-06-08 |
| Android 36 | Pixel 9 | `8.9.2` | `linux-x64` | 2025-07-06 |
@@ -332,7 +332,7 @@ In the last macOS test, the following output was displayed:
✔ Javac is installed and is configured properly.
✔ The Java Development Kit (JDK) is installed and is configured properly.
✔ Getting NativeScript components versions information...
-✔ Component nativescript has 8.9.2 version and is up to date.
+✔ Component nativescript has 9.0.6 version and is up to date.
@@ -361,7 +361,7 @@ In the last macOS test, the following output was displayed:
✔ Python installed and configured correctly.
✔ Xcode version 16.3.0 satisfies minimum required version 10.
✔ Getting NativeScript components versions information...
-✔ Component nativescript has 8.9.2 version and is up to date.
+✔ Component nativescript has 9.0.6 version and is up to date.
@@ -428,30 +428,29 @@ The goal of this section is to display the SheetJS library version number.
npm i --save https://cdn.sheetjs.com/xlsx-${current}/xlsx-${current}.tgz`}
-7) Edit `src/app/item/items.component.ts` so that the component imports the
+7) Edit `src/app/people/person.component.ts` so that the component imports the
SheetJS version string and adds it to a `version` variable in the component:
-```ts title="src/app/item/items.component.ts (add highlighted lines)"
+```ts title="src/app/people/person.component.ts (add highlighted lines)"
// highlight-next-line
import { version } from 'xlsx';
-import { Component, NO_ERRORS_SCHEMA, inject } from '@angular/core'
+import { ChangeDetectionStrategy, Component, NO_ERRORS_SCHEMA, inject } from '@angular/core'
// ...
-export class ItemsComponent {
+export class PersonComponent {
// highlight-next-line
version = `SheetJS - ${version}`;
- itemService = inject(ItemService)
- page = inject(Page)
-// ...
+ personService = inject(PersonService);
+}
```
-8) Edit the template `src/app/item/items.component.html` to reference `version`
-in the title of the action bar:
+8) Edit the template `src/app/people/person.component.html` to reference
+`version` in the title of the action bar:
-```xml title="src/app/item/items.component.html (edit highlighted line)"
+```xml title="src/app/people/person.component.html (edit highlighted line)"
-
+
@@ -471,7 +470,7 @@ The title bar should show the version.
10) Add the Import and Export buttons to the template:
-```xml title="src/app/item/items.component.html (add highlighted lines)"
+```xml title="src/app/people/person.component.html (add highlighted lines)"
@@ -481,7 +480,7 @@ The title bar should show the version.
-
+
@@ -490,16 +489,15 @@ The title bar should show the version.
11) Add the `import` and `export` methods in the component script:
-```ts title="src/app/item/items.component.ts (add highlighted lines)"
+```ts title="src/app/people/person.component.ts (add highlighted lines)"
// highlight-start
import { version, utils, read, write } from 'xlsx';
import { Dialogs, getFileAccess } from '@nativescript/core';
import { Folder, knownFolders, path } from '@nativescript/core/file-system';
// highlight-end
-import { Component, NO_ERRORS_SCHEMA, inject } from '@angular/core'
+import { ChangeDetectionStrategy, Component, NO_ERRORS_SCHEMA, inject } from '@angular/core'
import { NativeScriptCommonModule, NativeScriptRouterModule } from '@nativescript/angular'
-import { Page } from '@nativescript/core'
-import { ItemService } from './item.service'
+import { PersonService } from './person.service'
// highlight-start
function get_url_for_filename(filename: string): string {
@@ -510,10 +508,9 @@ function get_url_for_filename(filename: string): string {
// ...
-export class ItemsComponent {
+export class PersonComponent {
version = `SheetJS - ${version}`;
- itemService = inject(ItemService)
- page = inject(Page)
+ personService = inject(PersonService);
// highlight-start
/* Import button */
@@ -524,8 +521,7 @@ export class ItemsComponent {
async export() {
}
// highlight-end
-
- // ...
+}
```
12) End the script and relaunch the app in the Android simulator:
@@ -540,7 +536,7 @@ Two buttons should appear just below the header:
13) Implement import and export by adding the highlighted lines:
-```ts title="src/app/item/items.component.ts (add highlighted lines)"
+```ts title="src/app/people/person.component.ts (add highlighted lines)"
/* Import button */
async import() {
// highlight-start
@@ -560,7 +556,7 @@ Two buttons should appear just below the header:
const ws = wb.Sheets[wsname];
/* update table */
- this.itemService.items.set(utils.sheet_to_json(ws));
+ this.personService.items.set(utils.sheet_to_json(ws));
} catch(e) { await Dialogs.alert(e.message); }
// highlight-end
}
@@ -573,7 +569,7 @@ Two buttons should appear just below the header:
try {
/* create worksheet from data */
- const ws = utils.json_to_sheet(this.itemService.items());
+ const ws = utils.json_to_sheet(this.personService.items());
/* create workbook from worksheet */
const wb = utils.book_new();
@@ -638,14 +634,14 @@ After the header row, insert a row and make the following assignments:
- Set cell `A2` to `0`
- Set cell `B2` to `SheetJS` (type `'SheetJS` in the formula bar)
-- Set cell `C2` to `Library` (type `'Library` in the formula bar)
+- Set cell `C2` to `American` (type `'American` in the formula bar)
After making the changes, the worksheet should look like the following:
```text
-id | name | role
+id | name | nationality
# highlight-next-line
- 0 | SheetJS | Library
+ 0 | SheetJS | American
...
```
@@ -711,9 +707,9 @@ After the header row, insert a row and make the following assignments:
After making the changes, the worksheet should look like the following:
```text
-id | name | role
+id | name | nationality
# highlight-next-line
- 0 | SheetJS | Library
+ 0 | SheetJS | American
...
```
@@ -726,20 +722,20 @@ The first item in the list will change:
### Fetching Files
-25) Replace `item.service.ts` with the following:
+25) Replace `person.service.ts` with the following:
-```ts title="src/app/item/item.service.ts"
-import { read, utils } from 'xlsx';
-import { Injectable, signal, effect } from '@angular/core'
+```ts title="src/app/people/person.service.ts (replace contents)"
+import { read, utils } from 'xlsx';
+import { Injectable, signal, effect } from '@angular/core';
import { knownFolders, path, getFileAccess } from '@nativescript/core';
import { getFile } from '@nativescript/core/http';
-import { Item } from './item'
+import { Person } from './person';
interface IPresident { Name: string; Index: number };
-@Injectable({ providedIn: 'root' })
-export class ItemService {
- items = signal- ([]);
+@Injectable({providedIn: 'root'})
+export class PersonService {
+ items = signal([]);
constructor() { effect(() => { (async() => {
/* fetch https://docs.sheetjs.com/pres.xlsx */
const temp: string = path.join(knownFolders.temp().path, "pres.xlsx");
@@ -749,11 +745,11 @@ export class ItemService {
/* translate the first worksheet to the required Item type */
const data = utils.sheet_to_json(wb.Sheets[wb.SheetNames[0]]);
/* update state */
- this.items.set(data.map((pres, id) => ({id, name: pres.Name, role: ""+pres.Index} as Item)));
+ this.items.set(data.map((pres, id) => ({id, name: pres.Name, nationality: ""+pres.Index} as Person)));
})(); }); }
- getItem(id: number): Item {
- return this.items().find((item) => item.id === id)
+getPerson(id: number): Person {
+ return this.items().find((person) => person.id === id);
}
}
```
@@ -795,23 +791,23 @@ at `App_Resources/Android/src/main/AndroidManifest.xml`:
npm i --save @nativescript-community/perms
```
-31) Add the highlighted lines to `items.component.ts`:
+31) Add the highlighted lines to `person.component.ts`:
- Import `File` from NativeScript core and `request` from the new dependency:
-```ts title="items.component.ts (add highlighted lines)"
-import { Dialogs, getFileAccess, Utils } from '@nativescript/core';
+```ts title="person.component.ts (add highlighted lines)"
+import { Dialogs, getFileAccess } from '@nativescript/core';
// highlight-start
import { request } from '@nativescript-community/perms';
import { Folder, knownFolders, path, File } from '@nativescript/core/file-system';
// highlight-end
-import { Component, OnInit } from '@angular/core'
+import { ChangeDetectionStrategy, Component, NO_ERRORS_SCHEMA, inject } from '@angular/core'
// ...
```
- Add a new write operation to the `export` method:
-```ts title="items.component.ts (add highlighted lines)"
+```ts title="person.component.ts (add highlighted lines)"
/* attempt to save Uint8Array to file */
await getFileAccess().writeBufferAsync(url, global.isAndroid ? (Array.from(u8) as any) : u8);
await Dialogs.alert(`Wrote to SheetJSNS.xls at ${url}`);
@@ -822,7 +818,7 @@ import { Component, OnInit } from '@angular/core'
const res = await request('storage');
/* write to Downloads folder */
const dl = android.os.Environment.getExternalStoragePublicDirectory(android.os.Environment.DIRECTORY_DOWNLOADS).getAbsolutePath();
- File.fromPath(dl + "/SheetJSNS.xls").writeSync(Array.from(u8));
+ await File.fromPath(dl + "/SheetJSNS.xls").write(Array.from(u8));
}
/* highlight-end */
} catch(e) { await Dialogs.alert(e.message); }
@@ -858,10 +854,10 @@ file named `SheetJSNS.xls`.
35) Enable developer code signing certificates:
-Open `platforms/ios/SheetJSNS.xcodeproj/project.xcworkspace` in Xcode. Select
-the "Project Navigator" and select `SheetJSNS`. In the main view, select the
-`SheetJSNS` target. Click "Signing & Capabilities". Under "Signing", select a
-team in the dropdown menu.
+Open `platforms/ios/SheetJSNS.xcodeproj` in Xcode. Select "Project Navigator" in
+the left sidebar and click `SheetJSNS`. In the main view, select the `SheetJSNS`
+target. Click "Signing & Capabilities". Under "Signing", select a team in the
+dropdown menu.
:::caution pass
@@ -893,6 +889,17 @@ npx -y -p nativescript ns platform clean ios
npx -y -p nativescript ns run ios
```
+:::caution pass
+
+In some test runs, iOS showed a "Developer Mode Required" popup:
+
+> "SheetJSNS" requires Developer Mode to run. Until Developer Mode has been
+> enabled this app will not be available for use.
+
+Under "Settings" > "Privacy & Security", enable "Developer Mode" and restart.
+
+:::
+
:::info pass
If this is the first time testing an app on a device, the certificate must be
diff --git a/docz/docs/03-demos/17-mobile/06-flutter.md b/docz/docs/03-demos/17-mobile/06-flutter.md
index 03e90d1..bdc457e 100644
--- a/docz/docs/03-demos/17-mobile/06-flutter.md
+++ b/docz/docs/03-demos/17-mobile/06-flutter.md
@@ -59,7 +59,7 @@ This demo was tested in the following environments:
|:-----------|:------------------|:---------|:---------|:-------------|:-----------|
| Android 36 | Pixel Tablet | `3.11.1` | `3.41.4` | `darwin-arm` | 2026-03-11 |
| iOS 18.6 | iPhone 16 Pro Max | `3.11.1` | `3.41.4` | `darwin-arm` | 2026-03-11 |
-| Android 36 | Pixel 9 Pro XL | `3.7.2` | `3.29.3` | `win11-x64` | 2054-04-28 |
+| Android 36 | Pixel 9 Pro XL | `3.7.2` | `3.29.3` | `win11-x64` | 2025-04-28 |
:::
diff --git a/docz/docs/03-demos/17-mobile/07-lynx.md b/docz/docs/03-demos/17-mobile/07-lynx.md
index 11105a7..7c7077a 100644
--- a/docz/docs/03-demos/17-mobile/07-lynx.md
+++ b/docz/docs/03-demos/17-mobile/07-lynx.md
@@ -212,6 +212,7 @@ This demo was tested in the following environments:
|:-----------|:--------------------|:---------|:-------------|:-------------|:-----------|
| Android 35 | Pixel 3a | `0.8.6` | `3.2.0-rc.1` | `darwin-arm` | 2025-03-26 |
| iOS 18.3 | iPhone 16 Pro | `0.8.6` | `3.2.0-rc.1` | `darwin-arm` | 2025-03-26 |
+| Android 37 | Pixel 10 Pro XL | `0.14.5` | `3.8.1` | `win11-x64` | 2026-06-14 |
:::
@@ -235,7 +236,7 @@ Make sure you can run a basic test app on your simulator before continuing!
1) Create project:
```bash
-npm create rspeedy@0.8.6 -- -d SheetJSLynxFetch -t react-ts --tools biome
+npm create rspeedy@0.14.5 -- -d SheetJSLynxFetch -t react-ts --tools biome
```
2) Install shared dependencies:
@@ -314,7 +315,7 @@ emulator -avd Medium_Phone_API_35
7) Download the LynxExplorer[^4] APK.
-The latest test used [`LynxExplorer-noasan-release.apk` for version `3.2.0-rc.1`](https://github.com/lynx-family/lynx/releases/download/3.2.0-rc.1/LynxExplorer-noasan-release.apk).
+The latest test used [`LynxExplorer-noasan-release.apk` for version `3.8.1`](https://github.com/lynx-family/lynx/releases/download/3.8.1/LynxExplorer-noasan-release.apk).
8) Drag and drop the APK into the Android emulator window.
diff --git a/docz/docs/03-demos/19-desktop/02-nwjs.md b/docz/docs/03-demos/19-desktop/02-nwjs.md
index 7dd914b..2bf2b11 100644
--- a/docz/docs/03-demos/19-desktop/02-nwjs.md
+++ b/docz/docs/03-demos/19-desktop/02-nwjs.md
@@ -119,14 +119,14 @@ input.click();
This demo was tested in the following environments:
-| OS and Version | Architecture | NW.js | Date | Notes |
-|:---------------|:-------------|:----------|:-----------|:---------------------|
-| macOS 15.7.4 | `darwin-x64` | `0.112.0` | 2026-06-13 | |
-| macOS 14.5 | `darwin-arm` | `0.94.0` | 2025-03-30 | |
-| Windows 11 | `win11-x64` | `0.111.3` | 2026-05-22 | |
-| Windows 11 | `win11-arm` | `0.94.0` | 2025-02-23 | |
-| Linux (Ubuntu) | `linux-x64` | `0.101.2` | 2025-07-06 | |
-| Linux (Debian) | `linux-arm` | `0.60.0` | 2025-02-16 | Unofficial build[^1] |
+| OS and Version | Architecture | NW.js | Date |
+|:---------------|:-------------|:----------|:-----------|
+| macOS 15.7.4 | `darwin-x64` | `0.112.0` | 2026-06-13 |
+| macOS 14.5 | `darwin-arm` | `0.94.0` | 2025-03-30 |
+| Windows 11 | `win11-x64` | `0.111.3` | 2026-05-22 |
+| Windows 11 | `win11-arm` | `0.94.0` | 2025-02-23 |
+| Linux (Ubuntu) | `linux-x64` | `0.101.2` | 2025-07-06 |
+| Linux (Debian) | `linux-arm` | `0.112.0` | 2026-06-14 |
:::
@@ -203,7 +203,7 @@ npm i
4) To verify the app works, run in the test environment:
```bash
-npx nw .
+npx -y nw .
```
On launch, the app will fetch and parse https://docs.sheetjs.com/pres.numbers .
@@ -214,28 +214,10 @@ table will refresh with the contents of the selected file.
Click "Export Data!" and save the generated file to `SheetJSNWDemo.xlsx`. This
file can be opened in Excel or another spreadsheet editor.
-
- Linux ARM64 support (click to show)
-
-NW.js does not officially support `linux-arm`. The official recommendation is to
-use a third-party pre-built version.
-
-```bash
-curl -LO https://github.com/LeonardLaszlo/nw.js-armv7-binaries/releases/download/nw60-arm64_2022-01-08/nw60-arm64_2022-01-08.tar.gz
-tar -xzf nw60-arm64_2022-01-08.tar.gz
-cp usr/docker/dist/nwjs-chromium-ffmpeg-branding/nwjs-v0.60.1-linux-arm64.tar.gz
-tar -xzf nwjs-v0.60.1-linux-arm64.tar.gz
-./nwjs-v0.60.1-linux-arm64/nw .
-```
-
-Unfortunately `nw-builder` will not be able to build a standalone program.
-
-
-
5) To build a standalone app, run the builder:
```bash
-npx -p nw-builder@4.17.10 nwbuild --mode=build --version=0.111.3 --glob=false --outDir=../out ./
+npx -y -p nw-builder@4.17.10 nwbuild --mode=build --version=0.111.3 --glob=false --outDir=../out ./
```
This will generate the standalone app in the `..\out\` folder.
@@ -249,5 +231,4 @@ This will generate the standalone app in the `..\out\` folder.
| `win11-x64` | `..\out\sheetjs-nwjs.exe` |
| `win11-arm` | `..\out\sheetjs-nwjs.exe` |
| `linux-x64` | `../out/sheetjs-nwjs` |
-
-[^1]: The [`nw60-arm64_2022-01-08` release](https://github.com/LeonardLaszlo/nw.js-armv7-binaries/releases/tag/nw60-arm64_2022-01-08) included an ARM64 version of `nw`.
\ No newline at end of file
+| `linux-arm` | `../out/sheetjs-nwjs` |
diff --git a/docz/docs/03-demos/19-desktop/04-tauri.md b/docz/docs/03-demos/19-desktop/04-tauri.md
index a6f3b24..d9cc51e 100644
--- a/docz/docs/03-demos/19-desktop/04-tauri.md
+++ b/docz/docs/03-demos/19-desktop/04-tauri.md
@@ -58,7 +58,7 @@ This demo was tested in the following environments:
|:---------------|:-------------|:----------|:----------|:-----------|
| macOS 15.7.4 | `darwin-x64` | `v1.6.0` | VueJS | 2026-06-13 |
| macOS 14.5 | `darwin-arm` | `v1.6.0` | Kaioken | 2025-03-30 |
-| Windows 11 | `win11-x64` | `v1.6.0` | VueJS | 2025-05-27 |
+| Windows 11 | `win11-x64` | `v1.6.0` | VueJS | 2026-06-14 |
| Windows 11 | `win11-arm` | `v1.6.0` | VueJS | 2025-02-23 |
| Linux (HoloOS) | `linux-x64` | `v1.6.0` | VueJS | 2025-07-06 |
| Linux (Debian) | `linux-arm` | `v1.6.0` | VueJS | 2025-05-27 |
diff --git a/docz/docs/03-demos/20-cli/08-boxednode.md b/docz/docs/03-demos/20-cli/08-boxednode.md
index 6af66b5..cbf51bf 100644
--- a/docz/docs/03-demos/20-cli/08-boxednode.md
+++ b/docz/docs/03-demos/20-cli/08-boxednode.md
@@ -34,7 +34,7 @@ This demo was tested in the following deployments:
| `darwin-arm` | `3.0.0` | `23.11.0` | 2026-03-13 |
| `win11-x64` | `3.0.0` | `22.22.2` | 2026-05-08 |
| `linux-x64` | `3.0.0` | `25.8.0` | 2026-03-08 |
-| `linux-arm` | `2.4.4` | `23.8.0` | 2025-02-15 |
+| `linux-arm` | `3.0.0` | `23.8.0` | 2026-06-14 |
:::
@@ -113,7 +113,7 @@ The `-n` flag controls the target NodeJS version. For this demo, the following
command uses NodeJS `23.8.0`:
```bash
-npx -y boxednode@2.4.4 -s xlsx-cli.js -t xlsx-cli -n 23.8.0
+npx -y boxednode@3.0.0 -s xlsx-cli.js -t xlsx-cli -n 23.8.0
```
:::
diff --git a/docz/docs/03-demos/27-local/05-clipboard.md b/docz/docs/03-demos/27-local/05-clipboard.md
index 24029bf..e462259 100644
--- a/docz/docs/03-demos/27-local/05-clipboard.md
+++ b/docz/docs/03-demos/27-local/05-clipboard.md
@@ -26,8 +26,8 @@ Each browser demo was tested in the following environments:
| Safari 26.2 | `darwin-arm` | 2026-05-16 | `text/rtf` not supported |
| Chromium 147 | `win11-arm` | 2026-05-26 | |
| Edge 148 | `win11-arm` | 2026-05-26 | |
-| Chromium 135 | `linux-arm` | 2025-04-23 | |
-| Konqueror 22 | `linux-arm` | 2025-04-23 | `text/rtf`, files not supported |
+| Chromium 147 | `linux-arm` | 2026-06-14 | `text/rtf` did not work |
+| Konqueror 25 | `linux-arm` | 2026-06-14 | `text/rtf` not supported |
Windows and macOS tests were run against Excel, while Linux tests were run
against Gnumeric.
@@ -106,7 +106,14 @@ and copy spreadsheets into the clipboard.
:::
-The event `clipboardData.files` property, if it is set, is a list of files.
+The event `clipboardData.files` property, if it is set, is a list of
+[`File`](/docs/demos/local/file#blob-and-file) objects.
+
+The `arrayBuffer` method of the `File` object returns a `Promise` that resolves
+to an `ArrayBuffer` with binary data. The `ArrayBuffer` can be parsed by the
+SheetJS [`read`](/docs/api/parse-options) method.
+
+The following example parses copied files and displays all sheet names:
```jsx live
function ClipboardReadFiles() {
@@ -210,6 +217,14 @@ function ClipboardWrite() {
}
```
+:::caution pass
+
+When the clipboard contains a full HTML document, Gnumeric prepends the title to
+the table. The first row of the table will be "SheetJS Table Export". This does
+not affect Excel or other popular spreadsheet software.
+
+:::
+
## Electron
Electron Clipboard API supports HTML and RTF clipboards.
diff --git a/docz/docs/03-demos/32-extensions/03-excelapi.md b/docz/docs/03-demos/32-extensions/03-excelapi.md
index ea54941..35a6867 100644
--- a/docz/docs/03-demos/32-extensions/03-excelapi.md
+++ b/docz/docs/03-demos/32-extensions/03-excelapi.md
@@ -39,7 +39,7 @@ This demo was tested in the following deployments:
| OS and Version | Architecture | Excel | Date |
|:---------------|:-------------|:-----------|:-----------|
-| macOS 15.3 | `darwin-x64` | 16.95.4 | 2025-04-17 |
+| macOS 15.7.4 | `darwin-x64` | 16.109 | 2026-06-13 |
| macOS 14.5 | `darwin-arm` | 16.106.3 | 2026-05-05 |
| Windows 11 | `win11-x64` | 365 (2604) | 2026-06-05 |
| Windows 11 | `win11-arm` | 365 (2503) | 2025-04-24 |
@@ -287,6 +287,16 @@ var XLSX = require("xlsx");
export function version() {
return [[XLSX.version]];
}
+
+/**
+ * Download file and write data
+ * @customfunction
+ * @param {string} url URL to fetch and parse
+ * @returns {any[][]} Worksheet data
+ */
+export async function extern(url) {
+ return [[""]];
+}
```
12) Close the terminal window and the Excel window. Do not save the Excel file.
@@ -372,7 +382,7 @@ npm start
15) Add the following code snippet to `src\functions\functions.js` and save:
-```js title="src\functions\functions.js (add to end)"
+```js title="src\functions\functions.js (replace existing function)"
/**
* Download file and write data
* @customfunction
diff --git a/docz/docs/03-demos/32-extensions/10-stata.md b/docz/docs/03-demos/32-extensions/10-stata.md
index 79281d5..14266fa 100644
--- a/docz/docs/03-demos/32-extensions/10-stata.md
+++ b/docz/docs/03-demos/32-extensions/10-stata.md
@@ -53,7 +53,7 @@ This demo was tested in the following deployments:
| Architecture | Version | Date |
|:-------------|:------------------|:-----------|
-| `darwin-x64` | `18.5` (StataNow) | 2025-06-20 |
+| `darwin-x64` | `19.5` (StataNow) | 2026-06-13 |
| `darwin-arm` | `19.5` (StataNow) | 2026-03-13 |
| `win11-x64` | `19.5` (StataNow) | 2026-05-14 |
| `win11-arm` | `18.5` (StataNow) | 2025-02-23 |
@@ -257,9 +257,9 @@ curl -LO https://www.stata.com/plugins/stplugin.c
curl -LO https://www.stata.com/plugins/stplugin.h
```
-:::danger pass
+:::caution pass
-**When this demo was last tested, `stplugin.h` was removed from the website!**
+**In some demo test runs, `stplugin.h` was not available from the website!**
If the official links do not work, the following files should be used:
diff --git a/docz/docs/03-demos/32-extensions/12-maple.md b/docz/docs/03-demos/32-extensions/12-maple.md
index ca9b5b7..02755d2 100644
--- a/docz/docs/03-demos/32-extensions/12-maple.md
+++ b/docz/docs/03-demos/32-extensions/12-maple.md
@@ -38,8 +38,8 @@ This demo was tested by SheetJS users in the following deployments:
| Architecture | Version | Date |
|:-------------|:---------|:-----------|
-| `darwin-x64` | `2025.1` | 2025-06-20 |
-| `win11-x64` | `2025.1` | 2025-07-17 |
+| `darwin-x64` | `2025.1` | 2026-06-13 |
+| `win11-x64` | `2025.1` | 2026-06-13 |
:::
diff --git a/docz/docs/03-demos/32-extensions/41-ghidra.md b/docz/docs/03-demos/32-extensions/41-ghidra.md
index 463d819..12f92fe 100644
--- a/docz/docs/03-demos/32-extensions/41-ghidra.md
+++ b/docz/docs/03-demos/32-extensions/41-ghidra.md
@@ -27,7 +27,7 @@ This demo was tested by SheetJS users in the following deployments:
| Architecture | Ghidra | Date |
|:-------------|:----------|:-----------|
-| `darwin-x64` | `11.13.1` | 2025-04-17 |
+| `darwin-x64` | `12.1.2` | 2026-06-13 |
| `darwin-arm` | `11.13.1` | 2025-10-19 |
:::
@@ -264,16 +264,18 @@ When this demo was last tested, Java and Ghidra were installed using Homebrew:
```bash
brew install zulu@21
-brew install --cask ghidra
+brew install ghidra
```
-1) Add the base Ghidra folder to the PATH variable. The following shell command
-adds to the path for the current `zsh` or `bash` session:
+1) Add the base Ghidra folder to the PATH variable. The following shell commands
+adds common paths for the current `zsh` or `bash` session:
```bash
export PATH="$PATH":$(dirname $(realpath `which ghidraRun`))
+export PATH="$PATH":$(realpath $(dirname $(realpath `which ghidraRun`))/../libexec/Ghidra)
+export PATH="$PATH":$(realpath $(dirname $(realpath `which ghidraRun`))/../libexec/Extensions/Ghidra)
```
2) Install `ghidra.js` globally:
@@ -323,7 +325,7 @@ binaries. `lipo` creates a new binary with support for one architecture.
6) Analyze the program:
```bash
-$(dirname $(realpath `which ghidraRun`))/support/analyzeHeadless /tmp/sheetjs-ghidra Numbers -import TSTables.macho
+$(dirname $(realpath `which ghidraRun`))/../libexec/support/analyzeHeadless /tmp/sheetjs-ghidra Numbers -import TSTables.macho
```
@@ -411,7 +413,7 @@ npm i --save https://cdn.sheetjs.com/xlsx-${current}/xlsx-${current}.tgz`}
9) Run the script:
```bash
-$(dirname $(realpath `which ghidraRun`))/support/analyzeHeadless /tmp/sheetjs-ghidra Numbers -process TSTables.macho -noanalysis -scriptPath `pwd` -postScript sheetjs-ghidra.js
+$(dirname $(realpath `which ghidraRun`))/../libexec/support/analyzeHeadless /tmp/sheetjs-ghidra Numbers -process TSTables.macho -noanalysis -scriptPath `pwd` -postScript sheetjs-ghidra.js
```
10) Open the generated `SheetJSGhidraTSTCell.xlsx` spreadsheet with Numbers:
diff --git a/docz/docs/03-demos/42-engines/01-duktape.md b/docz/docs/03-demos/42-engines/01-duktape.md
index 6977372..82f4ebe 100644
--- a/docz/docs/03-demos/42-engines/01-duktape.md
+++ b/docz/docs/03-demos/42-engines/01-duktape.md
@@ -132,7 +132,7 @@ This demo was tested in the following deployments:
| `darwin-arm` | `2.7.0` | 2026-03-07 |
| `win11-x64` | `2.7.0` | 2026-05-26 |
| `win11-arm` | `2.7.0` | 2025-02-23 |
-| `linux-x64` | `2.7.0` | 2025-04-21 |
+| `linux-x64` | `2.7.0` | 2026-06-14 |
| `linux-arm` | `2.7.0` | 2026-03-07 |
:::
@@ -408,7 +408,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-x64` | `2.7.0` | `8.4.11` | 2026-06-14 |
| `linux-arm` | `2.7.0` | `8.4.16` | 2026-03-07 |
:::
@@ -552,7 +552,7 @@ This demo was tested in the following deployments:
| `darwin-arm` | `2.7.0` | `3.12.3` | 2026-01-23 |
| `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-x64` | `2.7.0` | `3.13.9` | 2026-06-14 |
| `linux-arm` | `2.7.0` | `3.13.5` | 2026-03-07 |
:::
@@ -910,7 +910,7 @@ This demo was tested in the following deployments:
| `darwin-arm` | `2.7.0` | `0.15.2` | 2026-01-20 |
| `win11-x64` | `2.7.0` | `0.15.2` | 2026-05-26 |
| `win11-arm` | `2.7.0` | `0.13.0` | 2025-02-23 |
-| `linux-x64` | `2.7.0` | `0.14.0` | 2025-04-21 |
+| `linux-x64` | `2.7.0` | `0.15.2` | 2026-06-14 |
| `linux-arm` | `2.7.0` | `0.15.2` | 2026-03-07 |
On Windows, due to incompatibilities between WSL and PowerShell, some commands
@@ -952,7 +952,7 @@ tar -xzf zig-*.tar.xz
For X64 Linux:
```bash
-curl -LO https://ziglang.org/download/0.14.0/zig-linux-x86_64-0.14.0.tar.xz
+curl -LO https://ziglang.org/download/0.15.2/zig-x86_64-linux-0.15.2.tar.xz
xz -d zig-linux-*.tar.xz
tar -xf zig-linux-*.tar
```
@@ -1141,7 +1141,7 @@ This demo was tested in the following deployments:
| `darwin-x64` | `2.2.0` | 2026-01-21 |
| `darwin-arm` | `2.2.0` | 2026-03-07 |
| `win11-arm` | `2.2.0` | 2026-05-09 |
-| `linux-x64` | `2.2.0` | 2025-04-21 |
+| `linux-x64` | `2.2.0` | 2026-06-14 |
| `linux-arm` | `2.2.0` | 2026-03-07 |
:::
diff --git a/docz/docs/03-demos/42-engines/02-v8.md b/docz/docs/03-demos/42-engines/02-v8.md
index e8e5ffb..3e6a353 100644
--- a/docz/docs/03-demos/42-engines/02-v8.md
+++ b/docz/docs/03-demos/42-engines/02-v8.md
@@ -146,11 +146,11 @@ This demo was tested in the following deployments:
| V8 Version | Platform | OS Version | Compiler | Date |
|:--------------|:-------------|:--------------|:-----------------|:-----------|
-| `13.7.5` | `darwin-x64` | macOS 15.3.2 | `clang 16.0.0` | 2025-03-31 |
+| `15.1.102` | `darwin-x64` | macOS 15.7.4 | `clang 17.0.0` | 2026-06-13 |
| `13.5.92` | `darwin-arm` | macOS 14.5 | `clang 16.0.0` | 2025-02-15 |
| `13.8.124` | `win11-x64` | Windows 11 | `CL 19.43.34810` | 2025-05-11 |
| `13.5.92` | `linux-x64` | Ubuntu 24.04 | `gcc 13.3.0` | 2025-06-16 |
-| `13.5.92` | `linux-arm` | Debian 12 | `gcc 12.2.0` | 2025-02-15 |
+| `13.8.124` | `linux-arm` | Debian 12 | `gcc 14.2.0` | 2026-06-14 |
:::
@@ -449,19 +449,30 @@ The recommended fix is to delete the referenced folder and re-run `gclient sync`
-5) Checkout the desired version. The following command pulls `13.8.124`:
+5) Checkout the desired version. The following command pulls `15.1.102`:
```bash
-git checkout tags/13.8.124 -b sample
+git checkout tags/15.1.102 -b sample
```
+:::info pass
+
+The ["Tested Deployments" table](#complete-example) includes the exact versions
+that were tested on various platforms. It is strongly recommeded to use the
+tested versions as they have been explicitly verified by SheetJS teammates.
+
+**Please reach out to [the SheetJS chat](https://sheetjs.com/chat) if there are
+any issues not mentioned in the demo page.**
+
+:::
+
:::caution pass
The official documentation recommends:
```bash
-git checkout refs/tags/13.8.124 -b sample -t
+git checkout refs/tags/15.1.102 -b sample -t
```
This command failed in local testing:
@@ -480,17 +491,33 @@ fatal: cannot set up tracking information; starting point 'refs/tags/13.8.124' i
+Run the following command. It may fail.
+
```bash
tools/dev/v8gen.py x64.release.sample
+```
+
+Append the following lines to `out.gn/x64.release.sample/args.gn`:
+
+```text title="out.gn/x64.release.sample/args.gn (add to file)"
+v8_enable_sandbox = false
+use_allocator_shim = false
+v8_enable_temporal_support = false
+```
+
+Run the build:
+
+```bash
+gn gen out.gn/x64.release.sample/
ninja -C out.gn/x64.release.sample v8_monolith
```
-:::caution pass
+:::info pass
**This may not work in newer Python releases due to a breaking change!**
Python 3.13 removed the `pipes` module from the standard library[^7]. `v8gen.py`
-will fail on newer Python releases with the following traceback:
+may fail on newer Python releases with the following traceback:
```
Traceback (most recent call last):
@@ -567,6 +594,8 @@ treat_warnings_as_errors = false
+Run the following command. It may fail.
+
```bash
tools/dev/v8gen.py arm64.release.sample
```
@@ -576,11 +605,14 @@ Append the following lines to `out.gn/arm64.release.sample/args.gn`:
```text title="out.gn/arm64.release.sample/args.gn (add to file)"
is_clang = false
treat_warnings_as_errors = false
+v8_enable_sandbox = false
+v8_enable_temporal_support = false
```
Run the build:
```bash
+gn gen out.gn/arm64.release.sample/
ninja -C out.gn/arm64.release.sample v8_monolith
```
@@ -628,6 +660,22 @@ adding `false &&` to the `elif` preprocessor directives:
int8x8_t x;
```
+There may be a block in `src/objects/simd.cc` that includes `arm_neon.h`. If
+this block is present, the entire `ifdef` clause should be commented:
+
+```cpp title="src/objects/simd.cc (edit highlighted lines)"
+
+#ifdef V8_HOST_ARCH_ARM64
+// We use Neon only on 64-bit ARM (because on 32-bit, some instructions and some
+// types are not available). Note that ARM64 is guaranteed to have Neon.
+//highlight-start
+//#define NEON64
+//#include
+//highlight-end
+#endif
+
+```
+
:::
:::note pass
@@ -742,10 +790,27 @@ ninja -C out.gn\x64.release.sample v8_monolith
```bash
g++ -I. -Iinclude samples/hello-world.cc -o hello_world -fno-rtti -lv8_monolith \
-ldl -Lout.gn/x64.release.sample/obj/ -pthread \
- -std=c++20 -DV8_COMPRESS_POINTERS=1 -DV8_ENABLE_SANDBOX -framework Foundation
+ -std=c++20 -DV8_COMPRESS_POINTERS=1 -framework Foundation
./hello_world
```
+:::caution pass
+
+In some tests, the `hello_world` program failed with a message referencing ICU:
+
+```
+Failed to initialize ICU
+```
+
+`icudtl.dat` must be copied to the folder with the `hello_world` program:
+
+```bash
+cp out.gn/x64.release.sample/icudtl.dat .
+./hello_world
+```
+
+:::
+
:::info pass
In older V8 versions, the flags `-lv8_libbase -lv8_libplatform` were required.
@@ -798,7 +863,7 @@ g++ -I. -Iinclude samples/hello-world.cc -o hello_world -fno-rtti -lv8_monolith
```bash
g++ -I. -Iinclude samples/hello-world.cc -o hello_world -fno-rtti -lv8_monolith \
-lv8_libbase -lv8_libplatform -ldl -Lout.gn/arm64.release.sample/obj/ -pthread \
- -std=c++20 -DV8_COMPRESS_POINTERS=1 -DV8_ENABLE_SANDBOX
+ -std=c++20 -DV8_COMPRESS_POINTERS=1
./hello_world
```
@@ -878,6 +943,12 @@ cp ~/dev/v8/v8/samples/hello-world.cc .
```bash
ln -s ~/dev/v8/v8/include
ln -s ~/dev/v8/v8/out.gn/x64.release.sample/obj
+```
+
+In addition, `icudtl.dat` must be copied to this folder:
+
+```bash
+cp ~/dev/v8/v8/out.gn/*/icudtl.dat .
```
@@ -952,7 +1023,16 @@ g++ -I. -Iinclude hello-world.cc -o hello_world -fno-rtti -lv8_monolith \
:::caution pass
-On macOS, in some V8 versions, the `Foundation` framework is required:
+On macOS, some builds fail due to undefined symbols starting with `_CF`:
+
+```
+Undefined symbols for architecture x86_64:
+ "_CFRelease", referenced from:
+ absl::time_internal::cctz::local_time_zone() in libv8_monolith.a[777](time_zone_lookup.o)
+```
+
+These symbols are provided by `Foundation` framework. `-framework Foundation`
+must be added to the build step:
```bash
g++ -I. -Iinclude hello-world.cc -o hello_world -fno-rtti -lv8_monolith \
@@ -963,6 +1043,27 @@ g++ -I. -Iinclude hello-world.cc -o hello_world -fno-rtti -lv8_monolith \
:::
+:::caution pass
+
+In some tests, the `hello_world` program failed with a sandbox error:
+
+```
+# Embedder-vs-V8 build configuration mismatch. On embedder side sandbox is ENABLED while on V8 side it's DISABLED.
+```
+
+If the sandbox was disabled earlier, the `-DV8_ENABLE_SANDBOX` must be removed.
+For example, the following build command works with V8 `15.1.102` on Intel Mac:
+
+```bash
+g++ -I. -Iinclude hello-world.cc -o hello_world -fno-rtti -lv8_monolith \
+ -ldl -Lobj/ -pthread -std=c++20 \
+ -DV8_COMPRESS_POINTERS=1 -framework Foundation
+./hello_world
+```
+
+:::
+
+
@@ -1026,7 +1127,16 @@ g++ -I. -Iinclude sheetjs.v8.cc -o sheetjs.v8 -fno-rtti -lv8_monolith \
:::caution pass
-On macOS, in some V8 versions, the `Foundation` framework is required:
+On macOS, some builds fail due to undefined symbols starting with `_CF`:
+
+```
+Undefined symbols for architecture x86_64:
+ "_CFRelease", referenced from:
+ absl::time_internal::cctz::local_time_zone() in libv8_monolith.a[777](time_zone_lookup.o)
+```
+
+These symbols are provided by `Foundation` framework. `-framework Foundation`
+must be added to the build step:
```bash
g++ -I. -Iinclude sheetjs.v8.cc -o sheetjs.v8 -fno-rtti -lv8_monolith \
@@ -1055,6 +1165,26 @@ cl /MT /I..\v8\v8\ /I..\v8\v8\include sheetjs.v8.cc /GR- v8_monolith.lib Advapi3
./sheetjs.v8 pres.numbers
```
+:::caution pass
+
+In some tests, the `hello_world` program failed with a sandbox error:
+
+```
+# Embedder-vs-V8 build configuration mismatch. On embedder side sandbox is ENABLED while on V8 side it's DISABLED.
+```
+
+If the sandbox was disabled earlier, the `-DV8_ENABLE_SANDBOX` must be removed.
+For example, the following build command works with V8 `15.1.102` on Intel Mac:
+
+```bash
+g++ -I. -Iinclude sheetjs.v8.cc -o sheetjs.v8 -fno-rtti -lv8_monolith \
+ -ldl -Lobj/ -pthread -std=c++20 \
+ -DV8_COMPRESS_POINTERS=1 -framework Foundation
+./sheetjs.v8 pres.numbers
+```
+
+:::
+
@@ -1098,7 +1228,7 @@ This demo was last tested in the following deployments:
|:-------------|:----------|:-----------|
| `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-x64` | `150.0.0` | 2026-06-14 |
| `win11-arm` | `145.0.0` | 2026-02-02 |
| `linux-x64` | `142.2.0` | 2026-01-08 |
| `linux-arm` | `146.3.0` | 2026-03-07 |
@@ -1175,7 +1305,7 @@ curl.exe -L -o src/main.rs https://docs.sheetjs.com/v8/main.rs
:::info pass
There were multiple breaking changes in the `v8` crate. This example was tested
-against version `142.2.0`.
+against versions `142.2.0` and `150.0.0`.
Older versions of this demo script were designed for older `v8` versions. They
are available in the source repo for the documentation. Please reach out to the
@@ -1212,7 +1342,7 @@ This demo was last tested in the following deployments:
| Architecture | V8 Version | Javet | Java | Date |
|:-------------|:--------------|:--------|:----------|:-----------|
-| `darwin-x64` | `13.2.152.16` | `4.1.1` | `24.0.1` | 2025-04-21 |
+| `darwin-x64` | `13.2.152.16` | `4.1.1` | `25.0.2` | 2026-06-13 |
| `darwin-arm` | `13.2.152.16` | `4.1.1` | `17.0.14` | 2026-03-04 |
| `win11-x64` | `13.2.152.16` | `4.1.1` | `17.0.12` | 2026-03-04 |
| `win11-arm` | `13.2.152.16` | `4.1.1` | `25.0.2` | 2026-03-04 |
@@ -1447,7 +1577,7 @@ This demo was last tested in the following deployments:
|:-------------|:--------------|:-----------|
| `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-x64` | `14.7.173.23` | 2026-06-14 |
| `win11-arm` | `12.3.219.12` | 2025-02-23 |
| `linux-x64` | `12.3.219.12` | 2026-03-06 |
| `linux-arm` | `13.3.415.23` | 2026-03-07 |
@@ -1525,7 +1655,7 @@ dotnet run
4) Add ClearScript to the project:
```bash
-dotnet add package Microsoft.ClearScript.Complete --version 7.5.0
+dotnet add package Microsoft.ClearScript.Complete --version 7.5.1
```
5) Download the SheetJS standalone script and test file. Move both files to the
@@ -1740,8 +1870,8 @@ This demo was last tested in the following deployments:
|:-------------|:--------------|:----------|:-----------|
| `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 |
+| `win11-x64` | `15.0.245.2` | `150.0.0` | 2026-06-14 |
+| `linux-x64` | `15.0.245.2` | `150.0.0` | 2026-06-14 |
| `linux-arm` | `13.5.212.10` | `136.0.0` | 2026-03-07 |
:::
@@ -1828,7 +1958,7 @@ mv target/release/sheet2csv .
```bash
-mv target/release/sheet2csv.exe .
+move target\release\sheet2csv.exe .
.\sheet2csv.exe pres.numbers
```
diff --git a/docz/docs/03-demos/42-engines/06-goja.md b/docz/docs/03-demos/42-engines/06-goja.md
index ffa4737..e5b7723 100644
--- a/docz/docs/03-demos/42-engines/06-goja.md
+++ b/docz/docs/03-demos/42-engines/06-goja.md
@@ -108,8 +108,8 @@ This demo was tested in the following deployments:
| `darwin-x64` | `651366f` | `1.25.6` | 2026-01-21 |
| `darwin-arm` | `6a7976c` | `1.24.0` | 2026-03-07 |
| `win11-x64` | `6a7976c` | `1.24.2` | 2026-03-08 |
-| `win11-arm` | `065cd970` | `1.26.1` | 2026-03-22 |
-| `linux-x64` | `cb187b0` | `1.22.2` | 2025-06-16 |
+| `win11-arm` | `065cd97` | `1.26.1` | 2026-03-22 |
+| `linux-x64` | `348e6be` | `1.25.11` | 2026-06-14 |
| `linux-arm` | `6a7976c` | `1.24.4` | 2026-03-07 |
At the time of writing, Goja did not have proper version numbers. Versions are
diff --git a/docz/docs/03-demos/42-engines/09-hermes.md b/docz/docs/03-demos/42-engines/09-hermes.md
index 6f1d413..9fb1668 100644
--- a/docz/docs/03-demos/42-engines/09-hermes.md
+++ b/docz/docs/03-demos/42-engines/09-hermes.md
@@ -366,7 +366,7 @@ This demo was tested in the following deployments:
|:-------------|:-----------|:-----------|
| `darwin-x64` | `f45c6bc` | 2026-03-06 |
| `darwin-arm` | `f45c6bc` | 2026-01-23 |
-| `linux-x64` | `8ef11b4` | 2025-04-21 |
+| `linux-x64` | `f45c6bc` | 2026-06-14 |
| `linux-arm` | `f45c6bc` | 2026-03-07 |
The main Hermes source tree does not have Windows support. The `hermes-windows`
@@ -914,7 +914,7 @@ This demo was tested in the following deployments:
| `darwin-arm` | `0.13.0` | 2026-03-06 |
| `win11-x64` | `0.13.0` | 2026-05-10 |
| `win11-arm` | `0.13.0` | 2025-02-23 |
-| `linux-x64` | `0.13.0` | 2025-04-21 |
+| `linux-x64` | `0.13.0` | 2026-06-14 |
| `linux-arm` | `0.13.0` | 2026-03-07 |
When this demo was last tested, `jsvu` did not install a native `linux-arm`
diff --git a/docz/static/cli/Cargo.toml b/docz/static/cli/Cargo.toml
index 6d4f263..2b72e0a 100644
--- a/docz/static/cli/Cargo.toml
+++ b/docz/static/cli/Cargo.toml
@@ -4,7 +4,7 @@ version = "0.1.0"
edition = "2021"
[dependencies]
-v8 = "136.0.0"
+v8 = "150.0.0"
[[bin]]
name = "sheet2csv"
diff --git a/docz/static/cli/sheet2csv.rs b/docz/static/cli/sheet2csv.rs
index c6e38b5..60a5c8b 100644
--- a/docz/static/cli/sheet2csv.rs
+++ b/docz/static/cli/sheet2csv.rs
@@ -1,5 +1,8 @@
+/*! sheetjs (C) SheetJS -- https://sheetjs.com */
/* run code, get result as a Rust String */
-fn eval_code(scope: &mut v8::HandleScope, code: &str) -> std::string::String {
+fn eval_code(scope: &mut v8::PinScope, code: &str) -> std::string::String {
+ let scope = std::pin::pin!(v8::HandleScope::new(scope));
+ let scope = &mut scope.init();
let source = v8::String::new(scope, code).unwrap();
let script = v8::Script::compile(scope, source, None).unwrap();
let result = script.run(scope).unwrap();
@@ -7,7 +10,9 @@ fn eval_code(scope: &mut v8::HandleScope, code: &str) -> std::string::String {
}
/* assuming JS code returns an ArrayBuffer, copy result to a Vec */
-fn eval_code_ab(scope: &mut v8::HandleScope, code: &str) -> Vec {
+fn eval_code_ab(scope: &mut v8::PinScope, code: &str) -> Vec {
+ let scope = std::pin::pin!(v8::HandleScope::new(scope));
+ let scope = &mut scope.init();
let source = v8::String::new(scope, code).unwrap();
let script = v8::Script::compile(scope, source, None).unwrap();
let result: v8::Local = script.run(scope).unwrap().try_into().unwrap();
@@ -30,11 +35,11 @@ fn main() {
/* read snapshot */
let startup_data: Vec = include_bytes!("./snapshot.bin").to_vec();
- let params = v8::Isolate::create_params().snapshot_blob(startup_data);
- let isolate = &mut v8::Isolate::new(params);
- let handle_scope = &mut v8::HandleScope::new(isolate);
- let context = v8::Context::new(handle_scope, Default::default());
- let context_scope = &mut v8::ContextScope::new(handle_scope, context);
+ let params = v8::Isolate::create_params().snapshot_blob(startup_data.into());
+ let mut isolate = v8::Isolate::new(params);
+ v8::scope!(let scope, &mut isolate);
+ let context = v8::Context::new(scope, Default::default());
+ let context_scope = &mut v8::ContextScope::new(scope, context);
/* read file */
{
diff --git a/docz/static/cli/snapshot.rs b/docz/static/cli/snapshot.rs
index c44732f..29364c8 100644
--- a/docz/static/cli/snapshot.rs
+++ b/docz/static/cli/snapshot.rs
@@ -1,6 +1,8 @@
/*! sheetjs (C) SheetJS -- https://sheetjs.com */
/* run code and ignore result */
-fn eval_code(scope: &mut v8::HandleScope, code: &str) {
+fn eval_code(scope: &mut v8::PinScope, code: &str) {
+ let scope = std::pin::pin!(v8::HandleScope::new(scope));
+ let scope = &mut scope.init();
let source = v8::String::new(scope, code).unwrap();
let script = v8::Script::compile(scope, source, None).unwrap();
let _ = script.run(scope);
@@ -18,9 +20,9 @@ fn main() {
/* scope enforces the lifetime of the `&mut isolate` in `handle_scope` */
{
/* same steps as normal flow */
- let handle_scope = &mut v8::HandleScope::new(&mut isolate);
- let context = v8::Context::new(handle_scope, Default::default());
- let context_scope = &mut v8::ContextScope::new(handle_scope, context);
+ v8::scope!(let scope, &mut isolate);
+ let context = v8::Context::new(scope, Default::default());
+ let context_scope = &mut v8::ContextScope::new(scope, context);
/* instructs the snapshot creator to dump the new context */
context_scope.set_default_context(context);
diff --git a/docz/static/lynx/App.tsx b/docz/static/lynx/App.tsx
index f23ad9f..4826ec6 100644
--- a/docz/static/lynx/App.tsx
+++ b/docz/static/lynx/App.tsx
@@ -3,7 +3,7 @@
import './App.css'
import { useCallback, useState } from '@lynx-js/react'
import SheetJSLogo from './assets/SheetJS-logo.png';
-import { read, utils, WorkSheet } from 'xlsx';
+import { read, utils, type WorkSheet } from 'xlsx';
const make_width = (ws: WorkSheet): number[] => {
const aoa = utils.sheet_to_json(ws, { header: 1 }), res: number[] = [];
diff --git a/tests/engines/duktape-perl.sh b/tests/engines/duktape-perl.sh
index fbbd7fb..5bbbb7f 100755
--- a/tests/engines/duktape-perl.sh
+++ b/tests/engines/duktape-perl.sh
@@ -11,9 +11,10 @@ curl -LO https://docs.sheetjs.com/duk/SheetJSDuk.pl
curl -LO https://cdn.sheetjs.com/xlsx-0.20.3/package/dist/xlsx.extendscript.js
curl -LO https://docs.sheetjs.com/pres.xlsx
-perl SheetJSDuk.pl pres.xlsx; echo $?
+perl SheetJSDuk.pl pres.xlsx
+PERL_EXIT=$?
-npx -y xlsx-cli SheetJSDuk.xlsb
+if [ $PERL_EXIT -ne 0 ] || [ ! -f SheetJSDuk.xlsb ]; then
cat <