2022-05-16 03:26:04 +00:00
|
|
|
---
|
2022-06-21 12:26:53 +00:00
|
|
|
sidebar_position: 5
|
2022-05-16 03:26:04 +00:00
|
|
|
---
|
|
|
|
|
|
|
|
# Contributing
|
|
|
|
|
|
|
|
Due to the precarious nature of the Open Specifications Promise, it is very
|
2022-10-19 10:05:59 +00:00
|
|
|
important to ensure code is cleanroom. [Contribution Notes](https://git.sheetjs.com/sheetjs/sheetjs/src/branch/master/CONTRIBUTING.md)
|
2022-05-16 03:26:04 +00:00
|
|
|
|
|
|
|
<details>
|
|
|
|
<summary><b>File organization</b> (click to show)</summary>
|
|
|
|
|
|
|
|
Folders:
|
|
|
|
|
|
|
|
| folder | contents |
|
|
|
|
|:-------------|:--------------------------------------------------------------|
|
|
|
|
| `bin` | server-side bin scripts (`xlsx.njs`) |
|
2022-09-05 10:00:35 +00:00
|
|
|
| `bits` | raw source files that make up the final script |
|
2022-05-16 03:26:04 +00:00
|
|
|
| `dist` | dist files for web browsers and nonstandard JS environments |
|
|
|
|
| `misc` | miscellaneous supporting scripts |
|
2022-09-05 10:00:35 +00:00
|
|
|
| `modules` | TypeScript source files that generate some of the bits |
|
|
|
|
| `packages` | Support libraries and tools |
|
2022-05-16 03:26:04 +00:00
|
|
|
| `test_files` | test files (pulled from the test files repository) |
|
2022-09-05 10:00:35 +00:00
|
|
|
| `tests` | browser tests (run `make ctest` to rebuild) |
|
|
|
|
| `types` | TypeScript definitions and tests |
|
2022-05-16 03:26:04 +00:00
|
|
|
|
|
|
|
</details>
|
|
|
|
|
|
|
|
After cloning the repo, running `make help` will display a list of commands.
|
|
|
|
|
2023-01-14 03:13:35 +00:00
|
|
|
## Setup
|
|
|
|
|
|
|
|
These instructions will cover system configuration, cloning the source repo,
|
|
|
|
building, reproducing official releases, and running NodeJS and browser tests.
|
|
|
|
|
2023-11-28 07:05:59 +00:00
|
|
|
:::note Tested Deployments
|
2023-04-05 03:17:05 +00:00
|
|
|
|
|
|
|
These instructions were tested on the following platforms:
|
|
|
|
|
2024-01-03 06:47:00 +00:00
|
|
|
| Platform | Architecture | Test Date |
|
|
|
|
|:------------------------------|:-------------|:-----------|
|
2024-01-29 03:29:45 +00:00
|
|
|
| Linux (Steam Deck Holo x64) | `linux-x64` | 2024-01-26 |
|
2024-01-03 06:47:00 +00:00
|
|
|
| Linux (Ubuntu 18 AArch64) | `linux-arm` | 2023-12-01 |
|
|
|
|
| MacOS 10.13.6 (x64) | `darwin-x64` | 2023-09-30 |
|
|
|
|
| MacOS 14.1.2 (ARM64) | `darwin-arm` | 2023-12-01 |
|
|
|
|
| Windows 10 (x64) + WSL Ubuntu | `win10-x64` | 2023-11-27 |
|
|
|
|
| Windows 11 (x64) + WSL Ubuntu | `win11-x64` | 2023-10-14 |
|
|
|
|
| Windows 11 (ARM) + WSL Ubuntu | `win11-arm` | 2023-09-18 |
|
2023-04-05 03:17:05 +00:00
|
|
|
|
2023-09-08 09:11:11 +00:00
|
|
|
With some additional dependencies, the unminified scripts are reproducible and
|
2023-07-25 02:31:22 +00:00
|
|
|
tests will pass in Windows XP with NodeJS 5.10.0.
|
|
|
|
|
2023-04-05 03:17:05 +00:00
|
|
|
:::
|
|
|
|
|
2023-01-14 03:13:35 +00:00
|
|
|
### Install dependencies
|
|
|
|
|
|
|
|
#### OS-Specific Setup
|
2022-05-16 03:26:04 +00:00
|
|
|
|
|
|
|
import Tabs from '@theme/Tabs';
|
|
|
|
import TabItem from '@theme/TabItem';
|
|
|
|
|
2023-10-02 04:57:11 +00:00
|
|
|
<Tabs groupId="os">
|
2022-05-17 03:19:39 +00:00
|
|
|
<TabItem value="wsl" label="Windows WSL">
|
|
|
|
|
2023-04-05 03:17:05 +00:00
|
|
|
A) Ensure WSL ("WSL 2" in Windows 10) and the Ubuntu distribution are installed.
|
|
|
|
|
2023-10-15 02:39:07 +00:00
|
|
|
<details open><summary><b>Installation Notes</b> (click to hide)</summary>
|
|
|
|
|
|
|
|
In "Turn Windows features on or off", the following features must be enabled:
|
|
|
|
|
|
|
|
- "Hyper-V" (including every sub-feature)
|
|
|
|
- "Virtual Machine Platform"
|
|
|
|
- "Windows Hypervisor Platform"
|
|
|
|
- "Windows Subsystem for Linux"
|
|
|
|
|
|
|
|
The following command installs Ubuntu within WSL:
|
|
|
|
|
|
|
|
```powershell
|
|
|
|
wsl --install Ubuntu
|
|
|
|
```
|
|
|
|
|
2023-11-13 23:19:19 +00:00
|
|
|
In some versions of `wsl`, the `-d` flag must be specified:
|
|
|
|
|
|
|
|
```powershell
|
|
|
|
wsl --install -d Ubuntu
|
|
|
|
```
|
|
|
|
|
2023-10-15 02:39:07 +00:00
|
|
|
:::caution pass
|
|
|
|
|
|
|
|
In the last Windows 11 test, there was a `WSL_E_DEFAULT_DISTRO_NOT_FOUND` error.
|
|
|
|
|
|
|
|
The resolution is to switch to WSL1, install, and switch back to WSL2:
|
|
|
|
|
|
|
|
```
|
|
|
|
wsl --set-default-version 1
|
|
|
|
wsl --install Ubuntu
|
|
|
|
wsl --set-default-version 2
|
|
|
|
wsl --install Ubuntu
|
|
|
|
```
|
|
|
|
|
|
|
|
:::
|
|
|
|
|
|
|
|
:::warning pass
|
|
|
|
|
|
|
|
**WSL will not run in a Windows on ARM VM on computers with the M1 CPU**
|
|
|
|
|
|
|
|
Apple Silicon M1 processors do not support nested virtualization.
|
|
|
|
|
|
|
|
M2 processors do support nested virtualization. SheetJS users have reported
|
|
|
|
success with Windows on ARM running on computers with the M2 Max CPU.
|
|
|
|
|
|
|
|
:::
|
|
|
|
|
|
|
|
</details>
|
|
|
|
|
|
|
|
B) Install mercurial and subversion from within WSL:
|
2023-09-19 19:08:29 +00:00
|
|
|
|
|
|
|
```bash
|
|
|
|
sudo apt-get update
|
|
|
|
sudo apt-get install mercurial subversion
|
|
|
|
```
|
|
|
|
|
|
|
|
:::note pass
|
|
|
|
|
|
|
|
In some Windows 10 runs, `mercurial` and `subversion` were not available in the
|
|
|
|
default Ubuntu distro. A separate repository is available:
|
2022-05-16 03:26:04 +00:00
|
|
|
|
|
|
|
```bash
|
2022-05-17 03:19:39 +00:00
|
|
|
# Install support programs for the build and test commands
|
|
|
|
sudo add-apt-repository ppa:mercurial-ppa/releases
|
|
|
|
sudo apt-get update
|
|
|
|
sudo apt-get install mercurial subversion
|
|
|
|
sudo add-apt-repository --remove ppa:mercurial-ppa/releases
|
2022-05-16 03:26:04 +00:00
|
|
|
```
|
|
|
|
|
2023-09-19 19:08:29 +00:00
|
|
|
If the first command displays an error involving a missing release file, remove
|
|
|
|
the repo before proceeding:
|
|
|
|
|
|
|
|
```bash
|
|
|
|
sudo add-apt-repository --remove ppa:mercurial-ppa/releases
|
|
|
|
```
|
|
|
|
|
|
|
|
:::
|
|
|
|
|
2023-10-15 02:39:07 +00:00
|
|
|
C) Install NodeJS within WSL:
|
2022-05-16 03:26:04 +00:00
|
|
|
|
2023-08-31 22:09:08 +00:00
|
|
|
:::info pass
|
|
|
|
|
2023-10-02 04:57:11 +00:00
|
|
|
In the most recent test, the script showed a deprecation notice.
|
2023-08-31 22:09:08 +00:00
|
|
|
|
|
|
|
**The script worked as expected.**
|
|
|
|
|
|
|
|
The official workaround does not currently work with WSL. When the issues are
|
|
|
|
resolved, the instructions will be updated.
|
|
|
|
|
|
|
|
:::
|
|
|
|
|
2022-05-17 03:19:39 +00:00
|
|
|
```bash
|
|
|
|
# Install bootstrap NodeJS and NPM within the WSL
|
|
|
|
curl -fsSL https://deb.nodesource.com/setup_16.x | sudo -E bash -
|
|
|
|
sudo apt-get install -y nodejs
|
2023-01-14 03:13:35 +00:00
|
|
|
```
|
2022-05-16 03:26:04 +00:00
|
|
|
|
2023-10-15 02:39:07 +00:00
|
|
|
D) Exit the WSL session and start a new session
|
|
|
|
|
2023-11-28 07:05:59 +00:00
|
|
|
E) Install the `n` package and switch NodeJS versions:
|
2022-05-16 03:26:04 +00:00
|
|
|
|
2023-01-14 03:13:35 +00:00
|
|
|
```bash
|
2022-05-17 03:19:39 +00:00
|
|
|
# Switch to `n`-managed NodeJS
|
|
|
|
sudo npm i -g n
|
|
|
|
sudo n 16
|
2022-05-16 03:26:04 +00:00
|
|
|
```
|
|
|
|
|
2023-07-25 02:31:22 +00:00
|
|
|
:::note pass
|
|
|
|
|
|
|
|
If `npm` is missing, it can be installed with
|
|
|
|
|
|
|
|
```bash
|
|
|
|
sudo apt-get install -y npm
|
|
|
|
```
|
|
|
|
|
|
|
|
:::
|
|
|
|
|
2023-10-15 02:39:07 +00:00
|
|
|
F) Clone the [`js-crc32` repo](https://git.sheetjs.com/sheetjs/js-crc32)
|
2023-09-19 19:08:29 +00:00
|
|
|
|
|
|
|
```bash
|
|
|
|
git clone https://git.sheetjs.com/sheetjs/js-crc32
|
|
|
|
```
|
|
|
|
|
2023-10-15 02:39:07 +00:00
|
|
|
:::note pass
|
|
|
|
|
2023-11-13 23:19:19 +00:00
|
|
|
On Windows 10, this clone may fail due to issues with `core.filemode`:
|
|
|
|
|
|
|
|
```
|
|
|
|
fatal: could not set 'core.filemode' to 'false'
|
|
|
|
```
|
|
|
|
|
|
|
|
The main drive must be remounted with the metadata option:
|
|
|
|
|
|
|
|
```bash
|
|
|
|
cd /
|
|
|
|
sudo umount /mnt/c
|
|
|
|
sudo mount -t drvfs C: /mnt/c -o metadata
|
|
|
|
cd -
|
|
|
|
```
|
|
|
|
|
|
|
|
:::
|
|
|
|
|
|
|
|
:::note pass
|
|
|
|
|
2023-09-19 19:08:29 +00:00
|
|
|
If this clone fails with an error message that mentions SSL or secure connection
|
|
|
|
or certificates, build and install a version of Git with proper SSL support:
|
2022-05-16 03:26:04 +00:00
|
|
|
|
2022-05-17 03:19:39 +00:00
|
|
|
```bash
|
|
|
|
# Git does not support OpenSSL out of the box, must do this
|
2023-09-19 19:08:29 +00:00
|
|
|
curl -LO https://github.com/niko-dunixi/git-openssl-shellscript/raw/main/compile-git-with-openssl.sh
|
2022-05-17 03:19:39 +00:00
|
|
|
chmod +x compile-git-with-openssl.sh
|
|
|
|
./compile-git-with-openssl.sh
|
2022-05-16 03:26:04 +00:00
|
|
|
```
|
|
|
|
|
2023-10-15 02:39:07 +00:00
|
|
|
:::
|
|
|
|
|
|
|
|
G) Set `git` config `core.autocrlf` setting to `false`. The following commands
|
2023-09-19 19:08:29 +00:00
|
|
|
should be run twice, once within PowerShell (if Git for Windows is installed)
|
|
|
|
and once within WSL bash:
|
2023-01-14 03:13:35 +00:00
|
|
|
|
2023-05-11 21:28:29 +00:00
|
|
|
```bash
|
2023-01-14 03:13:35 +00:00
|
|
|
git config --global --add core.autocrlf false
|
|
|
|
git config --global --unset core.autocrlf true
|
2023-07-25 02:31:22 +00:00
|
|
|
```
|
|
|
|
|
2023-10-15 02:39:07 +00:00
|
|
|
H) Run `unzip`. If the program is missing, install manually:
|
2023-07-25 02:31:22 +00:00
|
|
|
|
|
|
|
```bash
|
|
|
|
sudo apt-get install -y unzip
|
2023-10-15 02:39:07 +00:00
|
|
|
```
|
|
|
|
|
|
|
|
I) Run `make`. If the program is missing, install manually:
|
|
|
|
|
|
|
|
```bash
|
|
|
|
sudo apt-get install -y make
|
2023-01-14 03:13:35 +00:00
|
|
|
```
|
2022-05-17 03:19:39 +00:00
|
|
|
|
|
|
|
</TabItem>
|
2023-01-14 03:13:35 +00:00
|
|
|
<TabItem value="osx" label="MacOS">
|
|
|
|
|
2023-10-02 04:57:11 +00:00
|
|
|
A) Open a terminal window and run `git`.
|
2023-01-14 03:13:35 +00:00
|
|
|
|
2023-10-02 04:57:11 +00:00
|
|
|
If Xcode or the command-line tools are not installed, you will be asked to
|
|
|
|
install. Click "Install" and run through the steps.
|
|
|
|
|
|
|
|
B) Open a terminal window and install the Homebrew package manager:
|
2023-01-14 03:13:35 +00:00
|
|
|
|
|
|
|
```bash
|
|
|
|
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
|
|
|
|
```
|
|
|
|
|
|
|
|
C) Close the window, open a new terminal window, and disable analytics:
|
|
|
|
|
|
|
|
```bash
|
|
|
|
brew analytics off
|
|
|
|
```
|
|
|
|
|
|
|
|
To confirm analytics are disabled, run
|
|
|
|
|
|
|
|
```bash
|
|
|
|
brew analytics state
|
|
|
|
```
|
|
|
|
|
2023-10-02 04:57:11 +00:00
|
|
|
The message should state that analytics are disabled or destroyed.
|
2022-05-17 03:19:39 +00:00
|
|
|
|
2023-01-14 03:13:35 +00:00
|
|
|
D) Install Mercurial and Subversion:
|
|
|
|
|
|
|
|
```bash
|
|
|
|
brew install mercurial subversion
|
|
|
|
```
|
2022-05-17 03:19:39 +00:00
|
|
|
|
2023-10-02 04:57:11 +00:00
|
|
|
E) Install NodeJS.
|
2022-05-17 03:19:39 +00:00
|
|
|
|
2023-09-19 19:08:29 +00:00
|
|
|
:::note pass
|
2022-11-12 09:16:51 +00:00
|
|
|
|
|
|
|
[The official NodeJS site](https://nodejs.org/en/download/) provides installers
|
|
|
|
for "LTS" and "Current" releases. The "LTS" version should be installed.
|
|
|
|
|
2023-10-02 04:57:11 +00:00
|
|
|
**Older versions of macOS are not compatible with newer versions of NodeJS.**
|
|
|
|
|
|
|
|
In local testing, macOS 10.13 required NodeJS version `12.22.12`:
|
|
|
|
|
|
|
|
```bash
|
2023-10-15 02:39:07 +00:00
|
|
|
curl -LO https://nodejs.org/download/release/v12.22.12/node-v12.22.12.pkg
|
2023-10-02 04:57:11 +00:00
|
|
|
open node-v12.22.12.pkg
|
|
|
|
```
|
2023-04-05 03:17:05 +00:00
|
|
|
|
2022-11-12 09:16:51 +00:00
|
|
|
:::
|
|
|
|
|
2023-01-14 03:13:35 +00:00
|
|
|
</TabItem>
|
2022-11-12 09:16:51 +00:00
|
|
|
<TabItem value="l" label="Linux">
|
|
|
|
|
2023-04-14 08:13:40 +00:00
|
|
|
A) Install `curl`, `mercurial`, `git`, and `subversion` using the system package
|
2023-01-14 03:13:35 +00:00
|
|
|
manager. On Debian and Ubuntu systems, `apt-get` installs packages:
|
2022-05-17 03:19:39 +00:00
|
|
|
|
|
|
|
```bash
|
2023-04-14 08:13:40 +00:00
|
|
|
sudo apt update
|
|
|
|
sudo apt-get install curl git mercurial subversion
|
2022-05-16 03:26:04 +00:00
|
|
|
```
|
|
|
|
|
2022-11-12 09:16:51 +00:00
|
|
|
Other Linux distributions may use other package managers.
|
|
|
|
|
2023-12-05 03:46:54 +00:00
|
|
|
<details open><summary><b>Steam Deck</b> (click to hide)</summary>
|
2022-11-12 09:16:51 +00:00
|
|
|
|
|
|
|
Desktop Mode on the Steam Deck uses `pacman`. It also requires a few steps.
|
|
|
|
|
|
|
|
0) Switch to Desktop mode and open `Konsole`
|
|
|
|
|
2023-11-28 07:05:59 +00:00
|
|
|
:::tip pass
|
|
|
|
|
|
|
|
At this point, it is strongly recommended to install the `ungoogled-chromium`
|
|
|
|
browser from the "Discover" app and open this page on the Steam Deck. Running
|
|
|
|
the browser on the device makes it easy to copy and paste commands.
|
|
|
|
|
|
|
|
:::
|
|
|
|
|
2022-11-12 09:16:51 +00:00
|
|
|
1) Set a password for the user by running `passwd` and following instructions.
|
|
|
|
|
|
|
|
2) Disable read-only mode:
|
|
|
|
|
|
|
|
```bash
|
|
|
|
sudo steamos-readonly disable
|
|
|
|
```
|
|
|
|
|
|
|
|
(When prompted, enter the password assigned in step 1)
|
|
|
|
|
|
|
|
3) Configure keyring:
|
|
|
|
|
|
|
|
```bash
|
2023-03-26 00:55:35 +00:00
|
|
|
sudo sh -c 'echo "keyserver hkps://keyserver.ubuntu.com" >> /etc/pacman.d/gnupg/gpg.conf'
|
2022-11-12 09:16:51 +00:00
|
|
|
sudo pacman-key --init
|
|
|
|
sudo pacman-key --populate
|
|
|
|
sudo pacman-key --refresh-keys
|
|
|
|
```
|
|
|
|
|
|
|
|
4) Install dependencies:
|
|
|
|
|
|
|
|
```bash
|
2023-03-26 00:55:35 +00:00
|
|
|
sudo pacman -S base-devel mercurial subversion
|
2022-11-12 09:16:51 +00:00
|
|
|
```
|
|
|
|
|
2023-09-19 19:08:29 +00:00
|
|
|
:::note pass
|
2023-06-03 09:10:50 +00:00
|
|
|
|
|
|
|
In local testing on the Steam Deck, some of the C / C++ demos failed to build.
|
|
|
|
This issue was resolved by manually installing `glibc` and `linux-api-headers`:
|
|
|
|
|
|
|
|
```bash
|
|
|
|
sudo pacman -S glibc linux-api-headers
|
|
|
|
```
|
|
|
|
|
|
|
|
This is *not required* for building or testing the library.
|
|
|
|
|
|
|
|
:::
|
|
|
|
|
2022-11-12 09:16:51 +00:00
|
|
|
</details>
|
|
|
|
|
2023-12-02 08:39:35 +00:00
|
|
|
B) After installing mercurial and subversion, install NodeJS.
|
2022-11-12 09:16:51 +00:00
|
|
|
|
2023-09-19 19:08:29 +00:00
|
|
|
:::note pass
|
2022-11-12 09:16:51 +00:00
|
|
|
|
2023-11-28 07:05:59 +00:00
|
|
|
[The official NodeJS site](https://nodejs.org/en/download/) provides Linux
|
|
|
|
binaries, but it is strongly recommended to use `nvm` to install NodeJS:
|
|
|
|
|
|
|
|
```bash
|
|
|
|
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.5/install.sh | bash
|
|
|
|
```
|
|
|
|
|
|
|
|
After installing, start a new terminal session and install NodeJS "LTS":
|
|
|
|
|
|
|
|
```bash
|
|
|
|
nvm install --lts
|
|
|
|
```
|
2022-11-12 09:16:51 +00:00
|
|
|
|
2023-04-14 08:13:40 +00:00
|
|
|
After installing, if running `node` in the terminal fails with a `glibc` error,
|
|
|
|
an older version of NodeJS should be installed. For example, Ubuntu 18.04 does
|
2023-11-28 07:05:59 +00:00
|
|
|
not support Node 18 but supports Node 16.20.0:
|
|
|
|
|
|
|
|
```bash
|
|
|
|
nvm install 16
|
|
|
|
nvm use 16
|
|
|
|
```
|
2023-04-14 08:13:40 +00:00
|
|
|
|
2023-01-14 03:13:35 +00:00
|
|
|
:::
|
2022-11-12 09:16:51 +00:00
|
|
|
|
2023-12-02 08:39:35 +00:00
|
|
|
C) Run `unzip`. If the program is missing, install manually. Using `apt-get`:
|
|
|
|
|
|
|
|
```bash
|
|
|
|
sudo apt-get install -y unzip
|
|
|
|
```
|
|
|
|
|
|
|
|
D) Run `make`. If the program is missing, install manually. It is strongly
|
|
|
|
recommended to install `build-essential` on Debian and Ubuntu:
|
|
|
|
|
|
|
|
```bash
|
|
|
|
sudo apt-get install -y make
|
|
|
|
```
|
|
|
|
|
|
|
|
|
2023-01-14 03:13:35 +00:00
|
|
|
</TabItem>
|
|
|
|
</Tabs>
|
2022-11-12 09:16:51 +00:00
|
|
|
|
2023-01-14 03:13:35 +00:00
|
|
|
### Build from source tree
|
2022-11-12 09:16:51 +00:00
|
|
|
|
2023-01-14 03:13:35 +00:00
|
|
|
0) Clone the project:
|
2022-05-16 03:26:04 +00:00
|
|
|
|
|
|
|
```bash
|
2023-01-14 03:13:35 +00:00
|
|
|
git clone https://git.sheetjs.com/sheetjs/sheetjs
|
|
|
|
cd sheetjs
|
2022-05-17 03:19:39 +00:00
|
|
|
```
|
|
|
|
|
2023-10-02 04:57:11 +00:00
|
|
|
:::note pass
|
|
|
|
|
|
|
|
On older platforms, the clone may fail due to SSL certificate problems:
|
|
|
|
|
|
|
|
```bash
|
|
|
|
fatal: unable to access 'https://git.sheetjs.com/sheetjs/sheetjs/': SSL certificate problem: certificate has expired
|
|
|
|
```
|
|
|
|
|
|
|
|
The simplest workaround is to disable SSL verification:
|
|
|
|
|
|
|
|
```bash
|
|
|
|
git config --global http.sslVerify false
|
|
|
|
```
|
|
|
|
|
|
|
|
**It is strongly recommended to re-enable SSL verification after cloning**:
|
|
|
|
|
|
|
|
```bash
|
|
|
|
git config --global http.sslVerify true
|
|
|
|
```
|
|
|
|
|
|
|
|
:::
|
|
|
|
|
2023-08-31 22:09:08 +00:00
|
|
|
1) Install NodeJS modules for building the scripts:
|
2022-05-16 03:26:04 +00:00
|
|
|
|
2023-12-02 08:39:35 +00:00
|
|
|
```bash
|
|
|
|
npm i
|
|
|
|
npm i -g mocha@2.5.3 voc @sheetjs/uglify-js
|
|
|
|
```
|
|
|
|
|
|
|
|
:::caution pass
|
|
|
|
|
|
|
|
If `npm i -g` fails with a permissions issue, run the command with `sudo`:
|
|
|
|
|
2022-05-17 03:19:39 +00:00
|
|
|
```bash
|
2023-05-07 13:58:36 +00:00
|
|
|
npm i
|
2022-07-25 23:18:00 +00:00
|
|
|
sudo npm i -g mocha@2.5.3 voc @sheetjs/uglify-js
|
2022-05-17 03:19:39 +00:00
|
|
|
```
|
|
|
|
|
2023-12-02 08:39:35 +00:00
|
|
|
:::
|
|
|
|
|
2022-11-12 09:16:51 +00:00
|
|
|
:::note Older Versions of Dependencies
|
|
|
|
|
|
|
|
Some of the dependencies are wildly out of date. While SheetJS aims to run in
|
|
|
|
older versions of NodeJS and browsers, some libraries have chosen to break
|
|
|
|
backwards compatibility. The specific versions are used because they are known
|
|
|
|
to work and known to produce consistent results.
|
|
|
|
|
|
|
|
:::
|
|
|
|
|
2022-05-17 03:19:39 +00:00
|
|
|
2) Initialize the test files:
|
|
|
|
|
|
|
|
```bash
|
2023-11-13 23:19:19 +00:00
|
|
|
rmdir test_files
|
|
|
|
curl -LO https://test-files.sheetjs.com/test_files.zip
|
|
|
|
unzip test_files.zip
|
|
|
|
mkdir -p tmp
|
2022-05-17 03:19:39 +00:00
|
|
|
```
|
|
|
|
|
2023-11-13 23:19:19 +00:00
|
|
|
:::note pass
|
|
|
|
|
|
|
|
The `rmdir` command may fail if the folder is missing. The error can be ignored.
|
|
|
|
|
|
|
|
:::
|
|
|
|
|
|
|
|
This step may take a few minutes as the current test snapshot is large.
|
2022-05-17 03:19:39 +00:00
|
|
|
|
2023-09-19 19:08:29 +00:00
|
|
|
3) Run the `esbuild` tool once:
|
|
|
|
|
|
|
|
```bash
|
|
|
|
npx -y esbuild@0.14.14
|
|
|
|
```
|
|
|
|
|
|
|
|
4) Run a build and verify with a short test:
|
2022-05-17 03:19:39 +00:00
|
|
|
|
|
|
|
```bash
|
|
|
|
# Full Build
|
2023-03-26 00:55:35 +00:00
|
|
|
cd modules; make clean; make; cd ..
|
2023-08-30 03:44:38 +00:00
|
|
|
make
|
2022-05-17 03:19:39 +00:00
|
|
|
make dist
|
2023-04-05 03:17:05 +00:00
|
|
|
|
2023-08-30 03:44:38 +00:00
|
|
|
# Short test
|
|
|
|
make test_misc
|
|
|
|
|
2023-04-05 03:17:05 +00:00
|
|
|
# Reset repo
|
|
|
|
git checkout -- .
|
2022-05-20 03:25:45 +00:00
|
|
|
```
|
|
|
|
|
2023-10-02 04:57:11 +00:00
|
|
|
:::info pass
|
|
|
|
|
|
|
|
In some tests on older releases of macOS, the build failed with an error:
|
|
|
|
|
|
|
|
```bash
|
|
|
|
ReferenceError: n is not defined
|
|
|
|
```
|
|
|
|
|
|
|
|
The first error in the call stack points to `dist/xlsx.zahl.js`.
|
|
|
|
|
|
|
|
Older versions of macOS `sed` are known to misinterpret newline characters. The
|
|
|
|
workaround is to upgrade to a newer version of `sed`. On macOS:
|
|
|
|
|
|
|
|
```bash
|
|
|
|
brew install gnu-sed
|
|
|
|
echo 'export PATH="/usr/local/opt/gnu-sed/libexec/gnubin:$PATH"' >> ~/.profile
|
|
|
|
. ~/.profile
|
|
|
|
```
|
|
|
|
|
|
|
|
:::
|
|
|
|
|
2023-01-14 03:13:35 +00:00
|
|
|
### Reproduce official builds
|
|
|
|
|
2023-09-19 19:08:29 +00:00
|
|
|
5) Run `git log` and search for the commit that matches a particular release
|
2024-01-03 06:47:00 +00:00
|
|
|
version. For example, version `0.20.1` can be found with:
|
2022-05-20 03:25:45 +00:00
|
|
|
|
|
|
|
```bash
|
2024-01-03 06:47:00 +00:00
|
|
|
git log | grep -B4 "version bump 0.20.1"
|
2022-07-23 09:06:31 +00:00
|
|
|
```
|
|
|
|
|
2023-01-14 03:13:35 +00:00
|
|
|
The output should look like:
|
2022-07-23 09:06:31 +00:00
|
|
|
|
|
|
|
```bash
|
2024-01-03 06:47:00 +00:00
|
|
|
$ git log | grep -B4 "version bump 0.20.1"
|
2023-01-14 03:13:35 +00:00
|
|
|
# highlight-next-line
|
2024-01-03 06:47:00 +00:00
|
|
|
commit 29d46c07a895bdfd948d15b5115529ae697ccb48 <-- this is the commit hash
|
2023-01-14 03:13:35 +00:00
|
|
|
Author: SheetJS <dev@sheetjs.com>
|
2024-01-03 06:47:00 +00:00
|
|
|
Date: Tue Dec 5 03:19:42 2023 -0500
|
2023-01-14 03:13:35 +00:00
|
|
|
|
2024-01-03 06:47:00 +00:00
|
|
|
version bump 0.20.1
|
2022-05-16 03:26:04 +00:00
|
|
|
```
|
|
|
|
|
2023-09-19 19:08:29 +00:00
|
|
|
6) Switch to that commit:
|
2023-01-14 03:13:35 +00:00
|
|
|
|
|
|
|
```bash
|
2024-01-03 06:47:00 +00:00
|
|
|
git checkout 29d46c07a895bdfd948d15b5115529ae697ccb48
|
2023-01-14 03:13:35 +00:00
|
|
|
```
|
|
|
|
|
2023-09-19 19:08:29 +00:00
|
|
|
7) Run the full build sequence
|
2023-01-14 03:13:35 +00:00
|
|
|
|
|
|
|
```bash
|
2023-09-08 09:11:11 +00:00
|
|
|
make clean; make
|
2023-03-26 00:55:35 +00:00
|
|
|
cd modules; make clean; make; cd ..
|
2023-01-14 03:13:35 +00:00
|
|
|
make
|
|
|
|
make dist
|
|
|
|
```
|
|
|
|
|
2023-09-19 19:08:29 +00:00
|
|
|
8) To verify that the files are intact, use `md5sum` (`md5` on MacOS).
|
2023-01-14 03:13:35 +00:00
|
|
|
|
|
|
|
The local checksum for the browser script can be computed with:
|
|
|
|
|
2023-10-02 04:57:11 +00:00
|
|
|
<Tabs groupId="os">
|
|
|
|
<TabItem value="wsl" label="Windows WSL">
|
|
|
|
|
2023-01-14 03:13:35 +00:00
|
|
|
```bash
|
2023-10-02 04:57:11 +00:00
|
|
|
md5sum dist/xlsx.full.min.js
|
2023-01-14 03:13:35 +00:00
|
|
|
```
|
|
|
|
|
2023-10-02 04:57:11 +00:00
|
|
|
</TabItem>
|
|
|
|
<TabItem value="osx" label="MacOS">
|
|
|
|
|
|
|
|
```bash
|
|
|
|
md5 dist/xlsx.full.min.js
|
|
|
|
```
|
|
|
|
|
|
|
|
</TabItem>
|
|
|
|
<TabItem value="l" label="Linux">
|
|
|
|
|
|
|
|
```bash
|
|
|
|
md5sum dist/xlsx.full.min.js
|
|
|
|
```
|
|
|
|
|
|
|
|
</TabItem>
|
|
|
|
</Tabs>
|
|
|
|
|
|
|
|
|
2023-01-14 03:13:35 +00:00
|
|
|
The checksum for the CDN version can be computed with:
|
|
|
|
|
2023-10-02 04:57:11 +00:00
|
|
|
<Tabs groupId="os">
|
|
|
|
<TabItem value="wsl" label="Windows WSL">
|
|
|
|
|
2023-01-14 03:13:35 +00:00
|
|
|
```bash
|
2024-01-03 06:47:00 +00:00
|
|
|
curl -L https://cdn.sheetjs.com/xlsx-0.20.1/package/dist/xlsx.full.min.js | md5sum -
|
2023-10-02 04:57:11 +00:00
|
|
|
```
|
|
|
|
|
|
|
|
</TabItem>
|
|
|
|
<TabItem value="osx" label="MacOS">
|
|
|
|
|
|
|
|
```bash
|
2024-01-03 06:47:00 +00:00
|
|
|
curl -k -L https://cdn.sheetjs.com/xlsx-0.20.1/package/dist/xlsx.full.min.js | md5
|
2023-10-02 04:57:11 +00:00
|
|
|
```
|
|
|
|
|
|
|
|
</TabItem>
|
|
|
|
<TabItem value="l" label="Linux">
|
|
|
|
|
|
|
|
```bash
|
2024-01-03 06:47:00 +00:00
|
|
|
curl -L https://cdn.sheetjs.com/xlsx-0.20.1/package/dist/xlsx.full.min.js | md5sum -
|
2023-10-02 04:57:11 +00:00
|
|
|
```
|
|
|
|
|
|
|
|
</TabItem>
|
|
|
|
</Tabs>
|
|
|
|
|
2024-01-03 06:47:00 +00:00
|
|
|
When the demo was last tested on macOS, against version `0.20.1`:
|
2023-10-02 04:57:11 +00:00
|
|
|
|
2023-11-13 23:19:19 +00:00
|
|
|
>
|
2023-10-02 04:57:11 +00:00
|
|
|
```bash
|
|
|
|
$ md5 dist/xlsx.full.min.js
|
|
|
|
# highlight-next-line
|
2024-01-03 06:47:00 +00:00
|
|
|
MD5 (dist/xlsx.full.min.js) = c5db4b1d2a1985a4ebfbaa500243f593
|
|
|
|
$ curl -k -L https://cdn.sheetjs.com/xlsx-0.20.1/package/dist/xlsx.full.min.js | md5
|
2023-10-02 04:57:11 +00:00
|
|
|
# highlight-next-line
|
2024-01-03 06:47:00 +00:00
|
|
|
c5db4b1d2a1985a4ebfbaa500243f593
|
2023-01-14 03:13:35 +00:00
|
|
|
```
|
|
|
|
|
|
|
|
The two hashes should match.
|
|
|
|
|
2023-10-02 04:57:11 +00:00
|
|
|
9) Return to the `HEAD` commit:
|
2023-01-14 03:13:35 +00:00
|
|
|
|
|
|
|
```bash
|
2023-03-26 00:55:35 +00:00
|
|
|
git checkout master
|
2023-01-14 03:13:35 +00:00
|
|
|
```
|
|
|
|
|
|
|
|
### Test in web browsers
|
|
|
|
|
2023-09-19 19:08:29 +00:00
|
|
|
10) Start local server:
|
2023-01-14 03:13:35 +00:00
|
|
|
|
|
|
|
```bash
|
|
|
|
make ctestserv
|
|
|
|
```
|
|
|
|
|
|
|
|
The terminal will display a port number. For example:
|
|
|
|
|
|
|
|
```
|
|
|
|
Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/)
|
|
|
|
```
|
2022-05-16 03:26:04 +00:00
|
|
|
|
2023-09-19 19:08:29 +00:00
|
|
|
11) Open a browser window and access `http://localhost:8000`, replacing `8000`
|
2023-01-14 03:13:35 +00:00
|
|
|
with the port number from the terminal window.
|
2022-05-16 03:26:04 +00:00
|
|
|
|
2022-05-17 03:19:39 +00:00
|
|
|
## Development
|
|
|
|
|
|
|
|
The `xlsx.js` and `xlsx.mjs` files are constructed from the files in the `bits`
|
2022-08-24 00:51:18 +00:00
|
|
|
subfolder. The build script (run `make`) will concatenate the individual bits
|
|
|
|
to produce the scripts.
|
2022-05-17 03:19:39 +00:00
|
|
|
|
2023-08-30 03:44:38 +00:00
|
|
|
When changing the `.js` scripts in `bits`, the following sequence rebuilds the
|
|
|
|
`xlsx.js` and `xlsx.mjs` scripts:
|
|
|
|
|
|
|
|
```bash
|
|
|
|
make
|
|
|
|
```
|
|
|
|
|
|
|
|
When changing the `.ts` scripts in `modules`, the following sequence rebuilds
|
|
|
|
the `xlsx.js` and `xlsx.mjs` scripts:
|
|
|
|
|
|
|
|
```bash
|
|
|
|
cd modules; make clean; make; cd ..
|
|
|
|
```
|
|
|
|
|
|
|
|
To produce the dist files, run `make dist`.
|
|
|
|
|
|
|
|
:::info pass
|
|
|
|
|
|
|
|
The various `xlsx.*` scripts in the base folder and the files in the `dist`
|
|
|
|
folder are updated on each version release.
|
|
|
|
|
|
|
|
**They should not be committed between versions!**
|
|
|
|
|
|
|
|
:::
|
2022-05-17 03:19:39 +00:00
|
|
|
|
|
|
|
## Tests
|
|
|
|
|
|
|
|
The `test_misc` target runs the targeted feature tests. It should take 5-10
|
|
|
|
seconds to perform feature tests without testing against the full test battery.
|
|
|
|
New features should be accompanied with tests for the relevant file formats.
|
2022-05-16 03:26:04 +00:00
|
|
|
|
|
|
|
For tests involving the read side, an appropriate feature test would involve
|
|
|
|
reading an existing file and checking the resulting workbook object. If a
|
|
|
|
parameter is involved, files should be read with different values to verify that
|
|
|
|
the feature is working as expected.
|
|
|
|
|
|
|
|
For tests involving a new write feature which can already be parsed, appropriate
|
|
|
|
feature tests would involve writing a workbook with the feature and then opening
|
|
|
|
and verifying that the feature is preserved.
|
|
|
|
|
|
|
|
For tests involving a new write feature without an existing read ability, please
|
|
|
|
add a feature test to the kitchen sink `tests/write.js`.
|
|
|
|
|