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