docs.sheetjs.com/docz/docs/03-demos/20-cli/12-bunsea.md
2024-10-25 23:17:31 -04:00

4.3 KiB

title pagination_prev pagination_next sidebar_custom_props
BunJS SEA demos/desktop/index demos/data/index
summary
BunJS Single-file Executables

import current from '/version.js'; import CodeBlock from '@theme/CodeBlock';

BunJS is a JavaScript runtime with support for compiling scripts into self-contained executables.

SheetJS is a JavaScript library for reading and writing data from spreadsheets.

This demo uses the Bun compiler and SheetJS to create a standalone CLI tool for parsing spreadsheets and generating CSV rows.

:::info pass

It is strongly recommended to install BunJS on systems using SheetJS libraries in command-line tools. This workaround should only be considered if a standalone binary is considered desirable.

:::

:::caution BunJS support is considered experimental.

Great open source software grows with user tests and reports. Any issues should be reported to the BunJS project for further diagnosis.

:::

Integration Details

The SheetJS BunJS module can be imported from BunJS scripts.

bun build --compile generates a standalone executable that includes the BunJS runtime, user JS code and supporting scripts and assets

Script Requirements

Scripts that exclusively use SheetJS libraries and BunJS built-in modules can be bundled using BunJS. The module should be required directly:

{\ const XLSX = require("xlsx");}

For example, the following script accepts one command line argument, parses the specified file using the SheetJS readFile method1, generates CSV text from the first worksheet using sheet_to_csv2, and prints to terminal:

{\ const XLSX = require("xlsx"); \n\ /* process.argv[2] is the first argument to the script */ const filename = process.argv[2]; \n\ /* read file */ const wb = XLSX.readFile(filename); \n\ /* generate CSV of first sheet */ const ws = wb.Sheets[wb.SheetNames[0]]; const csv = XLSX.utils.sheet_to_csv(ws); \n\ /* print to terminal */ console.log(csv);}

Complete Example

:::note Tested Deployments

This demo was last tested in the following deployments:

Architecture BunJS Date
darwin-x64 1.1.10 2024-05-28
darwin-arm 1.1.10 2024-05-29
win10-x64 1.1.12 2024-06-10
win11-arm 1.1.33 2024-10-25
linux-x64 1.1.12 2024-06-09
linux-arm 1.1.12 2024-06-10

:::

:::caution pass

BunJS on Windows on ARM uses the X64 compatibility layer. It does not generate a native ARM64 binary!

:::

  1. Install or update BunJS.3

  2. Download the test file https://docs.sheetjs.com/pres.numbers:

curl -o pres.numbers https://docs.sheetjs.com/pres.numbers
  1. Save the contents of the sheet2csv.ts code block to sheet2csv.ts in the project folder.

  2. Install the SheetJS dependency:

{\ bun install https://cdn.sheetjs.com/xlsx-${current}/xlsx-${current}.tgz}

:::caution pass

In some test runs, the command failed with a ENOTEMPTY error:

error: InstallFailed extracting tarball for https://cdn.sheetjs.com/xlsx-0.20.1/xlsx-0.20.1.tgz
error: moving "https://cdn.sheetjs.com/xlsx-0.20.1/xlsx-0.20.1.tgz" to cache dir failed
ENOTEMPTY: Directory not empty (NtSetInformationFile())

The workaround is to prepend xlsx@ to the URL:

{\ bun install xlsx@https://cdn.sheetjs.com/xlsx-${current}/xlsx-${current}.tgz}

:::

  1. Test the script with bun run:
bun run sheet2csv.ts pres.numbers

The script should display CSV contents from the first sheet:

Name,Index
Bill Clinton,42
GeorgeW Bush,43
Barack Obama,44
Donald Trump,45
Joseph Biden,46
  1. Compile and run sheet2csv:
bun build ./sheet2csv.ts --compile --outfile sheet2csv
./sheet2csv pres.numbers

The program should display the same CSV contents as the script (from step 2)


  1. See readFile in "Reading Files" ↩︎

  2. See sheet_to_csv in "CSV and Text" ↩︎

  3. See "Installation" in the BunJS documentation for instructions. ↩︎