diff --git a/Makefile b/Makefile
index 44bf7a2..514a108 100644
--- a/Makefile
+++ b/Makefile
@@ -12,7 +12,7 @@ init:
.PHONY: dev
dev:
- cd docz; npm run start -- --host=0.0.0.0 --no-open; cd ..
+ cd docz; npm run start -- --host=0.0.0.0 --port 6996 --no-open; cd ..
.PHONY: serve
serve:
diff --git a/README.md b/README.md
index ade36a5..a24f633 100644
--- a/README.md
+++ b/README.md
@@ -16,7 +16,7 @@ $ make init # install dependencies
$ make # build static site
$ make serve # serve static site
-$ make dev # run dev server
+$ make dev # run dev server on port 6996
$ make spell # spell check (.spelling custom dictionary)
$ make graph # build format graph and legend
```
diff --git a/docz/docs/03-demos/03-net/03-server/19-fastify.md b/docz/docs/03-demos/03-net/03-server/19-fastify.md
index c1bed7f..526c4ad 100644
--- a/docz/docs/03-demos/03-net/03-server/19-fastify.md
+++ b/docz/docs/03-demos/03-net/03-server/19-fastify.md
@@ -25,8 +25,8 @@ This demo was tested in the following deployments:
| Version | Date |
|:---------|:-----------|
-| `4.29.0` | 2025-01-02 |
-| `5.2.0` | 2025-01-02 |
+| `4.29.1` | 2025-09-13 |
+| `5.6.0` | 2025-09-13 |
:::
@@ -37,10 +37,10 @@ imported from scripts that use FastifyJS.
### Exporting Data to Workbooks (GET)
-The SheetJS `write` method[^1] with the option `type: "buffer"` generates NodeJS
-Buffer objects containing the raw file data.
+The SheetJS [`write`](/docs/api/write-options) method generates NodeJS `Buffer`
+objects containing the raw file data (using the option `type: "buffer"`[^1]).
-FastifyJS can directly handle `Buffer` data in `Response#end`
+FastifyJS can directly handle `Buffer` data in `Response#end`.
The exported filename can be specified using the `Content-Disposition` header.
@@ -162,7 +162,7 @@ fastify.listen({port: process.env.PORT || 3000}, (err, addr) => { if(err) throw
1) Install dependencies:
{`\
-npm i --save https://cdn.sheetjs.com/xlsx-${current}/xlsx-${current}.tgz fastify@4.29.0 @fastify/multipart@8`}
+npm i --save https://cdn.sheetjs.com/xlsx-${current}/xlsx-${current}.tgz fastify@4.29.1 @fastify/multipart@8`}
2) Start server
diff --git a/docz/docs/03-demos/12-static/01-lume.md b/docz/docs/03-demos/12-static/01-lume.md
index 9e11255..5e87e8f 100644
--- a/docz/docs/03-demos/12-static/01-lume.md
+++ b/docz/docs/03-demos/12-static/01-lume.md
@@ -8,6 +8,11 @@ sidebar_custom_props:
type: native
---
+import current from '/version.js';
+import Tabs from '@theme/Tabs';
+import TabItem from '@theme/TabItem';
+import CodeBlock from '@theme/CodeBlock';
+
[Lume](https://lume.land/) is a lightweight unopinionated static site generator.
It has a rich ecosystem of JavaScript-powered plugins[^1]
@@ -23,8 +28,11 @@ powered by an XLSX spreadsheet.
## Integration Details
The official "Sheets" plugin[^2] uses SheetJS to load data from spreadsheets.
-Under the hood, the plugin uses the SheetJS `read`[^3] method to parse files and
-the `sheet_to_json`[^4] method to generate arrays of objects.
+Under the hood, the plugin uses the following SheetJS methods:
+
+- [`read`](/docs/api/parse-options) parses spreadsheet files.
+- [`sheet_to_json`](/docs/api/utilities/array#array-output) generates arrays of
+ objects from worksheet data.
Lume supports refreshing data during development. The generated static sites
include the raw data without referencing the underlying spreadsheet files.
@@ -113,7 +121,7 @@ named `"VicePresidents"`, then the following snippet would print data from the
#### File Formats
-As explained in the official plugin documentation[^5], the loader loads XLSX.
+As explained in the official plugin documentation[^3], the loader loads XLSX.
NUMBERS, and CSV files. Other extensions can be added through the `extensions`
property in the argument to the `sheets` plugin:
@@ -133,8 +141,9 @@ This demo was tested in the following environments:
| Lume | Date |
|:---------|:-----------|
-| `1.19.4` | 2025-01-02 |
-| `2.4.3` | 2025-01-02 |
+| `1.19.4` | 2025-09-13 |
+| `2.5.3` | 2025-09-13 |
+| `3.0.9` | 2025-09-13 |
This example uses the Nunjucks template format. Lume plugins support additional
template formats, including Markdown and JSX.
@@ -143,26 +152,24 @@ template formats, including Markdown and JSX.
### Initial Setup
-0) Install Deno[^6]
+0) Install Deno[^4]
1) Create a stock site:
+
+
+
```bash
mkdir -p sheetjs-lume
cd sheetjs-lume
-deno run -Ar https://deno.land/x/lume@v2.4.3/init.ts
+deno run -Ar https://deno.land/x/lume@v1.19.4/init.ts
```
-When prompted, enter the following options. The initialization script has
-changed over time, so not all questions will be asked.
+When prompted, enter the following options:
-- `What kind of setup do you want?`: select `Basic + plugins`
- `Choose the configuration file format`: select `_config.ts`
- `Do you want to install some plugins now?`: select `Yes`
-- `Select the plugins to install`: select `sheets` and `nunjucks`
-- `Do you want to setup a CMS?`: select `No` or `Maybe later`
-
-The project will be configured and modules will be installed.
+- `Select the plugins to install`: select `sheets` and press Enter
:::note pass
@@ -170,6 +177,53 @@ The `nunjucks` plugin was included by default in Lume version 1.
:::
+
+
+
+```bash
+mkdir -p sheetjs-lume
+cd sheetjs-lume
+deno run -Ar https://deno.land/x/lume@v2.5.3/init.ts
+```
+
+When prompted, enter the following options:
+
+- `What kind of setup do you want?`: select `Basic + plugins`
+- `Select the plugins to install`: select `sheets` and `nunjucks`
+- `Do you want to setup a CMS?`: select `No` or `Maybe later`
+
+:::note pass
+
+The `nunjucks` plugin is not included by default in Lume version 2.
+
+:::
+
+
+
+
+```bash
+mkdir -p sheetjs-lume
+cd sheetjs-lume
+deno run -A https://lume.land/init.ts
+```
+
+When prompted, enter the following options:
+
+- `What kind of setup do you want?`: select `Basic + plugins`
+- `Select the plugins to install`: select `sheets` and `nunjucks`
+- `Do you want to setup a CMS?`: select `No` or `Maybe later`
+
+:::note pass
+
+The `nunjucks` plugin is not included by default in Lume version 3.
+
+:::
+
+
+
+
+The project will be configured and modules will be installed.
+
2) Download https://docs.sheetjs.com/pres.xlsx and place in a `_data` subfolder:
```bash
@@ -244,7 +298,5 @@ This site is self-contained and ready for deployment!
[^1]: See ["Plugins"](https://lume.land/plugins/?status=all) in the Lume documentation
[^2]: See ["Sheets"](https://lume.land/plugins/sheets/) in the Lume documentation
-[^3]: See [`read` in "Reading Files"](/docs/api/parse-options)
-[^4]: See [`sheet_to_json` in "Utilities"](/docs/api/utilities/array#array-output)
-[^5]: See ["Formats"](https://lume.land/plugins/sheets/#formats) in the Lume documentation
-[^6]: See ["Installation"](https://deno.com/manual/getting_started/installation) in the Deno documentation
\ No newline at end of file
+[^3]: See ["Formats"](https://lume.land/plugins/sheets/#formats) in the Lume documentation
+[^4]: See ["Installation"](https://docs.deno.com/runtime/getting_started/installation/) in the Deno documentation
\ No newline at end of file
diff --git a/docz/docs/03-demos/12-static/02-gatsbyjs.md b/docz/docs/03-demos/12-static/02-gatsbyjs.md
index eec3187..58eca8d 100644
--- a/docz/docs/03-demos/12-static/02-gatsbyjs.md
+++ b/docz/docs/03-demos/12-static/02-gatsbyjs.md
@@ -191,8 +191,8 @@ This demo was tested in the following environments:
| GatsbyJS | Date |
|:---------|:-----------|
-| `5.14.1` | 2025-01-19 |
-| `4.25.8` | 2025-01-02 |
+| `5.15.0` | 2025-09-13 |
+| `4.25.8` | 2025-09-13 |
:::
@@ -241,6 +241,7 @@ git clone https://github.com/gatsbyjs/gatsby-starter-default sheetjs-gatsby
cd sheetjs-gatsby
git checkout 6bc4466090845f20650117b3d27e68e6e46dc8d5
npm install
+mkdir .cache
cd ..
```
@@ -250,6 +251,7 @@ cd ..
```bash
cd sheetjs-gatsby
+npm i
npm run develop
```
diff --git a/docz/docs/03-demos/32-extensions/02-chromium.md b/docz/docs/03-demos/32-extensions/02-chromium.md
index 9ae12a3..21aa908 100644
--- a/docz/docs/03-demos/32-extensions/02-chromium.md
+++ b/docz/docs/03-demos/32-extensions/02-chromium.md
@@ -23,9 +23,10 @@ tables with a content script and a background script.
This demo was tested in the following deployments:
-| Platform | Date |
-|:-------------|:-----------|
-| Chromium 131 | 2025-01-02 |
+| Platform | Version | Date |
+|:-------------|:--------|:-----------|
+| Chromium 140 | V3 | 2025-09-13 |
+| Chromium 137 | V2 | 2025-09-13 |
:::
@@ -33,8 +34,7 @@ This demo was tested in the following deployments:
This demo showcases Manifest V2 and Manifest V3 extensions.
-Chrome Web Store will not accept new V2 extensions, but these can be sideloaded
-using the "Load unpacked" extension option in Developer mode.
+Chrome 138 and later no longer support Manifest V2 extensions.
**New Chrome and Chromium Extensions should use Manifest V3!**
diff --git a/docz/static/chromium/SheetJSChromiumUnpackedV2.zip b/docz/static/chromium/SheetJSChromiumUnpackedV2.zip
index e5b3ab6..2526006 100644
Binary files a/docz/static/chromium/SheetJSChromiumUnpackedV2.zip and b/docz/static/chromium/SheetJSChromiumUnpackedV2.zip differ
diff --git a/docz/static/chromium/SheetJSChromiumUnpackedV3.zip b/docz/static/chromium/SheetJSChromiumUnpackedV3.zip
index e3f8128..746de7e 100644
Binary files a/docz/static/chromium/SheetJSChromiumUnpackedV3.zip and b/docz/static/chromium/SheetJSChromiumUnpackedV3.zip differ
diff --git a/tests/tutorials/export/bun.sh b/tests/tutorials/export/bun.sh
new file mode 100755
index 0000000..3bc931b
--- /dev/null
+++ b/tests/tutorials/export/bun.sh
@@ -0,0 +1,51 @@
+#!/bin/bash
+# https://docs.sheetjs.com/docs/getting-started/installation/deno
+
+cd /tmp
+rm -rf sheetjs-bun
+mkdir sheetjs-bun
+cd sheetjs-bun
+
+bun init -y
+bun i --save https://cdn.sheetjs.com/xlsx-0.20.3/xlsx-0.20.3.tgz
+
+cat <SheetJSNodeJS.js
+const XLSX = require("xlsx");
+
+(async() => {
+ /* fetch JSON data and parse */
+ const url = "https://docs.sheetjs.com/executive.json";
+ const raw_data = await (await fetch(url)).json();
+
+ /* filter for the Presidents */
+ const prez = raw_data.filter(row => row.terms.some(term => term.type === "prez"));
+
+ /* sort by first presidential term */
+ prez.forEach(row => row.start = row.terms.find(term => term.type === "prez").start);
+ prez.sort((l,r) => l.start.localeCompare(r.start));
+
+ /* flatten objects */
+ const rows = prez.map(row => ({
+ name: row.name.first + " " + row.name.last,
+ birthday: row.bio.birthday
+ }));
+
+ /* generate worksheet and workbook */
+ const worksheet = XLSX.utils.json_to_sheet(rows);
+ const workbook = XLSX.utils.book_new();
+ XLSX.utils.book_append_sheet(workbook, worksheet, "Dates");
+
+ /* fix headers */
+ XLSX.utils.sheet_add_aoa(worksheet, [["Name", "Birthday"]], { origin: "A1" });
+
+ /* calculate column width */
+ const max_width = rows.reduce((w, r) => Math.max(w, r.name.length), 10);
+ worksheet["!cols"] = [ { wch: max_width } ];
+
+ /* create an XLSX file and try to save to Presidents.xlsx */
+ XLSX.writeFile(workbook, "Presidents.xlsx", { compression: true });
+})();
+EOF
+
+bun SheetJSNodeJS.js
+npx xlsx-cli Presidents.xlsx | head
diff --git a/tests/tutorials/export/deno.sh b/tests/tutorials/export/deno.sh
new file mode 100755
index 0000000..24feed0
--- /dev/null
+++ b/tests/tutorials/export/deno.sh
@@ -0,0 +1,47 @@
+#!/bin/bash
+# https://docs.sheetjs.com/docs/getting-started/installation/deno
+
+cd /tmp
+rm -rf sheetjs-deno
+mkdir sheetjs-deno
+cd sheetjs-deno
+
+cat <SheetJSDeno.ts
+// @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';
+
+/* fetch JSON data and parse */
+const url = "https://docs.sheetjs.com/executive.json";
+const raw_data = await (await fetch(url)).json();
+
+/* filter for the Presidents */
+const prez = raw_data.filter((row: any) => row.terms.some((term: any) => term.type === "prez"));
+
+/* sort by first presidential term */
+prez.forEach(row => row.start = row.terms.find(term => term.type === "prez").start);
+prez.sort((l,r) => l.start.localeCompare(r.start));
+
+/* flatten objects */
+const rows = prez.map((row: any) => ({
+ name: row.name.first + " " + row.name.last,
+ birthday: row.bio.birthday
+}));
+
+/* generate worksheet and workbook */
+const worksheet = XLSX.utils.json_to_sheet(rows);
+const workbook = XLSX.utils.book_new();
+XLSX.utils.book_append_sheet(workbook, worksheet, "Dates");
+
+/* fix headers */
+XLSX.utils.sheet_add_aoa(worksheet, [["Name", "Birthday"]], { origin: "A1" });
+
+/* calculate column width */
+const max_width = rows.reduce((w: number, r: any) => Math.max(w, r.name.length), 10);
+worksheet["!cols"] = [ { wch: max_width } ];
+
+/* create an XLSX file and try to save to Presidents.xlsx */
+XLSX.writeFile(workbook, "Presidents.xlsx", { compression: true });
+EOF
+
+deno run -A SheetJSDeno.ts
+npx xlsx-cli Presidents.xlsx | head
diff --git a/tests/tutorials/export/node.sh b/tests/tutorials/export/node.sh
new file mode 100755
index 0000000..d1df172
--- /dev/null
+++ b/tests/tutorials/export/node.sh
@@ -0,0 +1,51 @@
+#!/bin/bash
+# https://docs.sheetjs.com/docs/getting-started/installation/deno
+
+cd /tmp
+rm -rf sheetjs-node
+mkdir sheetjs-node
+cd sheetjs-node
+
+npm init -y
+npm i --save https://cdn.sheetjs.com/xlsx-0.20.3/xlsx-0.20.3.tgz
+
+cat <SheetJSNodeJS.js
+const XLSX = require("xlsx");
+
+(async() => {
+ /* fetch JSON data and parse */
+ const url = "https://docs.sheetjs.com/executive.json";
+ const raw_data = await (await fetch(url)).json();
+
+ /* filter for the Presidents */
+ const prez = raw_data.filter(row => row.terms.some(term => term.type === "prez"));
+
+ /* sort by first presidential term */
+ prez.forEach(row => row.start = row.terms.find(term => term.type === "prez").start);
+ prez.sort((l,r) => l.start.localeCompare(r.start));
+
+ /* flatten objects */
+ const rows = prez.map(row => ({
+ name: row.name.first + " " + row.name.last,
+ birthday: row.bio.birthday
+ }));
+
+ /* generate worksheet and workbook */
+ const worksheet = XLSX.utils.json_to_sheet(rows);
+ const workbook = XLSX.utils.book_new();
+ XLSX.utils.book_append_sheet(workbook, worksheet, "Dates");
+
+ /* fix headers */
+ XLSX.utils.sheet_add_aoa(worksheet, [["Name", "Birthday"]], { origin: "A1" });
+
+ /* calculate column width */
+ const max_width = rows.reduce((w, r) => Math.max(w, r.name.length), 10);
+ worksheet["!cols"] = [ { wch: max_width } ];
+
+ /* create an XLSX file and try to save to Presidents.xlsx */
+ XLSX.writeFile(workbook, "Presidents.xlsx", { compression: true });
+})();
+EOF
+
+node SheetJSNodeJS.js
+npx xlsx-cli Presidents.xlsx | head