vendoring
This commit is contained in:
parent
3553757e8d
commit
3d661faddb
@ -121,8 +121,8 @@ importScripts("https://cdn.sheetjs.com/xlsx-${current}/package/dist/xlsx.full.mi
|
||||
|
||||
:::danger VSCode Telemetry and Data Exfiltration
|
||||
|
||||
The official Microsoft builds of Visual Studio Code embed telemetry and send
|
||||
information to external servers.
|
||||
The official Microsoft builds of Visual Studio Code ("VSCode") embed telemetry
|
||||
and send information to external servers.
|
||||
|
||||
**[VSCodium](https://vscodium.com/) is a telemetry-free fork of VSCode.**
|
||||
|
||||
|
@ -174,10 +174,30 @@ yarn remove xlsx`}
|
||||
<ol start="1"><li><p>Download the tarball (<code parentName="pre">xlsx-{current}.tgz</code>) for the desired version. The current
|
||||
version is available at <a href={"https://cdn.sheetjs.com/xlsx-" + current + "/xlsx-" + current + ".tgz"}>{"https://cdn.sheetjs.com/xlsx-" + current + "/xlsx-" + current + ".tgz"}</a></p></li></ol>
|
||||
|
||||
2) Create a `vendor` subfolder at the root of your project and move the tarball
|
||||
to that folder. Add it to your project repository.
|
||||
<CodeBlock language="bash">{`\
|
||||
curl -o https://cdn.sheetjs.com/xlsx-${current}/xlsx-${current}.tgz`}
|
||||
</CodeBlock>
|
||||
|
||||
3) Install the tarball using a package manager:
|
||||
2) Create a `vendor` subfolder at the root of your project:
|
||||
|
||||
```bash
|
||||
mkdir -p vendor
|
||||
```
|
||||
|
||||
3) Move the tarball from step (1) to the `vendor` folder:
|
||||
|
||||
<CodeBlock language="bash">{`\
|
||||
mv xlsx-${current}.tgz vendor`}
|
||||
</CodeBlock>
|
||||
|
||||
4) If the project is managed with a version control system, add the tarball to
|
||||
the source repository. The Git VCS supports the `add` subcommand:
|
||||
|
||||
<CodeBlock language="bash">{`\
|
||||
git add vendor/xlsx-${current}.tgz`}
|
||||
</CodeBlock>
|
||||
|
||||
5) Install the tarball using a package manager:
|
||||
|
||||
<Tabs groupId="pm">
|
||||
<TabItem value="npm" label="npm">
|
||||
|
@ -161,12 +161,33 @@ yarn remove xlsx`}
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
<ol start="1"><li><p>Download the tarball (<code parentName="pre">xlsx-{current}.tgz</code>) for the desired version. The current version is available at <a href={"https://cdn.sheetjs.com/xlsx-" + current + "/xlsx-" + current + ".tgz"}>{"https://cdn.sheetjs.com/xlsx-" + current + "/xlsx-" + current + ".tgz"}</a></p></li></ol>
|
||||
<ol start="1"><li><p>Download the tarball (<code parentName="pre">xlsx-{current}.tgz</code>) for the desired version. The current
|
||||
version is available at <a href={"https://cdn.sheetjs.com/xlsx-" + current + "/xlsx-" + current + ".tgz"}>{"https://cdn.sheetjs.com/xlsx-" + current + "/xlsx-" + current + ".tgz"}</a></p></li></ol>
|
||||
|
||||
2) Create a `vendor` subfolder at the root of your project and move the tarball
|
||||
to that folder. Add it to your project repository.
|
||||
<CodeBlock language="bash">{`\
|
||||
curl -o https://cdn.sheetjs.com/xlsx-${current}/xlsx-${current}.tgz`}
|
||||
</CodeBlock>
|
||||
|
||||
3) Install the tarball using a package manager:
|
||||
2) Create a `vendor` subfolder at the root of your project:
|
||||
|
||||
```bash
|
||||
mkdir -p vendor
|
||||
```
|
||||
|
||||
3) Move the tarball from step (1) to the `vendor` folder:
|
||||
|
||||
<CodeBlock language="bash">{`\
|
||||
mv xlsx-${current}.tgz vendor`}
|
||||
</CodeBlock>
|
||||
|
||||
4) If the project is managed with a version control system, add the tarball to
|
||||
the source repository. The Git VCS supports the `add` subcommand:
|
||||
|
||||
<CodeBlock language="bash">{`\
|
||||
git add vendor/xlsx-${current}.tgz`}
|
||||
</CodeBlock>
|
||||
|
||||
5) Install the tarball using a package manager:
|
||||
|
||||
<Tabs groupId="pm">
|
||||
<TabItem value="npm" label="npm">
|
||||
@ -230,6 +251,66 @@ The package also ships with `xlsx.mjs`, a script compatible with the ECMAScript
|
||||
module system. When using the ESM build in NodeJS, some dependencies must be
|
||||
loaded manually.
|
||||
|
||||
:::danger ECMAScript Module Limitations
|
||||
|
||||
The original ECMAScript module specification only supported top-level imports:
|
||||
|
||||
```js
|
||||
import { Readable } from 'stream';
|
||||
```
|
||||
|
||||
If a module is unavailable, there is no way for scripts to gracefully fail or
|
||||
ignore the error. This presents an insurmountable challenge for libraries.
|
||||
|
||||
To contrast, the SheetJS CommonJS modules gracefully handle missing dependencies
|
||||
since `require` failures are errors that the library can catch and handle.
|
||||
|
||||
---
|
||||
|
||||
Patches to the specification added two different solutions to the problem:
|
||||
|
||||
- "dynamic imports" will throw errors that can be handled by libraries. Dynamic
|
||||
imports will taint APIs that do not use Promise-based methods.
|
||||
|
||||
```js
|
||||
/* Readable will be undefined if stream cannot be imported */
|
||||
const Readable = await (async() => {
|
||||
try {
|
||||
return (await import("stream"))?.Readable;
|
||||
} catch(e) { /* silently ignore error */ }
|
||||
})();
|
||||
```
|
||||
|
||||
- "import maps" control module resolution, allowing library users to manually
|
||||
shunt unsupported modules.
|
||||
|
||||
**These patches were released after browsers adopted ESM!** A number of browsers
|
||||
and other platforms support top-level imports but do not support the patches.
|
||||
|
||||
---
|
||||
|
||||
For the ESM build, there were four unpalatable options:
|
||||
|
||||
A) Generate a module script for browsers, a module script for ViteJS, a module
|
||||
script for [Deno](/docs/getting-started/installation/deno), and a module script
|
||||
for NodeJS and [BunJS](/docs/getting-started/installation/bun).
|
||||
|
||||
B) Remove all optional features, including support for non-English legacy files.
|
||||
|
||||
C) Add all optional features, effectively making the features mandatory.
|
||||
|
||||
D) Introduce special methods for optional dependency injection.
|
||||
|
||||
The SheetJS team chose option (D). NodeJS native modules are still automatically
|
||||
loaded in the CommonJS build, but NodeJS ESM scripts must now load and pass the
|
||||
dependencies to the library using special methods.
|
||||
|
||||
---
|
||||
|
||||
**It is strongly recommended to use CommonJS in NodeJS scripts!**
|
||||
|
||||
:::
|
||||
|
||||
#### Filesystem Operations
|
||||
|
||||
The `set_fs` method accepts a `fs` instance for reading and writing files using
|
||||
@ -285,6 +366,8 @@ import * as fs from 'fs'; // this import will fail
|
||||
set_fs(fs);
|
||||
```
|
||||
|
||||
**This is a design flaw in NextJS!**
|
||||
|
||||
:::
|
||||
|
||||
For server-side file processing, `fs` should be loaded with a dynamic import
|
||||
|
@ -122,6 +122,7 @@ This demo was last tested in the following deployments:
|
||||
| Architecture | BunJS | Date |
|
||||
|:-------------|:---------|:-----------|
|
||||
| `darwin-x64` | `1.1.4` | 2024-04-19 |
|
||||
| `darwin-arm` | `1.1.10` | 2024-09-22 |
|
||||
| `win10-x64` | `1.1.4` | 2024-04-19 |
|
||||
| `win11-x64` | `1.1.22` | 2024-08-11 |
|
||||
| `linux-x64` | `1.1.4` | 2024-04-25 |
|
||||
@ -136,7 +137,7 @@ cd sheetjs-bun-dle
|
||||
echo "{}" > package.json
|
||||
```
|
||||
|
||||
:::caution pass
|
||||
:::caution PowerShell Encoding Errors
|
||||
|
||||
The PowerShell file redirect will use the `UTF-16 LE` encoding. Bun does not
|
||||
support the encoding and will fail to install the package:
|
||||
|
@ -110,7 +110,7 @@ export default defineConfig({
|
||||
|
||||
#### Types
|
||||
|
||||
For VSCode and VSCodium integration, types can be specified in `src/env.d.ts`.
|
||||
For VSCodium integration, types can be specified in `src/env.d.ts`.
|
||||
|
||||
This data loader returns Base64 strings:
|
||||
|
||||
|
@ -130,7 +130,7 @@ wb.Custprops["Custom Quip"] = "Get Sheet Done";
|
||||
|
||||
## Export Override
|
||||
|
||||
The SheetJS `write` and `writeFile` methods[^2] accept options. The `Props`
|
||||
The SheetJS `write` and `writeFile` methods[^1] accept options. The `Props`
|
||||
option instructs the writer to override properties from the workbook object.
|
||||
|
||||
In the following example, the workbook object sets the "Title" and "Keywords"
|
||||
|
@ -529,7 +529,7 @@ Date: Fri Jul 12 11:47:14 2024 -0400
|
||||
git checkout 8a7cfd47bde8258c0d91df6a737bf0136699cdf8
|
||||
```
|
||||
|
||||
7) Run the full build sequence
|
||||
7) Run the full build sequence:
|
||||
|
||||
```bash
|
||||
make clean; make
|
||||
@ -538,9 +538,10 @@ make
|
||||
make dist
|
||||
```
|
||||
|
||||
8) To verify that the files are intact, use `md5sum` (`md5` on MacOS).
|
||||
8) Verify the scripts by computing the MD5 checksum.
|
||||
|
||||
The local checksum for the browser script can be computed with:
|
||||
The checksum for the generated `xlsx.full.min.js` script can be computed using
|
||||
the `md5` command on macOS or the `md5sum` command on WSL and Linux.
|
||||
|
||||
<Tabs groupId="os">
|
||||
<TabItem value="wsl" label="Windows WSL">
|
||||
@ -567,13 +568,25 @@ md5sum dist/xlsx.full.min.js
|
||||
</Tabs>
|
||||
|
||||
|
||||
The checksum for the CDN version can be computed with:
|
||||
The checksum for the equivalent script on the SheetJS CDN can be computed with:
|
||||
|
||||
<Tabs groupId="os">
|
||||
<TabItem value="wsl" label="Windows WSL">
|
||||
|
||||
```bash
|
||||
curl -L https://cdn.sheetjs.com/xlsx-0.20.3/package/dist/xlsx.full.min.js | md5sum -
|
||||
```
|
||||
|
||||
The following output was captured in `win11-arm` for SheetJS version `0.20.3`:
|
||||
|
||||
>
|
||||
```bash
|
||||
$ md5sum dist/xlsx.full.min.js
|
||||
# highlight-next-line
|
||||
6b3130af1ceadf07caa0ec08af7addff dist/xlsx.full.min.js
|
||||
$ curl -L https://cdn.sheetjs.com/xlsx-0.20.3/package/dist/xlsx.full.min.js | md5sum -
|
||||
# highlight-next-line
|
||||
6b3130af1ceadf07caa0ec08af7addff -
|
||||
```
|
||||
|
||||
</TabItem>
|
||||
@ -583,17 +596,7 @@ curl -L https://cdn.sheetjs.com/xlsx-0.20.3/package/dist/xlsx.full.min.js | md5s
|
||||
curl -k -L https://cdn.sheetjs.com/xlsx-0.20.3/package/dist/xlsx.full.min.js | md5
|
||||
```
|
||||
|
||||
</TabItem>
|
||||
<TabItem value="l" label="Linux">
|
||||
|
||||
```bash
|
||||
curl -L https://cdn.sheetjs.com/xlsx-0.20.3/package/dist/xlsx.full.min.js | md5sum -
|
||||
```
|
||||
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
When the demo was last tested on macOS, against version `0.20.3`:
|
||||
The following output was captured in `darwin-arm` for SheetJS version `0.20.3`:
|
||||
|
||||
>
|
||||
```bash
|
||||
@ -605,6 +608,29 @@ $ curl -k -L https://cdn.sheetjs.com/xlsx-0.20.3/package/dist/xlsx.full.min.js |
|
||||
6b3130af1ceadf07caa0ec08af7addff
|
||||
```
|
||||
|
||||
</TabItem>
|
||||
<TabItem value="l" label="Linux">
|
||||
|
||||
```bash
|
||||
curl -L https://cdn.sheetjs.com/xlsx-0.20.3/package/dist/xlsx.full.min.js | md5sum -
|
||||
```
|
||||
|
||||
|
||||
The following output was captured in `linux-arm` for SheetJS version `0.20.3`:
|
||||
|
||||
>
|
||||
```bash
|
||||
$ md5sum dist/xlsx.full.min.js
|
||||
# highlight-next-line
|
||||
6b3130af1ceadf07caa0ec08af7addff dist/xlsx.full.min.js
|
||||
$ curl -L https://cdn.sheetjs.com/xlsx-0.20.3/package/dist/xlsx.full.min.js | md5sum -
|
||||
# highlight-next-line
|
||||
6b3130af1ceadf07caa0ec08af7addff -
|
||||
```
|
||||
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
The two hashes should match.
|
||||
|
||||
9) Return to the `HEAD` commit:
|
||||
|
Loading…
Reference in New Issue
Block a user