diff --git a/docz/docs/02-getting-started/01-installation/04-amd.md b/docz/docs/02-getting-started/01-installation/04-amd.md index 2400deee..2ff3d3e0 100644 --- a/docz/docs/02-getting-started/01-installation/04-amd.md +++ b/docz/docs/02-getting-started/01-installation/04-amd.md @@ -97,6 +97,8 @@ require(['xlsx'], function(XLSX) { }); ``` +**See the [RequireJS demo](/docs/demos/frontend/bundler/requirejs) for details** + ## Dojo Toolkit Dojo has changed module loading strategies over the years. These examples were diff --git a/docz/docs/03-demos/01-frontend/03-angular.md b/docz/docs/03-demos/01-frontend/03-angular.md index 44844104..52d95d17 100644 --- a/docz/docs/03-demos/01-frontend/03-angular.md +++ b/docz/docs/03-demos/01-frontend/03-angular.md @@ -448,7 +448,8 @@ In the component, `aoa_to_sheet` is used to generate the worksheet: The default angular-cli configuration requires no additional configuration. Some deployments use the SystemJS loader, which does require configuration. -[The SystemJS demo](/docs/demos/bundler#systemjs) describe the required settings. +[The SystemJS demo](/docs/demos/frontend/bundler/systemjs) includes the +required settings. ### Legacy Demo diff --git a/docz/docs/03-demos/01-frontend/19-bundler/11-requirejs.md b/docz/docs/03-demos/01-frontend/19-bundler/11-requirejs.md new file mode 100644 index 00000000..ecc0d9ed --- /dev/null +++ b/docz/docs/03-demos/01-frontend/19-bundler/11-requirejs.md @@ -0,0 +1,225 @@ +--- +title: Bundling Sheets with RequireJS +sidebar_label: RequireJS +pagination_prev: demos/index +pagination_next: demos/grid/index +sidebar_position: 11 +--- + +import current from '/version.js'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import CodeBlock from '@theme/CodeBlock'; + +[RequireJS](https://requirejs.org/) is a JavaScript file and module loader. It +includes an in-browser loader as well as a static optimizer. + +[SheetJS](https://sheetjs.com) is a JavaScript library for reading and writing +data from spreadsheets. + +This demo uses RequireJS and SheetJS to export data. We'll explore how to load +SheetJS in a site using RequireJS and how to use the `r.js` optimizer to create +a bundled site. + +The [Live demo](pathname:///requirejs/requirejs.html) loads RequireJS from the +CDN, uses it to load the standalone script from the SheetJS CDN, and uses the +`XLSX` variable to create a button click handler that creates a workbook. + +:::note + +This demo was last tested on 2023 October 18 against RequireJS `2.3.6` + +::: + +## Integration Details + +The [SheetJS Standalone scripts](/docs/getting-started/installation/standalone) +comply with AMD `define` semantics. They support RequireJS and the `r.js` +optimizer out of the box. + +### Config + +The RequireJS config should set the `xlsx` alias in the `paths` property. + +#### SheetJS CDN + +The SheetJS CDN URL can be directly referenced in a path alias: + +{`\ +require.config({ + baseUrl: ".", + name: "app", + paths: { + // highlight-next-line + xlsx: "https://cdn.sheetjs.com/xlsx-${current}/package/dist/xlsx.full.min" + } +});`} + + + +#### Vendoring + +After downloading the SheetJS standalone script, a relative path can be used in +the path alias. For example, if the standalone script was downloaded in the same +directory as the HTML page, the path should be `./xlsx.full.min`: + +```js +require.config({ + baseUrl: ".", + name: "app", + paths: { + // highlight-next-line + xlsx: "./xlsx.full.min" + } +}); +``` + +### Usage + +Once the alias is set, `"xlsx"` can be required from app scripts: + +```js +// highlight-next-line +require(["xlsx"], function(XLSX) { + /* use XLSX here */ + console.log(XLSX.version); +}); +``` + +Within the callback, the `XLSX` variable exposes the functions listed in the +["API Reference"](/docs/api/) section of the documentation. + +## Complete Example + +This demo will explore the standalone RequireJS script and the `r.js` optimizer. + +### Standalone RequireJS + +0) Download the SheetJS Standalone script and move to the project directory: + + + +{`\ +curl -LO https://cdn.sheetjs.com/xlsx-${current}/package/dist/xlsx.full.min.js`} + + +1) Save the following to `index.html`: + +```html title="index.html" + + + + +

SheetJS Presidents Demo

+ + + + + + +``` + +2) Save the following to `SheetJSRequire.js`: + +```js title="SheetJSRequire.js" +require(["xlsx"], function(XLSX) { + document.getElementById("xport").addEventListener("click", function() { + /* fetch JSON data and parse */ + var url = "https://sheetjs.com/data/executive.json"; + fetch(url).then(function(res) { return res.json(); }).then(function(raw_data) { + + /* filter for the Presidents */ + var prez = raw_data.filter(function(row) { return row.terms.some(function(term) { return term.type === "prez"; }); }); + + /* flatten objects */ + var rows = prez.map(function(row) { return { + name: row.name.first + " " + row.name.last, + birthday: row.bio.birthday + }; }); + + /* generate worksheet and workbook */ + var worksheet = XLSX.utils.json_to_sheet(rows); + var 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 */ + var max_width = rows.reduce(function(w, r) { return Math.max(w, r.name.length); }, 10); + worksheet["!cols"] = [ { wch: max_width } ]; + + /* create an XLSX file and try to save to Presidents.xlsx */ + XLSX.writeFileXLSX(workbook, "Presidents.xlsx"); + }); + }); +}); +``` + +:::info pass + +The `r.js` optimizer does not handle `async` functions or ES6 arrow functions. + +To demonstrate compatibility with older versions of Webpack, `SheetJSRequire.js` +uses normal functions and traditional Promise chains. + +::: + +3) Start a local HTTP server, then go to `http://localhost:8080/` + +```bash +npx http-server . +``` + +Click on "Click here to export" to generate a file. + +### r.js Optimizer + +4) Create `build.js` configuration for the optimizer: + +```js title="build.js" +({ + baseUrl: ".", + name: "SheetJSRequire", + paths: { + xlsx: "./xlsx.full.min" + }, + out: "SheetJSRequire.min.js" +}); +``` + +5) Run the `r.js` optimizer to create `SheetJSRequire.min.js`: + +```bash +npx -p requirejs@2.3.6 r.js -o build.js +``` + +6) Save the following to `optimized.html`: + +```html title="optimized.html" + + + + +

SheetJS Presidents Demo

+ + + + + +``` + +7) Open `http://localhost:8080/optimized.html` + +Click on "Click here to export" to generate a file. diff --git a/docz/docs/03-demos/01-frontend/19-bundler/12-systemjs.md b/docz/docs/03-demos/01-frontend/19-bundler/12-systemjs.md new file mode 100644 index 00000000..c6b4e1a4 --- /dev/null +++ b/docz/docs/03-demos/01-frontend/19-bundler/12-systemjs.md @@ -0,0 +1,225 @@ +--- +title: Bundling Sheets with SystemJS +sidebar_label: SystemJS +pagination_prev: demos/index +pagination_next: demos/grid/index +sidebar_position: 12 +--- + +import current from '/version.js'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import CodeBlock from '@theme/CodeBlock'; + +SystemJS[^1] is a module loader for NodeJS and browsers. + +[SheetJS](https://sheetjs.com) is a JavaScript library for reading and writing +data from spreadsheets. + +This demo uses SystemJS and SheetJS to export data. We'll explore two workflows: + +- ["Browser"](#browser) explores how to load SheetJS with SystemJS using the +in-browser dynamic loader + +- ["NodeJS"](#nodejs) explores how to load SheetJS with SystemJS in NodeJS. + +:::info pass + +This demo was originally written for SystemJS 0.19, the most popular SystemJS +version used with Angular projects. In the years since the release, Angular and +other tools using SystemJS have switched to Webpack. + +::: + +:::note + +This demo was tested against the following SystemJS versions: + +| Version | Date | +|:----------|:-----------| +| `0.19.47` | 2023-10-18 | +| `0.20.19` | 2023-10-18 | +| `0.21.6` | 2023-10-18 | +| `6.14.2` | 2023-10-18 | + +::: + +## Browser + +:::info pass + +The [Live demo](pathname:///systemjs/systemjs.html) loads SystemJS from the +CDN, uses it to load the standalone script from the SheetJS CDN and emulate +a `require` implementation when loading [`main.js`](pathname:///systemjs/main.js) + +"View Source" works on the main HTML page and the `main.js` script. + +::: + +SystemJS fails by default because the library does not export anything in the +web browser. The `meta` configuration option can be used to expose `XLSX`: + +{`\ +SystemJS.config({ + meta: { + 'xlsx': { + exports: 'XLSX' // <-- tell SystemJS to expose the XLSX variable + } + }, + map: { + 'xlsx': 'https://cdn.sheetjs.com/xlsx-${current}/package/dist/xlsx.full.min.js', + 'fs': '', // <--| + 'crypto': '', // <--| suppress native node modules + 'stream': '' // <--| + } +}); +SystemJS.import('main.js'); // load \`main.js\``} + + +With this import, the `main.js` script can freely `require("xlsx")`. + +:::caution Web Workers + +Web Workers can load the SystemJS library with `importScripts`, but the imported +code cannot assign the original worker's `onmessage` callback. The recommended +approach is to expose a global from the required script, For example, supposing +the shared name is `_cb`, the primary worker script would call the callback: + +```js title="worker.js" +/* main worker script */ +importScripts('system.js'); + +SystemJS.config({ /* ... browser config ... */ }); + +onmessage = function(evt) { + SystemJS.import('workermain.js').then(function() { _cb(evt); }); +}; +``` + +The worker script would define and expose the function: + +```js title="workermain.js" +/* Loaded with SystemJS import */ +var XLSX = require('xlsx'); + +_cb = function(evt) { /* ... do work here ... */ }; +``` + +::: + +## NodeJS + +:::caution pass + +While SystemJS works in NodeJS, the built-in `require` should be preferred. + +::: + +### Old Style + +The NodeJS module main script is `xlsx/xlsx.js` and should be mapped: + +```js +SystemJS.config({ + map: { + "xlsx": "./node_modules/xlsx/xlsx.js" + } +}); +``` + +The standalone scripts can be required, but SystemJS config must include a hint +that the script assigns a global: + +```js +SystemJS.config({ + meta: { + "standalone": { format: "global" } + }, + map: { + "standalone": "xlsx.full.min.js" + } +}); +``` + +### New Style + +Newer versions of SystemJS supports "import maps" through `applyImportMap`: + +```js +const SystemJS = require('systemjs'); +const src = require("path").join(process.cwd(), 'node_modules/xlsx/xlsx.js'); +SystemJS.applyImportMap(SystemJS.System, { + imports: { + 'xlsx': "file://" + src, + 'fs': 'node:fs', + 'crypto': 'node:crypto', + 'stream': 'node:stream' + } +}); +```` + +:::caution pass + +In the modern style, importing to the name `XLSX` will cause conflicts. + +**It is strongly recommended to import to the name `_XLSX`!** + +```js +SystemJS.System.import("xlsx").then(function( +// highlight-next-line + _XLSX // use _XLSX instead of XLSX +) { + if(typeof XLSX == "undefined") throw "Import failed!"; + + // XLSX is defined here + console.log(XLSX.version); +}); +``` + +::: + +### NodeJS Demo + +0) Prepare a blank project: + +```bash +mkdir sheetjs-systemjs +cd sheetjs-systemjs +npm init -y +``` + +1) Install the dependencies: + +{`\ +npm i --save https://cdn.sheetjs.com/xlsx-${current}/xlsx-${current}.tgz systemjs@6.14.2`} + + +2) Download [`SheetJSystem.js`](pathname:///systemjs/SheetJSystem.js) and move +to the project folder: + +```bash +curl -LO https://docs.sheetjs.com/systemjs/SheetJSystem.js +``` + +:::info pass + +The script is handles both old-style and new-style SystemJS loaders. + +::: + +3) Run in NodeJS: + +```bash +node SheetJSystem.js +``` + +If the demo worked, `Presidents.xlsx` will be created. + +:::note pass + +As it uses `fetch`, this demo requires Node 18. + +::: + + +[^1]: The project does not have a separate website. The source repository is hosted on [GitHub](https://github.com/systemjs/systemjs) \ No newline at end of file diff --git a/docz/docs/03-demos/01-frontend/19-bundler/index.md b/docz/docs/03-demos/01-frontend/19-bundler/index.md index d13f0631..c64a92be 100644 --- a/docz/docs/03-demos/01-frontend/19-bundler/index.md +++ b/docz/docs/03-demos/01-frontend/19-bundler/index.md @@ -11,6 +11,7 @@ import current from '/version.js'; import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; import CodeBlock from '@theme/CodeBlock'; +import {useCurrentSidebarCategory} from '@docusaurus/theme-common'; SheetJS predates ECMAScript modules and most bundler tools. As best practices have evolved, stress testing SheetJS libraries have revealed bugs in bundlers @@ -23,6 +24,16 @@ considered a bundler bug if the tool cannot properly handle JS libraries. ::: +The following tools are covered in separate pages: + + ## Browserify @@ -481,167 +492,7 @@ click the "Click to Export!" button to generate a file. ## RequireJS -The [SheetJS Standalone scripts](/docs/getting-started/installation/standalone) -comply with AMD `define` semantics. They support RequireJS out of the box. - -The RequireJS config should set the `xlsx` alias in the `paths` property: - -```js -require.config({ - baseUrl: ".", - name: "app", - paths: { - // highlight-next-line - xlsx: "xlsx.full.min" - } -}); -// highlight-next-line -require(["xlsx"], function(XLSX) { - /* use XLSX here */ - console.log(XLSX.version); -}); -``` - -The [Live demo](pathname:///requirejs/requirejs.html) loads RequireJS from the -CDN, uses it to load the standalone script from the SheetJS CDN, and uses the -`XLSX` variable to create a button click handler that creates a workbook. - -The `r.js` optimizer also supports the standalone scripts. - -
Complete Example (click to show) - -:::note - -This demo was last tested on 2023 May 07 against RequireJS `2.3.3` - -::: - -:::caution pass - -The `r.js` optimizer does not support ES6 syntax including arrow functions and -the `async` keyword! The demo JS code uses traditional functions. - -::: - -0) Download the SheetJS Standalone script and move to the project directory: - - - -{`\ -curl -LO https://cdn.sheetjs.com/xlsx-${current}/package/dist/xlsx.full.min.js`} - - -1) Save the following to `index.html`: - -```html title="index.html" - - - - -

SheetJS Presidents Demo

- - - - - - -``` - -2) Save the following to `SheetJSRequire.js`: - -```js title="SheetJSRequire.js" -require(["xlsx"], function(XLSX) { - document.getElementById("xport").addEventListener("click", function() { - /* fetch JSON data and parse */ - var url = "https://sheetjs.com/data/executive.json"; - fetch(url).then(function(res) { return res.json(); }).then(function(raw_data) { - - /* filter for the Presidents */ - var prez = raw_data.filter(function(row) { return row.terms.some(function(term) { return term.type === "prez"; }); }); - - /* flatten objects */ - var rows = prez.map(function(row) { return { - name: row.name.first + " " + row.name.last, - birthday: row.bio.birthday - }; }); - - /* generate worksheet and workbook */ - var worksheet = XLSX.utils.json_to_sheet(rows); - var 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 */ - var max_width = rows.reduce(function(w, r) { return Math.max(w, r.name.length); }, 10); - worksheet["!cols"] = [ { wch: max_width } ]; - - /* create an XLSX file and try to save to Presidents.xlsx */ - XLSX.writeFileXLSX(workbook, "Presidents.xlsx"); - }); - }); -}); -``` - -3) Start a local HTTP server, then go to `http://localhost:8080/` - -```bash -npx http-server . -``` - -Click on "Click here to export" to generate a file. - -4) Create `build.js` configuration for the optimizer: - -```js title="build.js" -({ - baseUrl: ".", - name: "SheetJSRequire", - paths: { - xlsx: "./xlsx.full.min" - }, - out: "SheetJSRequire.min.js" -}); -``` - -5) Run the `r.js` optimizer to create `SheetJSRequire.min.js`: - -```bash -npx -p requirejs@2.3.3 r.js -o build.js -``` - -6) Save the following to `optimized.html`: - -```html title="optimized.html" - - - - -

SheetJS Presidents Demo

- - - - - -``` - -7) Open `http://localhost:8080/optimized.html` - -Click on "Click here to export" to generate a file. - -
+**[The exposition has been moved to a separate page.](/docs/demos/frontend/bundler/requirejs)** ## Rollup @@ -978,206 +829,9 @@ Click on "Click here to export" to generate a file. -## SystemJS +#### SystemJS -With configuration, SystemJS supports both browser and NodeJS deployments. - -:::caution pass - -This demo was written against SystemJS 0.19, the most popular SystemJS version -used with Angular applications. In the years since the release, Angular and -other tools using SystemJS have switched to Webpack. - -::: - - - - -SystemJS fails by default because the library does not export anything in the -web browser. The `meta` configuration option can be used to expose `XLSX`: - -{`\ -SystemJS.config({ - meta: { - 'xlsx': { - exports: 'XLSX' // <-- tell SystemJS to expose the XLSX variable - } - }, - map: { - 'xlsx': 'https://cdn.sheetjs.com/xlsx-${current}/package/dist/xlsx.full.min.js', - 'fs': '', // <--| - 'crypto': '', // <--| suppress native node modules - 'stream': '' // <--| - } -}); -SystemJS.import('main.js'); // load \`main.js\``} - - -The `main.js` script can freely `require("xlsx")`. - -:::caution Web Workers - -Web Workers can load the SystemJS library with `importScripts`, but the imported -code cannot assign the original worker's `onmessage` callback. The recommended -approach is to expose a global from the required script, For example, supposing -the shared name is `_cb`, the primary worker script would call the callback: - -```js title="worker.js" -/* main worker script */ -importScripts('system.js'); - -SystemJS.config({ /* ... browser config ... */ }); - -onmessage = function(evt) { - SystemJS.import('workermain.js').then(function() { _cb(evt); }); -}; -``` - -The worker script would define and expose the function: - -```js title="workermain.js" -/* Loaded with SystemJS import */ -var XLSX = require('xlsx'); - -_cb = function(evt) { /* ... do work here ... */ }; -``` - -::: - - - - -:::caution pass - -While SystemJS works in NodeJS, the built-in `require` should be preferred. - -::: - -The NodeJS module main script is `xlsx/xlsx.js` and should be mapped: - -```js -SystemJS.config({ - map: { - "xlsx": "./node_modules/xlsx/xlsx.js" - } -}); -``` - -The standalone scripts require a hint that the script assigns a global: - -```js -SystemJS.config({ - meta: { - "standalone": { format: "global" } - }, - map: { - "standalone": "xlsx.full.min.js" - } -}); -``` - - - -
Complete Example (click to show) - - - - -:::note - -This demo was last tested on 2023 May 07 against SystemJS 0.20.16 - -::: - -The [Live demo](pathname:///systemjs/systemjs.html) loads SystemJS from the -CDN, uses it to load the standalone script from the SheetJS CDN and emulate -a `require` implementation when loading [`main.js`](pathname:///systemjs/main.js) - -"View Source" works on the main HTML page and the `main.js` script. - - - - -:::note - -This demo was last tested on 2023 May 07 against SystemJS 0.19.47 - -::: - -1) Install the dependencies: - -{`\ -npm init -y -npm i --save https://cdn.sheetjs.com/xlsx-${current}/xlsx-${current}.tgz systemjs@0.19.47`} - - -2) Save the following script to `SheetJSystem.js`: - -```js title="SheetJSystem.js" -const SystemJS = require('systemjs'); - -// highlight-start -SystemJS.config({ - map: { - 'xlsx': 'node_modules/xlsx/xlsx.js', - 'fs': '@node/fs', - 'crypto': '@node/crypto', - 'stream': '@node/stream' - } -}); -// highlight-end - -SystemJS.import('xlsx').then(async function(XLSX) { - - /* fetch JSON data and parse */ - const url = "https://sheetjs.com/data/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")); - - /* 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"); - -}); -``` - -3) Run in NodeJS: - -```bash -node SheetJSystem.js -``` - -If the demo worked, `Presidents.xlsx` will be created. - -:::note pass - -As it uses `fetch`, this demo requires Node 18. - -::: - - - - -
+**[The exposition has been moved to a separate page.](/docs/demos/frontend/bundler/systemjs)** ## Vite diff --git a/docz/docs/03-demos/06-desktop/04-tauri.md b/docz/docs/03-demos/06-desktop/04-tauri.md index 33d9d9dc..b1620ade 100644 --- a/docz/docs/03-demos/06-desktop/04-tauri.md +++ b/docz/docs/03-demos/06-desktop/04-tauri.md @@ -258,7 +258,7 @@ This demo was tested in the following environments: | OS and Version | Arch | Tauri | Date | |:---------------|:-----|:---------|:-----------| | macOS 13.5.1 | x64 | `v1.5.0` | 2023-09-30 | -| macOS 13.4.1 | ARM | `v1.4.0` | 2023-06-29 | +| macOS 14.0 | ARM | `v1.5.2` | 2023-10-18 | | Windows 10 | x64 | `v1.5.0` | 2023-10-01 | | Windows 11 | ARM | `v1.4.1` | 2023-09-26 | | Linux (HoloOS) | x64 | `v1.5.2` | 2023-10-11 | diff --git a/docz/docs/03-demos/06-desktop/05-neutralino.md b/docz/docs/03-demos/06-desktop/05-neutralino.md index ec1149b6..f843b1ce 100644 --- a/docz/docs/03-demos/06-desktop/05-neutralino.md +++ b/docz/docs/03-demos/06-desktop/05-neutralino.md @@ -1,5 +1,5 @@ --- -title: NeutralinoJS +title: Data Munging in NeutralinoJS sidebar_label: NeutralinoJS description: Build data-intensive desktop apps using NeutralinoJS. Seamlessly integrate spreadsheets into your app using SheetJS. Quickly modernize Excel-powered business processes. pagination_prev: demos/mobile/index @@ -9,8 +9,6 @@ sidebar_custom_props: summary: Webview + Lightweight Extensions --- -# Data Munging in NeutralinoJS - import current from '/version.js'; import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; @@ -195,7 +193,7 @@ This demo was tested in the following environments: | OS and Version | Arch | Server | Client | Date | |:---------------|:-----|:----------|:----------|:-----------| | macOS 13.5.1 | x64 | `v4.13.0` | `v3.11.0` | 2023-08-26 | -| macOS 13.4.1 | ARM | `v4.10.0` | `v3.8.2` | 2023-06-28 | +| macOS 14.0 | ARM | `v4.14.1` | `v3.12.0` | 2023-10-18 | | Windows 10 | x64 | `v4.13.0` | `v3.11.0` | 2023-08-26 | | Windows 11 | ARM | `v4.13.0` | `v3.11.0` | 2023-09-21 | | Linux (HoloOS) | x64 | `v4.14.1` | `v3.12.0` | 2023-10-11 | @@ -385,7 +383,8 @@ save as `SheetJSNeu` will not automatically add the `.xlsx` extension! npx @neutralinojs/neu build ``` -Platform-specific programs will be created in the `dist` folder. +Platform-specific programs will be created in the `dist` folder. For example, +the `darwin-arm` program will be `./dist/sheetjs-neu/sheetjs-neu-mac_arm64` [^1]: See [`nativeAllowList`](https://neutralino.js.org/docs/configuration/neutralino.config.json#nativeallowlist-string) in the NeutralinoJS documentation [^2]: See [`os.showOpenDialog`](https://neutralino.js.org/docs/api/os#osshowopendialogtitle-options) in the NeutralinoJS documentation diff --git a/docz/docs/03-demos/06-desktop/09-cli.md b/docz/docs/03-demos/06-desktop/09-cli.md index 82825f85..49d24a47 100644 --- a/docz/docs/03-demos/06-desktop/09-cli.md +++ b/docz/docs/03-demos/06-desktop/09-cli.md @@ -240,7 +240,7 @@ This demo was last tested in the following deployments: | Architecture | V8 Version | Crate | Date | |:-------------|:--------------|:---------|:-----------| | `darwin-x64` | `11.8.172.13` | `0.79.2` | 2023-10-12 | -| `darwin-arm` | `11.4.183.2` | `0.71.2` | 2023-05-22 | +| `darwin-arm` | `11.8.172.13` | `0.79.2` | 2023-10-18 | | `win10-x64` | `11.8.172.13` | `0.79.2` | 2023-10-09 | | `win11-x64` | `11.8.172.13` | `0.79.2` | 2023-10-14 | | `linux-x64` | `11.8.172.13` | `0.79.2` | 2023-10-11 | @@ -351,7 +351,7 @@ This demo was last tested in the following deployments: | Architecture | Version | Date | |:-------------|:---------|:-----------| | `darwin-x64` | `1.37.1` | 2023-10-12 | -| `darwin-arm` | `1.34.1` | 2023-06-05 | +| `darwin-arm` | `1.37.2` | 2023-10-18 | | `win10-x64` | `1.37.1` | 2023-10-09 | | `win11-x64` | `1.37.2` | 2023-10-14 | | `win11-arm` | `1.37.0` | 2023-09-26 | diff --git a/docz/docs/03-demos/08-local/09-indexeddb.md b/docz/docs/03-demos/08-local/09-indexeddb.md index 5d1169e9..633a0194 100644 --- a/docz/docs/03-demos/08-local/09-indexeddb.md +++ b/docz/docs/03-demos/08-local/09-indexeddb.md @@ -39,7 +39,11 @@ production sites. :::note -This demo was last tested on 2023 June 1 with `localForage` 1.10.0 +This demo was last tested in the following environments: + +| Browser | Date | `localForage` | +|:------------|:-----------|:--------------| +| Chrome 117 | 2023-10-18 | 1.10.0 | ::: @@ -106,7 +110,11 @@ function SheetJSLocalForage() { :::note -This demo was last tested on 2023 June 1 with DexieJS 3.2.4 +This demo was last tested in the following environments: + +| Browser | Date | DexieJS | +|:------------|:-----------|:--------| +| Chrome 117 | 2023-10-18 | 3.2.4 | ::: diff --git a/docz/docs/03-demos/09-cloud/19-deno.md b/docz/docs/03-demos/09-cloud/19-deno.md index 5fa24f42..8eb9005e 100644 --- a/docz/docs/03-demos/09-cloud/19-deno.md +++ b/docz/docs/03-demos/09-cloud/19-deno.md @@ -7,10 +7,36 @@ pagination_next: demos/extensions/index import current from '/version.js'; import CodeBlock from '@theme/CodeBlock'; -Deno Deploy offers "Serverless Functions" powered by Deno. +[Deno Deploy](https://dash.deno.com/) offers distributed "Serverless Functions" +powered by Deno. -The [Deno installation](/docs/getting-started/installation/deno) instructions -apply to Deno Deploy scripts. +[SheetJS](https://sheetjs.com) is a JavaScript library for reading and writing +data from spreadsheets. + +This demo covers integration details. We'll explore how to load and use SheetJS +scripts in Deno Deploy functions. + +The ["Demo"](#demo) section includes build a sample service that converts XLSX +and other types of spreadsheets to HTML tables and CSV rows. + +:::caution pass + +When the demo was last tested, Deno Deploy required a GitHub account. + +::: + +:::note + +This demo was last tested by SheetJS users on 2023 October 18. + +::: + +## Integration Details + +The [SheetJS Deno module](/docs/getting-started/installation/nodejs) can be +imported from Deno Deploy server scripts. + +### Supported Frameworks :::warning pass @@ -20,17 +46,11 @@ This breaks web frameworks that use the filesystem in body parsing. ::: -:::caution pass - -When the demo was last tested, Deno Deploy required a GitHub account. - -::: - -## Supported Frameworks - When the demo was last tested, the `drash` server framework used an in-memory approach for parsing POST request bodies. +The [Drash demo](/docs/demos/net/server/drash) covers the framework in detail. + ### Parsing Data When files are submitted via HTTP POST, the `bodyParam` method can fetch data. @@ -41,7 +61,7 @@ The following example assumes the file is submitted at field name `file`: {`\ // @deno-types="https://cdn.sheetjs.com/xlsx-${current}/package/types/index.d.ts" import { read, utils } from 'https://cdn.sheetjs.com/xlsx-${current}/package/xlsx.mjs'; -import * as Drash from "https://cdn.jsdelivr.net/gh/drashland/drash@v2.8.0/mod.ts"; +import * as Drash from "https://cdn.jsdelivr.net/gh/drashland/drash@v2.8.1/mod.ts"; \n\ class SheetJSResource extends Drash.Resource { public paths = ["/"]; @@ -61,39 +81,43 @@ class SheetJSResource extends Drash.Resource { ## Demo -:::note +0) Create a new GitHub account or sign into an existing account. -This demo was last tested on 2023 June 05. The service -was implemented using this exact sequence. +1) Open the [main Deno Deploy portal](https://dash.deno.com/) in a browser. -::: +2) If the account never signed into Deno Deploy, click "Continue with Github". -1) Register and Sign in. +In the next screen, review the prompt and click "Authorize Deno Deploy" -2) Click "New Project" to create a new Project. In the next screen, look for the -"Hello World" sample and click the corresponding "Fork" button. +3) Click "New Playground" to create a new Playground. -3) Download [`s2c.ts`](pathname:///deno/s2c.ts). Open with a text editor and -copy the contents into the playground editor (left pane). +4) Download [`s2c.ts`](pathname:///deno/s2c.ts). -4) Click "Save and Deploy". +5) Open `s2c.ts` with a text editor and copy the contents of the source file +into the playground editor (left pane in the browser). + +6) Click "Save and Deploy". When the demo was last tested, it was a blue button. ### Testing -5) Download the test file +7) Wait until the server is deployed. When it is deployed, the right panel will +show "SheetJS Spreadsheet Conversion Service": -6) In the browser window, click "Choose File" and select the downloaded file. -Click "Submit" and the page will show the contents in a HTML TABLE. +> ![Screenshot](pathname:///deno/sshot.png) -7) Click the "Fullscreen" icon in the top-right corner of the page window. +8) Download the test file -8) Open a terminal window and download : +9) In the browser window, click "Choose File" and select the downloaded file. + +10) Click "Submit". The right panel will show the contents in a HTML TABLE. + +11) Open a terminal window and download : ```bash curl -LO https://sheetjs.com/pres.numbers ``` -9) Copy the first `curl` line from the page and run in the terminal. For +12) Copy the first `curl` line from the page and run in the terminal. For example, if the deployment is `clean-badger-69`, the command would be ```bash @@ -102,7 +126,7 @@ curl -X POST -F"file=@pres.numbers" https://clean-badger-69.deno.dev/ The output will be an HTML table -10) Copy the second `curl` line from the page and run in the terminal. For +13) Copy the second `curl` line from the page and run in the terminal. For example, if the deployment is `clean-badger-69`, the command would be ```bash diff --git a/docz/docs/03-demos/42-engines/01-duktape.md b/docz/docs/03-demos/42-engines/01-duktape.md index 5b37acbb..cd83bf69 100644 --- a/docz/docs/03-demos/42-engines/01-duktape.md +++ b/docz/docs/03-demos/42-engines/01-duktape.md @@ -120,7 +120,7 @@ This demo was tested in the following deployments: | Architecture | Version | Date | |:-------------|:--------|:-----------| | `darwin-x64` | `2.7.0` | 2023-07-24 | -| `darwin-arm` | `2.7.0` | 2023-06-05 | +| `darwin-arm` | `2.7.0` | 2023-10-18 | | `win10-x64` | `2.7.0` | 2023-07-24 | | `win11-arm` | `2.7.0` | 2023-09-26 | | `linux-x64` | `2.7.0` | 2023-10-11 | @@ -173,6 +173,20 @@ curl -LO https://docs.sheetjs.com/duk/sheetjs.duk.c gcc -std=c99 -Wall -osheetjs.duk sheetjs.duk.c duktape.c -lm ``` +:::note + +GCC may generate a warning: + +``` +duk_js_compiler.c:5628:13: warning: variable 'num_stmts' set but not used [-Wunused-but-set-variable] + duk_int_t num_stmts; + ^ +``` + +This warning can be ignored. + +::: + diff --git a/docz/docs/03-demos/42-engines/02-v8.md b/docz/docs/03-demos/42-engines/02-v8.md index 1c913e4b..8dea05f7 100644 --- a/docz/docs/03-demos/42-engines/02-v8.md +++ b/docz/docs/03-demos/42-engines/02-v8.md @@ -808,7 +808,7 @@ This demo was last tested in the following deployments: | Architecture | V8 Crate | Date | |:-------------|:---------|:-----------| | `darwin-x64` | `0.75.1` | 2023-08-26 | -| `darwin-arm` | `0.73.0` | 2023-06-05 | +| `darwin-arm` | `0.79.2` | 2023-10-18 | | `win10-x64` | `0.79.2` | 2023-10-09 | | `linux-x64` | `0.79.2` | 2023-10-11 | | `linux-arm` | `0.75.1` | 2023-08-30 | diff --git a/docz/docs/03-demos/42-engines/04-jsc.md b/docz/docs/03-demos/42-engines/04-jsc.md index 1cafc409..68fce44b 100644 --- a/docz/docs/03-demos/42-engines/04-jsc.md +++ b/docz/docs/03-demos/42-engines/04-jsc.md @@ -134,7 +134,7 @@ This demo was tested in the following environments: | Architecture | Swift | Date | |:-------------|:--------|:-----------| | `darwin-x64` | `5.8.1` | 2023-07-24 | -| `darwin-arm` | `5.8.1` | 2023-06-05 | +| `darwin-arm` | `5.9.0` | 2023-10-18 | ::: diff --git a/docz/docs/03-demos/42-engines/06-goja.md b/docz/docs/03-demos/42-engines/06-goja.md index f94f8d66..54fd5907 100644 --- a/docz/docs/03-demos/42-engines/06-goja.md +++ b/docz/docs/03-demos/42-engines/06-goja.md @@ -95,7 +95,7 @@ This demo was tested in the following deployments: | Architecture | Git Commit | Go version | Date | |:-------------|:-----------|:-----------|:-----------| | `darwin-x64` | `873a149` | `1.21.3` | 2023-10-14 | -| `darwin-arm` | `28ee0ee` | `1.20.4` | 2023-06-05 | +| `darwin-arm` | `873a149` | `1.21.3` | 2023-10-18 | | `win10-x64` | `81d7606` | `1.20.2` | 2023-08-27 | | `win11-arm` | `fc55792` | `1.21.1` | 2023-09-25 | | `linux-x64` | `fc55792` | `1.21.3` | 2023-10-11 | diff --git a/docz/docs/03-demos/42-engines/08-quickjs.md b/docz/docs/03-demos/42-engines/08-quickjs.md index 08fbb850..4bdecdf9 100644 --- a/docz/docs/03-demos/42-engines/08-quickjs.md +++ b/docz/docs/03-demos/42-engines/08-quickjs.md @@ -263,7 +263,7 @@ This demo was tested in the following deployments: | Architecture | Git Commit | Date | |:-------------|:-----------|:-----------| | `darwin-x64` | `2788d71` | 2023-07-24 | -| `darwin-arm` | `2788d71` | 2023-06-05 | +| `darwin-arm` | `2788d71` | 2023-10-18 | | `win10-x64` | `2788d71` | 2023-10-09 | | `win11-arm` | `2788d71` | 2023-09-25 | | `linux-x64` | `2788d71` | 2023-10-11 | diff --git a/docz/docs/03-demos/42-engines/09-hermes.md b/docz/docs/03-demos/42-engines/09-hermes.md index 801aa061..0c8b4318 100644 --- a/docz/docs/03-demos/42-engines/09-hermes.md +++ b/docz/docs/03-demos/42-engines/09-hermes.md @@ -363,7 +363,7 @@ This demo was tested in the following deployments: | Architecture | Git Commit | Date | |:-------------|:-----------|:-----------| | `darwin-x64` | `70af78b` | 2023-08-27 | -| `darwin-arm` | `869312f` | 2023-06-05 | +| `darwin-arm` | `2b4f949` | 2023-10-18 | | `linux-x64` | `2b4f949` | 2023-10-11 | | `linux-arm` | `70af78b` | 2023-08-27 | diff --git a/docz/docs/03-demos/index.md b/docz/docs/03-demos/index.md index d7fd84ea..211c92c0 100644 --- a/docz/docs/03-demos/index.md +++ b/docz/docs/03-demos/index.md @@ -120,11 +120,11 @@ in the [issue tracker](https://git.sheetjs.com/sheetjs/docs.sheetjs.com/issues) - [`bun`](/docs/demos/frontend/bundler#bun) - [`esbuild`](/docs/demos/frontend/bundler#esbuild) - [`parcel`](/docs/demos/frontend/bundler#parcel) -- [`requirejs`](/docs/demos/frontend/bundler#requirejs) +- [`requirejs`](/docs/demos/frontend/bundler/requirejs) - [`rollup`](/docs/demos/frontend/bundler#rollup) - [`snowpack`](/docs/demos/frontend/bundler#snowpack) - [`swc`](/docs/demos/frontend/bundler#swc) -- [`systemjs`](/docs/demos/frontend/bundler#systemjs) +- [`systemjs`](/docs/demos/frontend/bundler/systemjs) - [`vite`](/docs/demos/frontend/bundler#vite) - [`webpack`](/docs/demos/frontend/bundler/webpack) - [`wmr`](/docs/demos/frontend/bundler#wmr) @@ -132,6 +132,7 @@ in the [issue tracker](https://git.sheetjs.com/sheetjs/docs.sheetjs.com/issues) ### Other Programming Languages - [`JavaScript Engines`](/docs/demos/engines) +- [`V8 (C++ / Rust)`](/docs/demos/engines/v8) - [`Duktape (C / Perl)`](/docs/demos/engines/duktape) - [`JavaScriptCore (Swift)`](/docs/demos/engines/jsc) - [`Rhino (Java)`](/docs/demos/engines/rhino) diff --git a/docz/docs/06-solutions/01-input.md b/docz/docs/06-solutions/01-input.md index e643db22..92166244 100644 --- a/docz/docs/06-solutions/01-input.md +++ b/docz/docs/06-solutions/01-input.md @@ -344,7 +344,7 @@ import * as XLSX from 'https://cdn.sheetjs.com/xlsx-${current}/package/xlsx.mjs' import * as cptable from 'https://cdn.sheetjs.com/xlsx-${current}/package/dist/cpexcel.full.mjs'; XLSX.set_cptable(cptable); \n\ -import * as Drash from "https://cdn.jsdelivr.net/gh/drashland/drash@v2.8.0/mod.ts"; +import * as Drash from "https://cdn.jsdelivr.net/gh/drashland/drash@v2.8.1/mod.ts"; \n\ class SheetResource extends Drash.Resource { public paths = ["/"]; diff --git a/docz/static/deno/s2c.ts b/docz/static/deno/s2c.ts index c22ed061..108e2df9 100644 --- a/docz/static/deno/s2c.ts +++ b/docz/static/deno/s2c.ts @@ -3,7 +3,7 @@ import { read, utils, set_cptable, version } from 'https://cdn.sheetjs.com/xlsx- import * as cptable from 'https://cdn.sheetjs.com/xlsx-0.20.0/package/dist/cpexcel.full.mjs'; set_cptable(cptable); -import * as Drash from "https://cdn.jsdelivr.net/gh/drashland/drash@v2.8.0/mod.ts"; +import * as Drash from "https://cdn.jsdelivr.net/gh/drashland/drash@v2.8.1/mod.ts"; class SheetJSResource extends Drash.Resource { public paths = ["/"]; diff --git a/docz/static/deno/sshot.png b/docz/static/deno/sshot.png new file mode 100644 index 00000000..c690588d Binary files /dev/null and b/docz/static/deno/sshot.png differ diff --git a/docz/static/requirejs/requirejs.html b/docz/static/requirejs/requirejs.html index 9b7f482e..5595da52 100644 --- a/docz/static/requirejs/requirejs.html +++ b/docz/static/requirejs/requirejs.html @@ -4,7 +4,7 @@

SheetJS Presidents Demo

- +