151 lines
4.8 KiB
Markdown
151 lines
4.8 KiB
Markdown
|
---
|
||
|
title: Deno Compiler
|
||
|
pagination_prev: demos/desktop/index
|
||
|
pagination_next: demos/data/index
|
||
|
sidebar_custom_props:
|
||
|
summary: Deno Standalone Binaries
|
||
|
---
|
||
|
|
||
|
import current from '/version.js';
|
||
|
import CodeBlock from '@theme/CodeBlock';
|
||
|
|
||
|
[Deno](https://docs.deno.com/runtime/manual/tools/compiler) is a JavaScript
|
||
|
runtime with support for compiling scripts into self-contained executables.
|
||
|
|
||
|
[SheetJS](https://sheetjs.com) is a JavaScript library for reading and writing
|
||
|
data from spreadsheets.
|
||
|
|
||
|
This demo uses the Deno compiler and SheetJS to create a standalone CLI tool for
|
||
|
parsing spreadsheets and generating CSV rows.
|
||
|
|
||
|
:::info pass
|
||
|
|
||
|
It is strongly recommended to install Deno on systems using SheetJS libraries in
|
||
|
command-line tools. This workaround should only be considered if a standalone
|
||
|
binary is considered desirable.
|
||
|
|
||
|
:::
|
||
|
|
||
|
:::caution Deno support is considered experimental.
|
||
|
|
||
|
Great open source software grows with user tests and reports. Any issues should
|
||
|
be reported to the Deno project for further diagnosis.
|
||
|
|
||
|
:::
|
||
|
|
||
|
## Integration Details
|
||
|
|
||
|
The [SheetJS Deno module](/docs/getting-started/installation/deno) can be
|
||
|
imported from Deno scripts.
|
||
|
|
||
|
`deno compile` generates a standalone executable that includes the entire JS
|
||
|
runtime as well as user JS code.
|
||
|
|
||
|
### Script Requirements
|
||
|
|
||
|
Scripts that exclusively use SheetJS libraries and Deno built-in modules can be
|
||
|
bundled using `deno compile`. The ESM script should be imported directly:
|
||
|
|
||
|
<CodeBlock language="ts">{`\
|
||
|
// @deno-types="https://cdn.sheetjs.com/xlsx-${current}/package/types/index.d.ts"
|
||
|
import * as XLSX from 'https://cdn.sheetjs.com/xlsx-${current}/package/xlsx.mjs';`}
|
||
|
</CodeBlock>
|
||
|
|
||
|
For example, the following script accepts one command line argument, parses the
|
||
|
specified file using the SheetJS `readFile` method[^1], generates CSV text from
|
||
|
the first worksheet using `sheet_to_csv`[^2], and prints to terminal:
|
||
|
|
||
|
<CodeBlock language="ts" title="sheet2csv.ts">{`\
|
||
|
// @deno-types="https://cdn.sheetjs.com/xlsx-${current}/package/types/index.d.ts"
|
||
|
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\
|
||
|
/* Deno.args[0] is the first argument to the script */
|
||
|
const filename = Deno.args[0];
|
||
|
\n\
|
||
|
/* read file */
|
||
|
const wb = XLSX.readFile(filename);
|
||
|
\n\
|
||
|
/* generate CSV of first sheet */
|
||
|
const ws = wb.Sheets[wb.SheetNames[0]];
|
||
|
const csv = utils.sheet_to_csv(ws);
|
||
|
\n\
|
||
|
/* print to terminal */
|
||
|
console.log(csv);`}
|
||
|
</CodeBlock>
|
||
|
|
||
|
### Deno Permissions
|
||
|
|
||
|
The same permissions that apply to normal Deno scripts apply to the compiler:
|
||
|
|
||
|
- The `--allow-read` option must be specified to allow the program to read files
|
||
|
from the filesystem with the SheetJS `readFile` [^3] method.
|
||
|
|
||
|
- The `--allow-write` option must be specified to allow the program to write
|
||
|
files to the filesystem with the SheetJS `writeFile` [^4] method.
|
||
|
|
||
|
- The `--allow-net` option must be specified to allow the program to download
|
||
|
and upload spreadsheets.
|
||
|
|
||
|
More flags can be found in the official permissions list[^5]
|
||
|
|
||
|
|
||
|
## Complete Example
|
||
|
|
||
|
:::note Tested Deployments
|
||
|
|
||
|
This demo was last tested in the following deployments:
|
||
|
|
||
|
| Architecture | Deno | Date |
|
||
|
|:-------------|:---------|:-----------|
|
||
|
| `darwin-x64` | `1.41.3` | 2024-03-15 |
|
||
|
| `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.38.4` | 2023-12-01 |
|
||
|
| `linux-x64` | `1.41.3` | 2024-03-18 |
|
||
|
| `linux-arm` | `1.38.4` | 2023-12-01 |
|
||
|
|
||
|
:::
|
||
|
|
||
|
0) Install Deno.[^6]
|
||
|
|
||
|
1) Download the test file <https://sheetjs.com/pres.numbers>:
|
||
|
|
||
|
```bash
|
||
|
curl -LO https://sheetjs.com/pres.numbers
|
||
|
```
|
||
|
|
||
|
2) Test the script with `deno run`:
|
||
|
|
||
|
```bash
|
||
|
deno run -r --allow-read https://docs.sheetjs.com/cli/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
|
||
|
```
|
||
|
|
||
|
3) Compile and run `sheet2csv`:
|
||
|
|
||
|
```bash
|
||
|
deno compile -r --allow-read https://docs.sheetjs.com/cli/sheet2csv.ts
|
||
|
./sheet2csv pres.numbers
|
||
|
```
|
||
|
|
||
|
The program should display the same CSV contents as the script (from step 2)
|
||
|
|
||
|
[^1]: See [`readFile` in "Reading Files"](/docs/api/parse-options)
|
||
|
[^2]: See [`sheet_to_csv` in "CSV and Text"](/docs/api/utilities/csv#delimiter-separated-output)
|
||
|
[^3]: See [`readFile` in "Reading Files"](/docs/api/parse-options)
|
||
|
[^4]: See [`writeFile` in "Writing Files"](/docs/api/write-options)
|
||
|
[^5]: See ["Permissions list"](https://docs.deno.com/runtime/manual/basics/permissions#permissions-list) in the official Deno documentation
|
||
|
[^6]: [The official instructions](https://docs.deno.com/runtime/manual/getting_started/installation) cover most platforms. Deno does not provide official Linux ARM64 builds, but [there are unofficial community builds](https://github.com/LukeChannings/deno-arm64).
|