From ac0f80025af9269f5a07345424613c107691379e Mon Sep 17 00:00:00 2001 From: SheetJS Date: Wed, 3 Sep 2025 23:55:16 -0400 Subject: [PATCH] VBA event handler example --- docz/docs/03-demos/02-frontend/03-angular.md | 27 +++++-- docz/docs/03-demos/02-frontend/05-svelte.md | 4 +- docz/docs/03-demos/19-desktop/01-electron.md | 35 ++++++++- docz/docs/03-demos/42-engines/01-duktape.md | 2 +- docz/docs/03-demos/42-engines/08-quickjs.md | 2 +- docz/docs/03-demos/42-engines/09-hermes.md | 2 +- docz/docs/03-demos/42-engines/15-rb.md | 2 +- docz/docs/03-demos/42-engines/20-chakra.md | 2 +- docz/docs/03-demos/42-engines/21-boa.md | 2 +- docz/docs/03-demos/42-engines/22-perl.md | 2 +- .../03-demos/42-engines/23-jerryscript.md | 2 +- docz/docs/03-demos/42-engines/25-mujs.md | 2 +- docz/docs/03-demos/42-engines/26-jurassic.md | 2 +- docz/docs/07-csf/07-features/07-vba.md | 72 ++++++++++++------ docz/static/vba/SheetJSVBAFormula.xlsm | Bin 14790 -> 15132 bytes docz/static/vba/vbaProject.bin | Bin 16384 -> 16384 bytes tests/{engines-boa.sh => engines/boa.sh} | 2 +- .../chakracore.sh} | 0 .../duktape.sh} | 0 .../{engines-execjs.sh => engines/execjs.sh} | 0 .../{engines-hermes.sh => engines/hermes.sh} | 0 .../jerryscript.sh} | 0 .../jurassic.sh} | 2 +- tests/{engines-mujs.sh => engines/mujs.sh} | 2 +- tests/{engines-perl.sh => engines/perl.sh} | 0 .../quickjs.sh} | 2 +- .../v8-rust.sh} | 0 .../v8-snapshot.sh} | 0 .../express-worker.sh} | 0 tests/{static-vite.sh => static/vite.sh} | 0 30 files changed, 119 insertions(+), 47 deletions(-) rename tests/{engines-boa.sh => engines/boa.sh} (89%) rename tests/{engines-chakracore.sh => engines/chakracore.sh} (100%) rename tests/{engines-duktape.sh => engines/duktape.sh} (100%) rename tests/{engines-execjs.sh => engines/execjs.sh} (100%) rename tests/{engines-hermes.sh => engines/hermes.sh} (100%) rename tests/{engines-jerryscript.sh => engines/jerryscript.sh} (100%) rename tests/{engines-jurassic.sh => engines/jurassic.sh} (97%) rename tests/{engines-mujs.sh => engines/mujs.sh} (91%) rename tests/{engines-perl.sh => engines/perl.sh} (100%) rename tests/{engines-quickjs.sh => engines/quickjs.sh} (96%) rename tests/{engines-v8-rust.sh => engines/v8-rust.sh} (100%) rename tests/{engines-v8-snapshot.sh => engines/v8-snapshot.sh} (100%) rename tests/{server-express-worker.sh => server/express-worker.sh} (100%) rename tests/{static-vite.sh => static/vite.sh} (100%) diff --git a/docz/docs/03-demos/02-frontend/03-angular.md b/docz/docs/03-demos/02-frontend/03-angular.md index 9143c5f..1f16cbf 100644 --- a/docz/docs/03-demos/02-frontend/03-angular.md +++ b/docz/docs/03-demos/02-frontend/03-angular.md @@ -321,9 +321,9 @@ interface President { Name: string; Index: number }; {{row.Index}} // highlight-end - + - + ` }) @@ -379,9 +379,9 @@ interface President { Name: string; Index: number }; } // highlight-end - + - + ` }) @@ -425,6 +425,7 @@ This demo was tested in the following environments: | Angular | Date | |:----------|:-----------| +| `20.2.3` | 2025-09-03 | | `19.0.5` | 2025-01-03 | | `18.2.13` | 2025-01-03 | | `17.3.12` | 2025-01-03 | @@ -441,7 +442,7 @@ npx @angular/cli analytics disable -g 1) Create a new project: ```bash -npx @angular/cli@19 new --minimal --defaults --no-interactive sheetjs-angular +npx @angular/cli@20 new --minimal --defaults --no-interactive sheetjs-angular ``` :::note pass @@ -468,8 +469,20 @@ npm start`} 3) Open a web browser and access the displayed URL (`http://localhost:4200`) 4) In the previous `src/app/app.component.ts` code snippet, select the tab for -the appropriate version of Angular ("Angular 2-16" or "Angular 17+"), copy the -code contents and replace `src/app/app.component.ts` in the project. +the appropriate version of Angular ("Angular 2-16" or "Angular 17+") and copy +the code. Replace `src/app/app.component.ts` or `src/app/app.ts` in the project. + +For Angular 20+, after replacing `src/app/app.ts`, edit the script and change +the exported class name to `App`: + +```ts title="src/app/app.ts (edit highlighted line if file exists)" +// ... +}) + // highlight-next-line +export class App { + rows: President[] = [ { Name: "SheetJS", Index: 0 }]; +// ... +``` The page will refresh and show a table with an Export button. Click the button and the page will attempt to download `SheetJSAngularAoO.xlsx`. Open the file diff --git a/docz/docs/03-demos/02-frontend/05-svelte.md b/docz/docs/03-demos/02-frontend/05-svelte.md index 9b0216e..41e878c 100644 --- a/docz/docs/03-demos/02-frontend/05-svelte.md +++ b/docz/docs/03-demos/02-frontend/05-svelte.md @@ -130,7 +130,7 @@ function exportFile() { - + ``` @@ -143,7 +143,7 @@ This demo was tested in the following environments: | SvelteJS | ViteJS | Date | |:---------|:---------|:-----------| -| `5.25.3` | `6.2.3` | 2025-03-30 | +| `5.38.6` | `7.1.1` | 2025-09-03 | ::: diff --git a/docz/docs/03-demos/19-desktop/01-electron.md b/docz/docs/03-demos/19-desktop/01-electron.md index 85d350b..6409158 100644 --- a/docz/docs/03-demos/19-desktop/01-electron.md +++ b/docz/docs/03-demos/19-desktop/01-electron.md @@ -44,7 +44,7 @@ The [SheetJS NodeJS Module](/docs/getting-started/installation/nodejs) can be imported from the main or the renderer thread. The SheetJS `readFile` and `writeFile` methods will use the Electron `fs` module -where available. +where available.
Renderer Configuration (click to show) @@ -57,6 +57,37 @@ Electron 12 and later also require `worldSafeExecuteJavascript: true` and
+:::caution pass + +The [SheetJS Standalone scripts](/docs/getting-started/installation/standalone) +can be loaded from the renderer thread using a standard `SCRIPT` tag, but it is +strongly discouraged. + +[Issue 3314](https://git.sheetjs.com/sheetjs/sheetjs/issues/3314) in the SheetJS +CE issue tracker describes the required HTML configuration. + +
+ HTML Configuration (click to show) + +The following CSP directives should be specified in the `HEAD` block: + +```html + + +``` + +Without these settings, newer Electron versions will not run the scripts. + +
+ +::: + ### Reading Files Electron offers 3 different ways to read files, two of which use Web APIs. @@ -208,7 +239,7 @@ This demo was tested in the following environments: | OS and Version | Architecture | Electron | Date | |:---------------|:-------------|:---------|:-----------| | macOS 15.3 | `darwin-x64` | `35.1.2` | 2025-03-31 | -| macOS 14.5 | `darwin-arm` | `35.1.2` | 2025-03-30 | +| macOS 14.5 | `darwin-arm` | `35.1.2` | 2025-08-30 | | Windows 11 | `win11-x64` | `33.2.1` | 2025-02-11 | | Windows 11 | `win11-arm` | `33.2.1` | 2025-02-23 | | Linux (Ubuntu) | `linux-x64` | `35.1.2` | 2025-07-06 | diff --git a/docz/docs/03-demos/42-engines/01-duktape.md b/docz/docs/03-demos/42-engines/01-duktape.md index 4351bd4..1193bed 100644 --- a/docz/docs/03-demos/42-engines/01-duktape.md +++ b/docz/docs/03-demos/42-engines/01-duktape.md @@ -129,7 +129,7 @@ This demo was tested in the following deployments: | Architecture | Version | Date | |:-------------|:--------|:-----------| | `darwin-x64` | `2.7.0` | 2025-03-31 | -| `darwin-arm` | `2.7.0` | 2025-02-13 | +| `darwin-arm` | `2.7.0` | 2025-09-03 | | `win11-x64` | `2.7.0` | 2025-04-28 | | `win11-arm` | `2.7.0` | 2025-02-23 | | `linux-x64` | `2.7.0` | 2025-04-21 | diff --git a/docz/docs/03-demos/42-engines/08-quickjs.md b/docz/docs/03-demos/42-engines/08-quickjs.md index 333b022..4bb71ca 100644 --- a/docz/docs/03-demos/42-engines/08-quickjs.md +++ b/docz/docs/03-demos/42-engines/08-quickjs.md @@ -264,7 +264,7 @@ This demo was tested in the following deployments: | Architecture | Library | Git Commit | Date | |:-------------|:-----------|:-----------|:-----------| | `darwin-x64` | QuickJS | `0d7aaed` | 2025-03-31 | -| `darwin-arm` | QuickJS | `3306254` | 2025-04-24 | +| `darwin-arm` | QuickJS | `3306254` | 2025-09-03 | | `win11-x64` | QuickJS-NG | `865ba1f` | 2025-04-18 | | `win11-arm` | QuickJS-NG | `865ba1f` | 2025-04-18 | | `linux-x64` | QuickJS | `3306254` | 2025-06-18 | diff --git a/docz/docs/03-demos/42-engines/09-hermes.md b/docz/docs/03-demos/42-engines/09-hermes.md index 1413a4d..3f3f48a 100644 --- a/docz/docs/03-demos/42-engines/09-hermes.md +++ b/docz/docs/03-demos/42-engines/09-hermes.md @@ -365,7 +365,7 @@ This demo was tested in the following deployments: | Architecture | Git Commit | Date | |:-------------|:-----------|:-----------| | `darwin-x64` | `8ef11b4` | 2025-03-31 | -| `darwin-arm` | `8ef11b4` | 2025-08-07 | +| `darwin-arm` | `8ef11b4` | 2025-09-03 | | `linux-x64` | `8ef11b4` | 2025-04-21 | | `linux-arm` | `388376f` | 2025-02-15 | diff --git a/docz/docs/03-demos/42-engines/15-rb.md b/docz/docs/03-demos/42-engines/15-rb.md index 82b2108..c30c3b2 100644 --- a/docz/docs/03-demos/42-engines/15-rb.md +++ b/docz/docs/03-demos/42-engines/15-rb.md @@ -88,7 +88,7 @@ This demo was tested in the following deployments: | Platform | Ruby | ExecJS | Date | |:-------------|:---------|:---------|:-----------| | `darwin-x64` | `2.6.10` | `2.10.0` | 2025-03-31 | -| `darwin-arm` | `2.6.10` | `2.10.0` | 2025-02-13 | +| `darwin-arm` | `2.6.10` | `2.10.0` | 2025-09-03 | | `win11-x64` | `3.3.8` | `2.10.0` | 2025-04-28 | | `win11-arm` | `3.2.3` | `2.10.0` | 2025-02-23 | | `linux-x64` | `3.2.3` | `2.10.0` | 2025-04-21 | diff --git a/docz/docs/03-demos/42-engines/20-chakra.md b/docz/docs/03-demos/42-engines/20-chakra.md index eeee27d..d7afe28 100644 --- a/docz/docs/03-demos/42-engines/20-chakra.md +++ b/docz/docs/03-demos/42-engines/20-chakra.md @@ -133,7 +133,7 @@ This demo was tested in the following deployments: | Architecture | Git Commit | Date | |:-------------|:-----------|:-----------| | `darwin-x64` | `36becec` | 2025-03-31 | -| `darwin-arm` | `36becec` | 2025-06-20 | +| `darwin-arm` | `36becec` | 2025-09-03 | | `win11-x64` | `36becec` | 2025-04-28 | | `win11-arm` | `e26c81f` | 2025-02-23 | | `linux-x64` | `36becec` | 2025-06-18 | diff --git a/docz/docs/03-demos/42-engines/21-boa.md b/docz/docs/03-demos/42-engines/21-boa.md index 330c179..a6c0093 100644 --- a/docz/docs/03-demos/42-engines/21-boa.md +++ b/docz/docs/03-demos/42-engines/21-boa.md @@ -105,7 +105,7 @@ This demo was tested in the following deployments: | Architecture | Boa | Date | |:-------------|:---------|:-----------| | `darwin-x64` | `0.20.0` | 2025-03-31 | -| `darwin-arm` | `0.20.0` | 2025-02-13 | +| `darwin-arm` | `0.20.0` | 2025-09-03 | | `win11-x64` | `0.20.0` | 2025-04-28 | | `win11-arm` | `0.20.0` | 2025-02-23 | | `linux-x64` | `0.20.0` | 2025-04-21 | diff --git a/docz/docs/03-demos/42-engines/22-perl.md b/docz/docs/03-demos/42-engines/22-perl.md index 93bb076..1e073c3 100644 --- a/docz/docs/03-demos/42-engines/22-perl.md +++ b/docz/docs/03-demos/42-engines/22-perl.md @@ -128,7 +128,7 @@ This demo was tested in the following deployments: | Architecture | Version | Date | |:-------------|:--------|:-----------| | `darwin-x64` | `0.066` | 2025-03-31 | -| `darwin-arm` | `0.066` | 2025-02-13 | +| `darwin-arm` | `0.066` | 2025-09-03 | | `linux-x64` | `0.066` | 2025-06-16 | | `linux-arm` | `0.066` | 2025-02-15 | diff --git a/docz/docs/03-demos/42-engines/23-jerryscript.md b/docz/docs/03-demos/42-engines/23-jerryscript.md index ed4fe5e..f9cb9a1 100644 --- a/docz/docs/03-demos/42-engines/23-jerryscript.md +++ b/docz/docs/03-demos/42-engines/23-jerryscript.md @@ -37,7 +37,7 @@ This demo was tested in the following environments: | Architecture | Commit | Date | |:-------------|:----------|:-----------| | `darwin-x64` | `5020015` | 2025-03-31 | -| `darwin-arm` | `d2d30df` | 2025-02-13 | +| `darwin-arm` | `355ab24` | 2025-09-03 | | `win11-x64` | `5020015` | 2025-04-23 | | `win11-arm` | `5020015` | 2025-02-23 | | `linux-x64` | `5020015` | 2025-04-21 | diff --git a/docz/docs/03-demos/42-engines/25-mujs.md b/docz/docs/03-demos/42-engines/25-mujs.md index a67c454..f4ac259 100644 --- a/docz/docs/03-demos/42-engines/25-mujs.md +++ b/docz/docs/03-demos/42-engines/25-mujs.md @@ -323,7 +323,7 @@ This demo was tested in the following deployments: | Architecture | Version | Date | |:-------------|:--------|:-----------| | `darwin-x64` | `1.3.6` | 2025-03-31 | -| `darwin-arm` | `1.3.5` | 2025-02-13 | +| `darwin-arm` | `1.3.6` | 2025-09-03 | | `win11-x64` | `1.3.6` | 2025-04-23 | | `win11-arm` | `1.3.5` | 2025-02-23 | | `linux-x64` | `1.3.6` | 2025-06-16 | diff --git a/docz/docs/03-demos/42-engines/26-jurassic.md b/docz/docs/03-demos/42-engines/26-jurassic.md index b889d5d..6355a94 100644 --- a/docz/docs/03-demos/42-engines/26-jurassic.md +++ b/docz/docs/03-demos/42-engines/26-jurassic.md @@ -177,7 +177,7 @@ This demo was tested in the following deployments: | Architecture | Jurassic | Date | |:-------------|:---------|:-----------| | `darwin-x64` | `3.2.9` | 2025-03-31 | -| `darwin-arm` | `3.2.9` | 2025-03-30 | +| `darwin-arm` | `3.2.9` | 2025-09-03 | | `win11-x64` | `3.2.9` | 2025-04-23 | | `win11-arm` | `3.2.9` | 2025-02-23 | | `linux-x64` | `3.2.9` | 2025-06-16 | diff --git a/docz/docs/07-csf/07-features/07-vba.md b/docz/docs/07-csf/07-features/07-vba.md index a02721c..d4ae160 100644 --- a/docz/docs/07-csf/07-features/07-vba.md +++ b/docz/docs/07-csf/07-features/07-vba.md @@ -69,7 +69,9 @@ the VBA project, and exporting new VBA blobs. ## Demos The export demos focus on [an example](pathname:///vba/SheetJSVBAFormula.xlsm) -that includes the following user-defined functions: +that includes the following macros: + +_User-defined functions_ ```vb Function GetFormulaA1(Cell As Range) As String @@ -81,6 +83,13 @@ Function GetFormulaRC(Cell As Range) As String End Function ``` +_Event Handlers_ + +```vb +Sub Workbook_Open() + MsgBox "Hello from SheetJS!", vbOKOnly +End Sub +``` ### Copying Macros @@ -239,34 +248,53 @@ To ensure the writers export the VBA blob: - The output format must support VBA (`xlsm` or `xlsb` or `xls` or `biff8`) - The workbook object must have a valid `vbaraw` field +- The option `bookVBA: true` must be passed to `write` or `writeFile` This example uses [`vbaProject.bin`](pathname:///vba/vbaProject.bin) from the -[sample file](pathname:///vba/SheetJSVBAFormula.xlsm): +[sample file](pathname:///vba/SheetJSVBAFormula.xlsm). When the files are +opened, if macros are enabled, the application will display a popup. + +:::note pass + +Cells `A2:C2` in the worksheet include formulae that use user-defined functions. +Not all file formats support formula exports. [The "Formulae" page](./formulae) +includes a table of supported file formats. + +::: ```jsx live -function SheetJSVBAPrepared() { return ( ); } + /* export data to the specified file format */ + XLSX.writeFile(workbook, `SheetJSVBAPreparedNeu.${ext}`); + } + + return ["xlsm", "xlsb", "xls"].map((ext) => ( <> + +
+ )); +} ``` ## Details diff --git a/docz/static/vba/SheetJSVBAFormula.xlsm b/docz/static/vba/SheetJSVBAFormula.xlsm index 148b4052bd9d87d1cc0fd460252e977ad0cf0fba..49f815d15ac56774b0992f9dddc7ae50cdfff3ce 100644 GIT binary patch delta 8795 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 OCh$)Y$tdr?v;PC!IpWm- delta 8738 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

q7mbYh6%s2dn}U&wDz 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 Ug#3?gtiMC^ZySiQz(3so0kvzt?*IS* diff --git a/docz/static/vba/vbaProject.bin b/docz/static/vba/vbaProject.bin index a112350290f016ef109ff88dd6368184be42ed3f..c91507d29234ad4a57489a8c14c4bc3df36ac83f 100644 GIT binary patch delta 3802 zcmZ`*3s76v5#9Ur5JHwfU_J(8`$>SqPtudn*EWvyBmp)MFgPS>-39?7#sP$dz!)b% z;5ai$+&1_&wmYfwaWZY%#$TM~<4g*6CiOH;S~8i|ZQ8`?q-iq!IG)tg$xO%U-uEO| znQ2#ZwD<1a-TT?ydtV|!5(#pe=ZrZ3uoA%|vJh%SHbR5YB1#sjxMnW*>9ejU-zoS5 zQK86ZrPKVbyu^SaN)6F3_ygP{S#&yUnv~G%S>1)qZ6TrvQH;2eOeX0LwWF{KJL?g* zAga>?&#A{+ny}N1Xh{jTB5y^sA=(kQAvzG9h;0bwu^ahz#O;Wll#K4k{(&!t@#}xM`^zHRs&lFv+y9-<@-1~rY)o| z6d5)#A!*pAPx89}I31Clvk4Sp4w(}^)u^PydG&e@*aXX^OS_8UL%Otf)69)u z5cFc2)yUD%FymPbXF_H`@F+*;vK1s){FG&~6%dkM^b|@D%M$^-f)Q?s3=cy$A$1vTVMaRiEugZ}OC~R+yszRe0i7=C$-9IO+29rAy}XA_ zvgUJaGdaNMPR7#4a-Wh_>$0z)lmm_~X;#w1+5$4gb~oRv$$|9R=;N!*&7Y&1l5V5` zYGDU-fem>D{x`rNkjj*B5IgKwD-XCJ4E@-$ffu&>z4XC#k1cFAeL%PtLf2NxefmJI>-vb|;! zhg%`?cJL~YuL&*ft8$dszyX;d9l*dQlQr~2Rqd8}Tr^A4ZrBMC{KavsP!4^j1xtct z(u~2*)JrB$vzH8M6$gi^D|L@x^HGHS3X0W&;c@I7MjS~Cd#gMBC$MueB{+@z4B~96 ze=fy;iu@(S%ZOJHuOiMPUPIhCvn`KMVSRZ~!&kPYEYd=^trv2`_`WMgLr7<;;y$J$ zwHlfz(a>)?bo0FftbF8C>TO|3#?-&~o~rPjrFPd#(>81LeCSV1#_H)W@#7Vz?`qxs zxb^nWCY#*VY5Cg|$JX^+ZoT%x@w%&@w7uI+muibkOr#vtq}+lZ8+>T0KQf%CGk}Vx z|E}Fxr{#Mje`hSZE7Bi-{bvUJ3~BFfipEC919=84s*b_Iq5eqGgaLFsJyy4VhL;~Q z+oxry%C|=cCWa%nzI-;^9Emf-iQ%x{_Wqv@!1Doo{!Tq?z)zg6@aR2}-|LwBl+NzE zzG~AI==&5U>0x`9EnvIaZvYK{M>KYCUo?8}y{in6Gb4A$*<-qN!vOl5qj$5{@rjSv znw8h_NEaHzWa=Hfe%1h(vV`>F;jzO?CY2Pf#D_SUT+gZSzXlJTPmP*6_BoJ?|Lp!{ zHdfSB(`}B@`CeU4j$E_^Ty&nVqMa5!jau?)J+C#At7j9;6iXV!zOCG2tok(MXpR|# zLhdN3q)%BKS#rJ5%a(fbEX}gIC98jIY!{Ovku~{U(mhczO19zI#0h8_mNX{!ZtIr zfc+i>qp^t4219+ZaBL_t4%WdDyJ(3I*Y{Oq8|StQ&>(a?)Hgf#VDVlnY=rH{ZCp?D zK9L9WtSX@6c)fUkg~;_(Jew#5BEnkgX>gFV+e+mqjdT+monCK%R6#1uOF}kf(#Cl9PVRUYZ4`?wC76 ze_~%fBmH{b_sLp`BU$wqjL)~kOp>NfBBjzdy1JL6cZBD{WQPewa@~4ZkYimN9Z{{P2c98hvlScF{W!x-Zs3MaNpAq8*NP`q>OM zSwhaxCmgG}Yijzkqq;tvdQ_SFrHr_I~!}RW%y8PGMQx4u+MAbO%nh=-RkNh*XS|VYAI80#81C8jinnmd1}F` zRGy^M1P{`9NH9Dzlg5hBXoJw z)`d4VZ6e$C+CY1AqbbmYY7Jt8!!5e)PEpE)Nv{odN{uGJ*Dv{fb!-*qsi0Y qv3Z)DZkNaDVeq=?yBjTsHn$dd#d?9k-QcVjT;7IyVd2irM)DuDm@A9` delta 3803 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 gq>c*R!nctk*H(&3<)%CT6iZ|c?Ka+6|$p8QV diff --git a/tests/engines-boa.sh b/tests/engines/boa.sh similarity index 89% rename from tests/engines-boa.sh rename to tests/engines/boa.sh index b80e6b9..24a5b54 100755 --- a/tests/engines-boa.sh +++ b/tests/engines/boa.sh @@ -14,4 +14,4 @@ curl -LO https://cdn.sheetjs.com/xlsx-latest/package/dist/xlsx.full.min.js curl -LO https://sheetjs.com/pres.xlsx curl -L -o src/main.rs https://docs.sheetjs.com/boa/main.rs -cargo run --release; echo $? +cargo run --release pres.xlsx; echo $? diff --git a/tests/engines-chakracore.sh b/tests/engines/chakracore.sh similarity index 100% rename from tests/engines-chakracore.sh rename to tests/engines/chakracore.sh diff --git a/tests/engines-duktape.sh b/tests/engines/duktape.sh similarity index 100% rename from tests/engines-duktape.sh rename to tests/engines/duktape.sh diff --git a/tests/engines-execjs.sh b/tests/engines/execjs.sh similarity index 100% rename from tests/engines-execjs.sh rename to tests/engines/execjs.sh diff --git a/tests/engines-hermes.sh b/tests/engines/hermes.sh similarity index 100% rename from tests/engines-hermes.sh rename to tests/engines/hermes.sh diff --git a/tests/engines-jerryscript.sh b/tests/engines/jerryscript.sh similarity index 100% rename from tests/engines-jerryscript.sh rename to tests/engines/jerryscript.sh diff --git a/tests/engines-jurassic.sh b/tests/engines/jurassic.sh similarity index 97% rename from tests/engines-jurassic.sh rename to tests/engines/jurassic.sh index 95ee447..3225f85 100755 --- a/tests/engines-jurassic.sh +++ b/tests/engines/jurassic.sh @@ -9,7 +9,7 @@ cd SheetJSJurassic dotnet new console dotnet run -dotnet add package Jurassic --version 3.2.8 +dotnet add package Jurassic --version 3.2.9 curl -LO https://cdn.sheetjs.com/xlsx-latest/package/dist/shim.min.js curl -LO https://cdn.sheetjs.com/xlsx-latest/package/dist/xlsx.mini.min.js diff --git a/tests/engines-mujs.sh b/tests/engines/mujs.sh similarity index 91% rename from tests/engines-mujs.sh rename to tests/engines/mujs.sh index 9f3db60..92cd75c 100755 --- a/tests/engines-mujs.sh +++ b/tests/engines/mujs.sh @@ -7,7 +7,7 @@ rm -rf sheetjs-mu mkdir sheetjs-mu cd sheetjs-mu -curl -LO https://mujs.com/downloads/mujs-1.3.5.zip +curl -LO https://mujs.com/downloads/mujs-1.3.6.zip unzip mujs-*.zip rm mujs-*.zip cd mujs-* diff --git a/tests/engines-perl.sh b/tests/engines/perl.sh similarity index 100% rename from tests/engines-perl.sh rename to tests/engines/perl.sh diff --git a/tests/engines-quickjs.sh b/tests/engines/quickjs.sh similarity index 96% rename from tests/engines-quickjs.sh rename to tests/engines/quickjs.sh index 39cdd5a..83a7d3e 100755 --- a/tests/engines-quickjs.sh +++ b/tests/engines/quickjs.sh @@ -7,7 +7,7 @@ cd sheetjs-quickjs git clone https://github.com/bellard/quickjs cd quickjs -git checkout 6e2e68f +git checkout 3306254 make cd .. diff --git a/tests/engines-v8-rust.sh b/tests/engines/v8-rust.sh similarity index 100% rename from tests/engines-v8-rust.sh rename to tests/engines/v8-rust.sh diff --git a/tests/engines-v8-snapshot.sh b/tests/engines/v8-snapshot.sh similarity index 100% rename from tests/engines-v8-snapshot.sh rename to tests/engines/v8-snapshot.sh diff --git a/tests/server-express-worker.sh b/tests/server/express-worker.sh similarity index 100% rename from tests/server-express-worker.sh rename to tests/server/express-worker.sh diff --git a/tests/static-vite.sh b/tests/static/vite.sh similarity index 100% rename from tests/static-vite.sh rename to tests/static/vite.sh