StataNow ARM64 extension tests

This commit is contained in:
SheetJS 2024-12-16 23:59:57 -05:00
parent 61ec7ad63c
commit 952025b996
6 changed files with 124 additions and 52 deletions

@ -277,7 +277,7 @@ This complete component example fetches a test file and displays the contents in
a HTML table. When the export button is clicked, a callback will export a file:
```jsx title="src/SheetJSReactAoO.js"
import { useCallback, useEffect, useState } from "react";
import React, { useCallback, useEffect, useState } from "react";
import { read, utils, writeFileXLSX } from 'xlsx';
export default function SheetJSReactAoO() {
@ -287,14 +287,17 @@ export default function SheetJSReactAoO() {
/* Fetch and update the state once */
useEffect(() => { (async() => {
const f = await (await fetch("https://docs.sheetjs.com/pres.xlsx")).arrayBuffer();
// highlight-start
const wb = read(f); // parse the array buffer
const ws = wb.Sheets[wb.SheetNames[0]]; // get the first worksheet
const data = utils.sheet_to_json(ws); // generate objects
setPres(data); // update state
// highlight-end
})(); }, []);
/* get state data and export to XLSX */
const exportFile = useCallback(() => {
// highlight-next-line
const ws = utils.json_to_sheet(pres);
const wb = utils.book_new();
utils.book_append_sheet(wb, ws, "Data");
@ -303,10 +306,12 @@ export default function SheetJSReactAoO() {
return (<table><thead><tr><th>Name</th><th>Index</th></tr></thead><tbody>
{ /* generate row for each president */
// highlight-start
pres.map((pres, index) => (<tr key={index}>
<td>{pres.Name}</td>
<td>{pres.Index}</td>
</tr>))
// highlight-end
}
</tbody><tfoot><tr><td colSpan={2}>
<button onClick={exportFile}>Export XLSX</button>
@ -358,7 +363,7 @@ and the page will attempt to download `SheetJSReactAoO.xlsx`.
npm run build
```
The generated site will be placed in the `.next` folder.
The generated site will be placed in the `dist` folder.
6) Start a local web server:
@ -382,9 +387,11 @@ This demo was tested in the following environments:
:::
:::caution
:::caution pass
CRA has known compatibility issues with React 19+[^cra]. CRA no longer receives updates and the ReactJS docs no longer recommend using CRA. For new projects, it is strongly recommended to use ViteJS with the react or react-ts templates.
CRA has known compatibility issues with React 19[^5]. CRA no longer receives
updates and the ReactJS docs no longer recommend using CRA. For new projects, it
is strongly recommended to use ViteJS with the `react` or `react-ts` templates.
:::
@ -400,7 +407,7 @@ npx -y create-react-app@5.0.1 --scripts-version=5.0.1 sheetjs-react
<CodeBlock language="bash">{`\
cd sheetjs-react
npm i
npm i react@18.2.0 react-dom@18.2.0 web-vitals --save --save-exact # fixes CRA dependency conflicts w/ React 19
npm i react@18.2.0 react-dom@18.2.0 web-vitals --save --save-exact
npm i --save https://cdn.sheetjs.com/xlsx-${current}/xlsx-${current}.tgz
npm start`}
</CodeBlock>
@ -429,8 +436,6 @@ npx http-server build
Access the displayed URL (typically `http://localhost:8080`) with a web browser
and test the page.
[^cra]: See [Create React App Issue #13717](https://github.com/facebook/create-react-app/issues/13717) for details about React 19+ compatibility issues.
</TabItem>
<TabItem name="nextjs" value="NextJS">
@ -502,9 +507,17 @@ npm run dev`}
4) Replace `pages/index.tsx` with the `src/SheetJSReactAoO.js` example.
After replacing the code, add the following to the top of `pages/index.tsx`:
After replacing the code:
```js title="src/index.tsx (add to top)"
- uncomment the type hint in the `useState` function call:
```js title="pages/index.tsx (uncomment the inline comment)"
const [pres, setPres] = useState([] as any[]);
```
- add the following to the top of `pages/index.tsx`:
```js title="pages/index.tsx (add to top)"
"use client";
```
@ -535,15 +548,13 @@ and the page will attempt to download `SheetJSReactAoO.xlsx`.
npm run build
```
The generated site will be placed in the `dist` folder.
6) Start a local web server:
```bash
npm run start
```
Access the displayed URL (typically `http://localhost:8080`) with a web browser
Access the displayed URL (typically `http://localhost:3000`) with a web browser
and test the page.
</TabItem>
@ -559,11 +570,11 @@ will generate a workbook that can be opened in a spreadsheet editor.
The main disadvantage of the Array of Objects approach is the specific nature
of the columns. For more general use, passing around an Array of Arrays works.
However, this does not handle merge cells[^5] well!
However, this does not handle merge cells[^6] well!
The [`sheet_to_html`](/docs/api/utilities/html#html-table-output) function
generates HTML that is aware of merges and other worksheet features. ReactJS
`dangerouslySetInnerHTML`[^6] prop allows code to set the `innerHTML` attribute,
`dangerouslySetInnerHTML`[^7] prop allows code to set the `innerHTML` attribute,
effectively inserting the code into the page.
In this example, the component attaches a `ref` to the `DIV` container. During
@ -571,7 +582,7 @@ export, the first `TABLE` child element can be parsed with [`table_to_book`](/do
generate a workbook object.
```jsx title="src/SheetJSReactHTML.js"
import { useCallback, useEffect, useRef, useState } from "react";
import React, { useCallback, useEffect, useRef, useState } from "react";
import { read, utils, writeFileXLSX } from 'xlsx';
export default function SheetJSReactHTML() {
@ -676,9 +687,11 @@ This demo was tested in the following environments:
:::
:::caution
:::caution pass
CRA has known compatibility issues with React 19+[^cra]. CRA no longer receives updates and the ReactJS docs no longer recommend using CRA. For new projects, it is strongly recommended to use ViteJS with the react or react-ts templates.
CRA has known compatibility issues with React 19[^5]. CRA no longer receives
updates and the ReactJS docs no longer recommend using CRA. For new projects, it
is strongly recommended to use ViteJS with the `react` or `react-ts` templates.
:::
@ -693,7 +706,7 @@ npx -y create-react-app@5.0.1 --scripts-version=5.0.1 sheetjs-react
<CodeBlock language="bash">{`\
cd sheetjs-react
npm i
npm i react@18.2.0 react-dom@18.2.0 web-vitals --save --save-exact # fixes CRA dependency conflicts w/ React 19
npm i react@18.2.0 react-dom@18.2.0 web-vitals --save --save-exact
npm i --save https://cdn.sheetjs.com/xlsx-${current}/xlsx-${current}.tgz
npm start`}
</CodeBlock>
@ -773,5 +786,6 @@ transpiled in the browser using Babel standalone library.
[^2]: See [`useEffect`](https://react.dev/reference/react/useEffect) in the ReactJS documentation.
[^3]: See [`useCallback`](https://react.dev/reference/react/useCallback) in the ReactJS documentation.
[^4]: See [`useCallback`](https://react.dev/reference/react/useCallback) in the ReactJS documentation.
[^5]: See ["Merged Cells" in "SheetJS Data Model"](/docs/csf/features/merges) for more details.
[^6]: [`dangerouslySetInnerHTML`](https://react.dev/reference/react-dom/components/common#common-props) is a ReactJS prop supported for all built-in components.
[^5]: See [Create React App Issue #13717](https://github.com/facebook/create-react-app/issues/13717) for details about React 19+ compatibility issues.
[^6]: See ["Merged Cells" in "SheetJS Data Model"](/docs/csf/features/merges) for more details.
[^7]: [`dangerouslySetInnerHTML`](https://react.dev/reference/react-dom/components/common#common-props) is a ReactJS prop supported for all built-in components.

@ -268,7 +268,6 @@ If it has an `id`, JS code on the frontend can find the table element using the
using the `table_to_book` method[^8] and exported with `writeFile`[^2]:
<CodeBlock title="JS Callback for exporting HTML TABLE elements" language="javascript">{`\
/* NOTE: blazor spreads the C# array, so the spread is required */
async function export_method() {
const XLSX = await import("https://cdn.sheetjs.com/xlsx-${current}/package/xlsx.mjs");
const wb = XLSX.utils.table_to_book(document.getElementById("weather-table"));

@ -37,7 +37,6 @@ This demo was tested in the following environments:
| Postgres | Connector Library | Date |
|:---------|:------------------|:-----------|
| `16.6.1` | `pg` (`8.13.1`) | 2024-12-03 |
| `16.2.1` | `pg` (`8.11.4`) | 2024-03-31 |
| `15.6` | `pg` (`8.11.4`) | 2024-03-31 |
| `14.11` | `pg` (`8.11.4`) | 2024-03-31 |
@ -130,7 +129,8 @@ for(let row of aoo) {
### Creating a Table
The worksheet can be scanned to determine column names and types. With the names and types, a `CREATE TABLE` query can be written.
The worksheet can be scanned to determine column names and types. With the names
and types, a `CREATE TABLE` query can be written.
<details>
<summary><b>Implementation Details</b> (click to show)</summary>
@ -291,6 +291,7 @@ Or, if you don't want/need a background service you can just run:
```
On Linux, install `postgresql` by running the following script:
```bash
echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" | sudo tee /etc/apt/sources.list.d/pgdg.list
wget -qO - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
@ -304,7 +305,7 @@ sudo -u postgres createuser -P $USER
sudo -u postgres psql -c "ALTER USER $USER WITH SUPERUSER;"
```
If running the optional user creation steps above, a PostgreSQL password will be required. [^69]
If running the optional user creation steps above, a PostgreSQL password will be required. [^8]
Run the command to start a local database instance.
@ -314,12 +315,18 @@ Run the command to start a local database instance.
```bash
dropdb SheetJSPG
```
# Ubuntu/Debian
:::caution pass
Some Linux installations do not create the `dropdb` command. The command can be
run through the `postgres` command-line tool:
```bash title="dropdb in Ubuntu/Debian"
sudo -i -u postgres dropdb SheetJSPG
```
[^69]: PostgreSQL on Linux uses [SCRAM authentication by default, which requires a password](https://www.postgresql.org/docs/current/auth-password.html)
:::
:::info pass
@ -334,15 +341,35 @@ current user, command-line flags can override the defaults.
:::
:::note pass
If the database does not exist, the command will fail with the following error:
```
dropdb: error: database removal failed: ERROR: database "SheetJSPG" does not exist
```
This error can be safely ignored.
:::
2) Create an empty `SheetJSPG` database using the `createdb` command:
```bash
createdb SheetJSPG
```
# Ubuntu/Debian
:::caution pass
Some Linux installations do not create the `createdb` command. The command can be
run through the `postgres` command-line tool:
```bash title="createdb in Ubuntu/Debian"
sudo -i -u postgres createdb SheetJSPG
```
:::
:::note pass
`createdb` supports the same `-h`, `-p`, and `-U` flags as `dropdb`.
@ -509,4 +536,5 @@ psql SheetJSPG -c 'SELECT * FROM "Presidents";'
[^4]: See ["Workbook Helpers" in "Utilities"](/docs/api/utilities/wb) for details on `book_new` and `book_append_sheet`.
[^5]: See [`writeFile` in "Writing Files"](/docs/api/write-options)
[^6]: See [`sheet_to_json` in "Utilities"](/docs/api/utilities/array#array-output)
[^7]: The [`pg-format`](https://npm.im/pg-format) package is available on the public NPM registry. Even though the project is marked as deprecated, the official [`pg` website still recommends `pg-format`](https://node-postgres.com/features/queries#parameterized-query:~:text=use%20pg%2Dformat%20package%20for%20handling%20escaping)
[^7]: The [`pg-format`](https://npm.im/pg-format) package is available on the public NPM registry. Even though the project is marked as deprecated, the official [`pg` website still recommends `pg-format`](https://node-postgres.com/features/queries#parameterized-query:~:text=use%20pg%2Dformat%20package%20for%20handling%20escaping)
[^8]: PostgreSQL on Linux uses [SCRAM authentication by default, which requires a password](https://www.postgresql.org/docs/current/auth-password.html)

@ -71,7 +71,7 @@ absolute or relative[^4].
:::note pass
On older versions of SuiteScript, you might need to use without `.js` extension.
In older versions of SuiteScript, references should omit the `.js` extension.
:::
@ -88,7 +88,7 @@ top-level directory, the config should use `"/SuiteScripts/xlsx.full.min.js"`:
```
Relative references are also supported. If the entire project is stored in one
folder, the config can use `"./xlsx.full.min"`:
folder, the config can use `"./xlsx.full.min.js"`:
```json title="JsLibraryConfig.json"
{

@ -49,13 +49,15 @@ This demo covers Stata extensions. For directly processing Stata DTA files, the
:::note Tested Deployments
This demo was tested by SheetJS users in the following deployments:
This demo was tested in the following deployments:
| Architecture | Date |
|:-------------|:-----------|
| `darwin-x64` | 2024-04-10 |
| `win10-x64` | 2024-04-10 |
| `linux-x64` | 2024-04-25 |
| Architecture | Version | Date |
|:-------------|:------------------|:-----------|
| `darwin-x64` | `18.0` | 2024-04-10 |
| `darwin-arm` | `18.5` (StataNow) | 2024-12-15 |
| `win10-x64` | `18.0` | 2024-04-10 |
| `win11-arm` | `18.5` (StataNow) | 2024-12-15 |
| `linux-x64` | `18.0` | 2024-04-25 |
:::

@ -146,7 +146,7 @@ This demo was tested in the following deployments:
| V8 Version | Platform | OS Version | Compiler | Date |
|:--------------|:-------------|:--------------|:-----------------|:-----------|
| `12.4.253` | `darwin-x64` | macOS 14.4 | `clang 15.0.0` | 2024-03-15 |
| `13.3.228` | `darwin-x64` | macOS 15.1.1 | `clang 16.0.0` | 2024-12-03 |
| `12.7.130` | `darwin-arm` | macOS 14.5 | `clang 15.0.0` | 2024-05-25 |
| `12.5.48` | `win10-x64` | Windows 10 | `CL 19.39.33523` | 2024-03-24 |
| `12.5.48` | `linux-x64` | HoloOS 3.5.17 | `gcc 13.1.1` | 2024-03-21 |
@ -243,6 +243,7 @@ git config --global branch.autosetuprebase always
<TabItem value="unix" label="Linux/MacOS">
```bash
rm -rf depot_tools
git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
```
@ -428,11 +429,11 @@ The recommended fix is to delete the referenced folder and re-run `gclient sync`
</Tabs>
5) Checkout the desired version. The following command pulls `12.7.130`:
5) Checkout the desired version. The following command pulls `13.3.228`:
```bash
git checkout tags/12.7.130 -b sample
git checkout tags/13.3.228 -b sample
```
:::caution pass
@ -440,14 +441,14 @@ git checkout tags/12.7.130 -b sample
The official documentation recommends:
```bash
git checkout refs/tags/12.7.130 -b sample -t
git checkout refs/tags/13.3.228 -b sample -t
```
This command failed in local testing:
```
E:\v8\v8>git checkout refs/tags/12.7.130 -b sample -t
fatal: cannot set up tracking information; starting point 'refs/tags/12.7.130' is not a branch
E:\v8\v8>git checkout refs/tags/13.3.228 -b sample -t
fatal: cannot set up tracking information; starting point 'refs/tags/13.3.228' is not a branch
```
:::
@ -464,6 +465,33 @@ tools/dev/v8gen.py x64.release.sample
ninja -C out.gn/x64.release.sample v8_monolith
```
:::danger pass
**This does not work in newer Python releases due to a breaking change!**
Python 3.13 removed the `pipes` module from the standard library[^9]. `v8gen.py`
will fail on newer Python releases with the following traceback:
```
Traceback (most recent call last):
File "/Users/sheetjs/dev/v8/v8/tools/dev/v8gen.py", line 53, in <module>
import mb
File "/Users/sheetjs/dev/v8/v8/tools/mb/mb.py", line 21, in <module>
import pipes
ModuleNotFoundError: No module named 'pipes'
```
The recommended workaround is to use Homebrew to install and use Python 3.12:
```bash
brew install python@3.12
export PATH="$(brew --prefix)/opt/python@3.12/libexec/bin:$PATH"
```
After applying the workaround, the build commands will run.
:::
</TabItem>
<TabItem value="darwin-arm" label="ARM64 Mac">
@ -618,7 +646,7 @@ 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++17 -DV8_COMPRESS_POINTERS=1 -DV8_ENABLE_SANDBOX
-std=c++20 -DV8_COMPRESS_POINTERS=1 -DV8_ENABLE_SANDBOX
./hello_world
```
@ -630,7 +658,7 @@ Linking against `libv8_libbase` or `libv8_libplatform` in V8 version `12.4.253`
elicited linker errors:
```
ld: multiple errors: unknown file type in '/Users/test/dev/v8/v8/out.gn/x64.release.sample/obj/libv8_libplatform.a'; unknown file type in '/Users/test/dev/v8/v8/out.gn/x64.release.sample/obj/libv8_libbase.a'
ld: multiple errors: unknown file type in '/Users/sheetjs/dev/v8/v8/out.gn/x64.release.sample/obj/libv8_libplatform.a'; unknown file type in '/Users/sheetjs/dev/v8/v8/out.gn/x64.release.sample/obj/libv8_libbase.a'
```
:::
@ -653,7 +681,7 @@ Linking against `libv8_libbase` or `libv8_libplatform` in V8 version `12.4.253`
elicited linker errors:
```
ld: multiple errors: unknown file type in '/Users/test/dev/v8/v8/out.gn/x64.release.sample/obj/libv8_libplatform.a'; unknown file type in '/Users/test/dev/v8/v8/out.gn/x64.release.sample/obj/libv8_libbase.a'
ld: multiple errors: unknown file type in '/Users/sheetjs/dev/v8/v8/out.gn/x64.release.sample/obj/libv8_libplatform.a'; unknown file type in '/Users/sheetjs/dev/v8/v8/out.gn/x64.release.sample/obj/libv8_libbase.a'
```
:::
@ -780,7 +808,7 @@ copy E:\v8\v8\samples\hello-world.cc .\
```bash
g++ -I. -Iinclude hello-world.cc -o hello_world -fno-rtti -lv8_monolith \
-lv8_libbase -lv8_libplatform -ldl -Lobj/ -pthread -std=c++17 \
-lv8_libbase -lv8_libplatform -ldl -Lobj/ -pthread -std=c++20 \
-DV8_COMPRESS_POINTERS=1 -DV8_ENABLE_SANDBOX
./hello_world
```
@ -790,14 +818,14 @@ g++ -I. -Iinclude hello-world.cc -o hello_world -fno-rtti -lv8_monolith \
In some V8 versions, the command failed in the linker stage:
```
ld: multiple errors: unknown file type in '/Users/test/dev/v8/v8/out.gn/x64.release.sample/obj/libv8_libplatform.a'; unknown file type in '/Users/test/dev/v8/v8/out.gn/x64.release.sample/obj/libv8_libbase.a'
ld: multiple errors: unknown file type in '/Users/sheetjs/dev/v8/v8/out.gn/x64.release.sample/obj/libv8_libplatform.a'; unknown file type in '/Users/sheetjs/dev/v8/v8/out.gn/x64.release.sample/obj/libv8_libbase.a'
```
The build succeeds after removing `libv8_libbase` and `libv8_libplatform`:
```bash
g++ -I. -Iinclude hello-world.cc -o hello_world -fno-rtti -lv8_monolith \
-ldl -Lobj/ -pthread -std=c++17 \
-ldl -Lobj/ -pthread -std=c++20 \
-DV8_COMPRESS_POINTERS=1 -DV8_ENABLE_SANDBOX
./hello_world
```
@ -843,7 +871,7 @@ curl -LO https://docs.sheetjs.com/v8/sheetjs.v8.cc
```bash
g++ -I. -Iinclude sheetjs.v8.cc -o sheetjs.v8 -fno-rtti -lv8_monolith \
-lv8_libbase -lv8_libplatform -ldl -Lobj/ -pthread -std=c++17 \
-lv8_libbase -lv8_libplatform -ldl -Lobj/ -pthread -std=c++20 \
-DV8_COMPRESS_POINTERS=1 -DV8_ENABLE_SANDBOX
```
@ -852,14 +880,14 @@ g++ -I. -Iinclude sheetjs.v8.cc -o sheetjs.v8 -fno-rtti -lv8_monolith \
In some V8 versions, the command failed in the linker stage:
```
ld: multiple errors: unknown file type in '/Users/test/dev/v8/v8/out.gn/x64.release.sample/obj/libv8_libplatform.a'; unknown file type in '/Users/test/dev/v8/v8/out.gn/x64.release.sample/obj/libv8_libbase.a'
ld: multiple errors: unknown file type in '/Users/sheetjs/dev/v8/v8/out.gn/x64.release.sample/obj/libv8_libplatform.a'; unknown file type in '/Users/sheetjs/dev/v8/v8/out.gn/x64.release.sample/obj/libv8_libbase.a'
```
The build succeeds after removing `libv8_libbase` and `libv8_libplatform`:
```bash
g++ -I. -Iinclude sheetjs.v8.cc -o sheetjs.v8 -fno-rtti -lv8_monolith \
-ldl -Lobj/ -pthread -std=c++17 \
-ldl -Lobj/ -pthread -std=c++20 \
-DV8_COMPRESS_POINTERS=1 -DV8_ENABLE_SANDBOX
```
@ -1555,4 +1583,5 @@ mv target/release/sheet2csv.exe .
[^5]: See ["Supported Output Formats" type in "Writing Files"](/docs/api/write-options#supported-output-formats)
[^6]: The project does not have an official website. The [official Rust crate](https://crates.io/crates/v8) is hosted on `crates.io`.
[^7]: The project does not have a separate website. The source repository is hosted on [GitHub](https://github.com/cloudflare/stpyv8)
[^8]: According to a maintainer, [typed arrays were not supported in the original `pyv8` project](https://github.com/cloudflare/stpyv8/issues/104#issuecomment-2059125389)
[^8]: According to a maintainer, [typed arrays were not supported in the original `pyv8` project](https://github.com/cloudflare/stpyv8/issues/104#issuecomment-2059125389)
[^9]: `pipes` and other modules were removed from the standard library in Python 3.13 as part of ["PEP 594"](https://docs.python.org/3/whatsnew/3.13.html#whatsnew313-pep594).