From 8517daa25d5b35fd80ccd2ed61509ab332ee9809 Mon Sep 17 00:00:00 2001 From: Silvino Escalona Date: Sun, 5 Mar 2023 18:19:49 -0400 Subject: [PATCH] first commit --- .gitignore | 24 + index.html | 13 + package-lock.json | 1605 +++++++++++++++++ package.json | 27 + public/vite.svg | 1 + public/webr-serviceworker.js | 147 ++ public/webr-worker.js | 2967 ++++++++++++++++++++++++++++++++ src/App.tsx | 194 +++ src/assets/react.svg | 1 + src/components/Code.tsx | 60 + src/components/Console.tsx | 109 ++ src/components/DataFrame.tsx | 82 + src/components/Heading.tsx | 17 + src/components/Loading.tsx | 50 + src/components/Plot.tsx | 53 + src/components/Script.tsx | 117 ++ src/context/ConsoleContext.tsx | 198 +++ src/context/StdContext.tsx | 39 + src/helpers/index.ts | 3 + src/main.tsx | 11 + src/scripts/plot.R | 1 + src/scripts/plot2.R | 1 + src/scripts/setup.R | 11 + src/scripts/summary.R | 1 + src/theme/dracula.css | 81 + src/theme/index.css | 256 +++ src/vite-env.d.ts | 1 + tsconfig.json | 21 + tsconfig.node.json | 9 + vite.config.ts | 7 + 30 files changed, 6107 insertions(+) create mode 100644 .gitignore create mode 100644 index.html create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 public/vite.svg create mode 100644 public/webr-serviceworker.js create mode 100644 public/webr-worker.js create mode 100644 src/App.tsx create mode 100644 src/assets/react.svg create mode 100644 src/components/Code.tsx create mode 100644 src/components/Console.tsx create mode 100644 src/components/DataFrame.tsx create mode 100644 src/components/Heading.tsx create mode 100644 src/components/Loading.tsx create mode 100644 src/components/Plot.tsx create mode 100644 src/components/Script.tsx create mode 100644 src/context/ConsoleContext.tsx create mode 100644 src/context/StdContext.tsx create mode 100644 src/helpers/index.ts create mode 100644 src/main.tsx create mode 100644 src/scripts/plot.R create mode 100644 src/scripts/plot2.R create mode 100644 src/scripts/setup.R create mode 100644 src/scripts/summary.R create mode 100644 src/theme/dracula.css create mode 100644 src/theme/index.css create mode 100644 src/vite-env.d.ts create mode 100644 tsconfig.json create mode 100644 tsconfig.node.json create mode 100644 vite.config.ts diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/index.html b/index.html new file mode 100644 index 0000000..e0d1c84 --- /dev/null +++ b/index.html @@ -0,0 +1,13 @@ + + + + + + + Vite + React + TS + + +
+ + + diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..629acfe --- /dev/null +++ b/package-lock.json @@ -0,0 +1,1605 @@ +{ + "name": "webrreact", + "version": "0.0.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "webrreact", + "version": "0.0.0", + "dependencies": { + "@r-wasm/webr": "^0.1.0-alpha.18", + "highlight.js": "^11.7.0", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "react-simple-code-editor": "^0.13.1" + }, + "devDependencies": { + "@types/react": "^18.0.27", + "@types/react-dom": "^18.0.10", + "@vitejs/plugin-react-swc": "^3.0.0", + "typescript": "^4.9.3", + "vite": "^4.1.0" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.16.17.tgz", + "integrity": "sha512-N9x1CMXVhtWEAMS7pNNONyA14f71VPQN9Cnavj1XQh6T7bskqiLLrSca4O0Vr8Wdcga943eThxnVp3JLnBMYtw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.16.17.tgz", + "integrity": "sha512-MIGl6p5sc3RDTLLkYL1MyL8BMRN4tLMRCn+yRJJmEDvYZ2M7tmAf80hx1kbNEUX2KJ50RRtxZ4JHLvCfuB6kBg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.16.17.tgz", + "integrity": "sha512-a3kTv3m0Ghh4z1DaFEuEDfz3OLONKuFvI4Xqczqx4BqLyuFaFkuaG4j2MtA6fuWEFeC5x9IvqnX7drmRq/fyAQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.16.17.tgz", + "integrity": "sha512-/2agbUEfmxWHi9ARTX6OQ/KgXnOWfsNlTeLcoV7HSuSTv63E4DqtAc+2XqGw1KHxKMHGZgbVCZge7HXWX9Vn+w==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.16.17.tgz", + "integrity": "sha512-2By45OBHulkd9Svy5IOCZt376Aa2oOkiE9QWUK9fe6Tb+WDr8hXL3dpqi+DeLiMed8tVXspzsTAvd0jUl96wmg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.16.17.tgz", + "integrity": "sha512-mt+cxZe1tVx489VTb4mBAOo2aKSnJ33L9fr25JXpqQqzbUIw/yzIzi+NHwAXK2qYV1lEFp4OoVeThGjUbmWmdw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.16.17.tgz", + "integrity": "sha512-8ScTdNJl5idAKjH8zGAsN7RuWcyHG3BAvMNpKOBaqqR7EbUhhVHOqXRdL7oZvz8WNHL2pr5+eIT5c65kA6NHug==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.16.17.tgz", + "integrity": "sha512-iihzrWbD4gIT7j3caMzKb/RsFFHCwqqbrbH9SqUSRrdXkXaygSZCZg1FybsZz57Ju7N/SHEgPyaR0LZ8Zbe9gQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.16.17.tgz", + "integrity": "sha512-7S8gJnSlqKGVJunnMCrXHU9Q8Q/tQIxk/xL8BqAP64wchPCTzuM6W3Ra8cIa1HIflAvDnNOt2jaL17vaW+1V0g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.16.17.tgz", + "integrity": "sha512-kiX69+wcPAdgl3Lonh1VI7MBr16nktEvOfViszBSxygRQqSpzv7BffMKRPMFwzeJGPxcio0pdD3kYQGpqQ2SSg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.16.17.tgz", + "integrity": "sha512-dTzNnQwembNDhd654cA4QhbS9uDdXC3TKqMJjgOWsC0yNCbpzfWoXdZvp0mY7HU6nzk5E0zpRGGx3qoQg8T2DQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.16.17.tgz", + "integrity": "sha512-ezbDkp2nDl0PfIUn0CsQ30kxfcLTlcx4Foz2kYv8qdC6ia2oX5Q3E/8m6lq84Dj/6b0FrkgD582fJMIfHhJfSw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.16.17.tgz", + "integrity": "sha512-dzS678gYD1lJsW73zrFhDApLVdM3cUF2MvAa1D8K8KtcSKdLBPP4zZSLy6LFZ0jYqQdQ29bjAHJDgz0rVbLB3g==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.16.17.tgz", + "integrity": "sha512-ylNlVsxuFjZK8DQtNUwiMskh6nT0vI7kYl/4fZgV1llP5d6+HIeL/vmmm3jpuoo8+NuXjQVZxmKuhDApK0/cKw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.16.17.tgz", + "integrity": "sha512-gzy7nUTO4UA4oZ2wAMXPNBGTzZFP7mss3aKR2hH+/4UUkCOyqmjXiKpzGrY2TlEUhbbejzXVKKGazYcQTZWA/w==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.16.17.tgz", + "integrity": "sha512-mdPjPxfnmoqhgpiEArqi4egmBAMYvaObgn4poorpUaqmvzzbvqbowRllQ+ZgzGVMGKaPkqUmPDOOFQRUFDmeUw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.16.17.tgz", + "integrity": "sha512-/PzmzD/zyAeTUsduZa32bn0ORug+Jd1EGGAUJvqfeixoEISYpGnAezN6lnJoskauoai0Jrs+XSyvDhppCPoKOA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.16.17.tgz", + "integrity": "sha512-2yaWJhvxGEz2RiftSk0UObqJa/b+rIAjnODJgv2GbGGpRwAfpgzyrg1WLK8rqA24mfZa9GvpjLcBBg8JHkoodg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.16.17.tgz", + "integrity": "sha512-xtVUiev38tN0R3g8VhRfN7Zl42YCJvyBhRKw1RJjwE1d2emWTVToPLNEQj/5Qxc6lVFATDiy6LjVHYhIPrLxzw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.16.17.tgz", + "integrity": "sha512-ga8+JqBDHY4b6fQAmOgtJJue36scANy4l/rL97W+0wYmijhxKetzZdKOJI7olaBaMhWt8Pac2McJdZLxXWUEQw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.16.17.tgz", + "integrity": "sha512-WnsKaf46uSSF/sZhwnqE4L/F89AYNMiD4YtEcYekBt9Q7nj0DiId2XH2Ng2PHM54qi5oPrQ8luuzGszqi/veig==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.16.17.tgz", + "integrity": "sha512-y+EHuSchhL7FjHgvQL/0fnnFmO4T1bhvWANX6gcnqTjtnKWbTvUMCpGnv2+t+31d7RzyEAYAd4u2fnIhHL6N/Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@r-wasm/webr": { + "version": "0.1.0-alpha.18", + "resolved": "https://registry.npmjs.org/@r-wasm/webr/-/webr-0.1.0-alpha.18.tgz", + "integrity": "sha512-of6392ld6scXgOqram3P46kPPb7b+4RNcv2x0/l+q2Z6Xvu/SpjWh0vdwOFOCnQKeD3EW6r9bB1QDkGKu8ujwQ==", + "dependencies": { + "@types/emscripten": "^1.39.6", + "jquery": "^3.6.0", + "jstree": "^3.3.12", + "xmlhttprequest-ssl": "^2.1.0", + "xterm": "^5.1.0", + "xterm-addon-fit": "^0.7.0", + "xterm-readline": "^1.1.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@swc/core": { + "version": "1.3.37", + "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.3.37.tgz", + "integrity": "sha512-VOFlEQ1pReOM73N9A7R8rt561GU8Rxsq833jiimWDUB2sXEN3V6n6wFTgYmZuMz2T4/R0cQA1nV48KkaT4gkFw==", + "dev": true, + "hasInstallScript": true, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/swc" + }, + "optionalDependencies": { + "@swc/core-darwin-arm64": "1.3.37", + "@swc/core-darwin-x64": "1.3.37", + "@swc/core-linux-arm-gnueabihf": "1.3.37", + "@swc/core-linux-arm64-gnu": "1.3.37", + "@swc/core-linux-arm64-musl": "1.3.37", + "@swc/core-linux-x64-gnu": "1.3.37", + "@swc/core-linux-x64-musl": "1.3.37", + "@swc/core-win32-arm64-msvc": "1.3.37", + "@swc/core-win32-ia32-msvc": "1.3.37", + "@swc/core-win32-x64-msvc": "1.3.37" + } + }, + "node_modules/@swc/core-darwin-arm64": { + "version": "1.3.37", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.3.37.tgz", + "integrity": "sha512-iIyVqqioUpVeT/hbBVfkrsjfCyL4idNH+LVKGmoTAWaTTSB0+UNhNuA7Wh2CqIHWh1Mv7IlumitWPcqsVDdoEw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-darwin-x64": { + "version": "1.3.37", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.3.37.tgz", + "integrity": "sha512-dao5nXPWKxtaxqak4ZkRyBoApNIelW/glantQhPhj0FjMjuIQc+v03ldJ8XDByWOG+6xuVUTheANCtEccxoQBw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm-gnueabihf": { + "version": "1.3.37", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.3.37.tgz", + "integrity": "sha512-/mVrc8H/f062CUkqKGmBiil2VIYu4mKawHxERfeP1y38X5K/OwjG5s9MgO9TVxy+Ly6vejwj70kRhSa3hVp1Bw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm64-gnu": { + "version": "1.3.37", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.3.37.tgz", + "integrity": "sha512-eRQ3KaZI0j5LidTfOIi/kUVOOMuVmw1HCdt/Z1TAUKoHMLVxY8xcJ3pEE3/+ednI60EmHpwpJRs6LelXyL6uzQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm64-musl": { + "version": "1.3.37", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.3.37.tgz", + "integrity": "sha512-w2BRLODyxNQY2rfHZMZ5ir6QrrnGBPlnIslTrgKmVbn1OjZoxUCtuqhrYnCmybaAc4DOkeH02TqynEFXrm+EMw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-x64-gnu": { + "version": "1.3.37", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.3.37.tgz", + "integrity": "sha512-CfoH8EsZJZ9kunjMUjBNYD5fFuO86zw+K/o4wEw72Yg6ZEiqPmeIlCKU8tpTv4sK+CbhUXrmVzMB5tqsb2jALQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-x64-musl": { + "version": "1.3.37", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.3.37.tgz", + "integrity": "sha512-9YPrHYNdoG7PK11gV51GfL45biI2dic+YTqHUDKyykemsD7Ot1zUFX7Ty//pdvpKcKSff6SrHbfFACD5ziNirA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-arm64-msvc": { + "version": "1.3.37", + "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.3.37.tgz", + "integrity": "sha512-h17Ek8/wCDje6BrXOvCXBM80oBRmTSMMdLyt87whTl5xqYlWYYs9oQIzZndNRTlNpTgjGO8Ns2eo4kwVxIkBIA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-ia32-msvc": { + "version": "1.3.37", + "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.3.37.tgz", + "integrity": "sha512-1BR175E1olGy/zdt94cgdb6ps/lBNissAOaxyBk8taFpcjy3zpdP30yAoH0GIsC6isnZ5JfArbOJNRXXO5tE0Q==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-x64-msvc": { + "version": "1.3.37", + "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.3.37.tgz", + "integrity": "sha512-1siDQ7dccQ1pesJmgAL3BUBbRPtfbNInOWnZOkiie/DfFqGQ117QKnCVyjUvwFKfTQx1+3UUTDmMSlRd00SlXg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@types/emscripten": { + "version": "1.39.6", + "resolved": "https://registry.npmjs.org/@types/emscripten/-/emscripten-1.39.6.tgz", + "integrity": "sha512-H90aoynNhhkQP6DRweEjJp5vfUVdIj7tdPLsu7pq89vODD/lcugKfZOsfgwpvM6XUewEp2N5dCg1Uf3Qe55Dcg==" + }, + "node_modules/@types/prop-types": { + "version": "15.7.5", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", + "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==", + "dev": true + }, + "node_modules/@types/react": { + "version": "18.0.28", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.28.tgz", + "integrity": "sha512-RD0ivG1kEztNBdoAK7lekI9M+azSnitIn85h4iOiaLjaTrMjzslhaqCGaI4IyCJ1RljWiLCEu4jyrLLgqxBTew==", + "dev": true, + "dependencies": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.0.11", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.0.11.tgz", + "integrity": "sha512-O38bPbI2CWtgw/OoQoY+BRelw7uysmXbWvw3nLWO21H1HSh+GOlqPuXshJfjmpNlKiiSDG9cc1JZAaMmVdcTlw==", + "dev": true, + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/scheduler": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", + "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==", + "dev": true + }, + "node_modules/@vitejs/plugin-react-swc": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react-swc/-/plugin-react-swc-3.2.0.tgz", + "integrity": "sha512-IcBoXL/mcH7JdQr/nfDlDwTdIaH8Rg7LpfQDF4nAht+juHWIuv6WhpKPCSfY4+zztAaB07qdBoFz1XCZsgo3pQ==", + "dev": true, + "dependencies": { + "@swc/core": "^1.3.35" + }, + "peerDependencies": { + "vite": "^4" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/csstype": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz", + "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==", + "dev": true + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/esbuild": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.16.17.tgz", + "integrity": "sha512-G8LEkV0XzDMNwXKgM0Jwu3nY3lSTwSGY6XbxM9cr9+s0T/qSV1q1JVPBGzm3dcjhCic9+emZDmMffkwgPeOeLg==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.16.17", + "@esbuild/android-arm64": "0.16.17", + "@esbuild/android-x64": "0.16.17", + "@esbuild/darwin-arm64": "0.16.17", + "@esbuild/darwin-x64": "0.16.17", + "@esbuild/freebsd-arm64": "0.16.17", + "@esbuild/freebsd-x64": "0.16.17", + "@esbuild/linux-arm": "0.16.17", + "@esbuild/linux-arm64": "0.16.17", + "@esbuild/linux-ia32": "0.16.17", + "@esbuild/linux-loong64": "0.16.17", + "@esbuild/linux-mips64el": "0.16.17", + "@esbuild/linux-ppc64": "0.16.17", + "@esbuild/linux-riscv64": "0.16.17", + "@esbuild/linux-s390x": "0.16.17", + "@esbuild/linux-x64": "0.16.17", + "@esbuild/netbsd-x64": "0.16.17", + "@esbuild/openbsd-x64": "0.16.17", + "@esbuild/sunos-x64": "0.16.17", + "@esbuild/win32-arm64": "0.16.17", + "@esbuild/win32-ia32": "0.16.17", + "@esbuild/win32-x64": "0.16.17" + } + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/highlight.js": { + "version": "11.7.0", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-11.7.0.tgz", + "integrity": "sha512-1rRqesRFhMO/PRF+G86evnyJkCgaZFOI+Z6kdj15TA18funfoqJXvgPCLSf0SWq3SRfg1j3HlDs8o4s3EGq1oQ==", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/is-core-module": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", + "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/jquery": { + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.3.tgz", + "integrity": "sha512-bZ5Sy3YzKo9Fyc8wH2iIQK4JImJ6R0GWI9kL1/k7Z91ZBNgkRXE6U0JfHIizZbort8ZunhSI3jw9I6253ahKfg==" + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/jstree": { + "version": "3.3.15", + "resolved": "https://registry.npmjs.org/jstree/-/jstree-3.3.15.tgz", + "integrity": "sha512-fNK2EBgGjaJQ3cJuINX/80vDeAufYWtM0csudgYl3eJG+eRAH/1r1IJVUOvAlJIa+uSgg+Fi8uGrt+Xbs92eKg==", + "dependencies": { + "jquery": "^3.5.0" + } + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/nanoid": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", + "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", + "dev": true, + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/postcss": { + "version": "8.4.21", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz", + "integrity": "sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + } + ], + "dependencies": { + "nanoid": "^3.3.4", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/react": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", + "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.0" + }, + "peerDependencies": { + "react": "^18.2.0" + } + }, + "node_modules/react-simple-code-editor": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/react-simple-code-editor/-/react-simple-code-editor-0.13.1.tgz", + "integrity": "sha512-XYeVwRZwgyKtjNIYcAEgg2FaQcCZwhbarnkJIV20U2wkCU9q/CPFBo8nRXrK4GXUz3AvbqZFsZRrpUTkqqEYyQ==", + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "node_modules/resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/rollup": { + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.18.0.tgz", + "integrity": "sha512-J8C6VfEBjkvYPESMQYxKHxNOh4A5a3FlP+0BETGo34HEcE4eTlgCrO2+eWzlu2a/sHs2QUkZco+wscH7jhhgWg==", + "dev": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=14.18.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/scheduler": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", + "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typescript": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/vite": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.1.4.tgz", + "integrity": "sha512-3knk/HsbSTKEin43zHu7jTwYWv81f8kgAL99G5NWBcA1LKvtvcVAC4JjBH1arBunO9kQka+1oGbrMKOjk4ZrBg==", + "dev": true, + "dependencies": { + "esbuild": "^0.16.14", + "postcss": "^8.4.21", + "resolve": "^1.22.1", + "rollup": "^3.10.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + }, + "peerDependencies": { + "@types/node": ">= 14", + "less": "*", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/xmlhttprequest-ssl": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.1.0.tgz", + "integrity": "sha512-PlkG6ZrKEtYVRDboRw5uUzy3nc6vMrZyT94Z3MzLc0PvFzy6d6VD8OLKKcsk9GdQDxz0XQjIwNHvpIMC/1v0pA==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/xterm": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/xterm/-/xterm-5.1.0.tgz", + "integrity": "sha512-LovENH4WDzpwynj+OTkLyZgJPeDom9Gra4DMlGAgz6pZhIDCQ+YuO7yfwanY+gVbn/mmZIStNOnVRU/ikQuAEQ==" + }, + "node_modules/xterm-addon-fit": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/xterm-addon-fit/-/xterm-addon-fit-0.7.0.tgz", + "integrity": "sha512-tQgHGoHqRTgeROPnvmtEJywLKoC/V9eNs4bLLz7iyJr1aW/QFzRwfd3MGiJ6odJd9xEfxcW36/xRU47JkD5NKQ==", + "peerDependencies": { + "xterm": "^5.0.0" + } + }, + "node_modules/xterm-readline": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/xterm-readline/-/xterm-readline-1.1.1.tgz", + "integrity": "sha512-f87S2/jKwRZoZTxE2vkPgBCipDl6k6tTkMTb9pmwC4R6XkfR491fWBuToZd/nZasp6seD2u0jdABinUDWsK6dw==", + "dependencies": { + "string-width": "^4.0.0" + }, + "peerDependencies": { + "xterm": "^5.0.0" + } + } + }, + "dependencies": { + "@esbuild/android-arm": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.16.17.tgz", + "integrity": "sha512-N9x1CMXVhtWEAMS7pNNONyA14f71VPQN9Cnavj1XQh6T7bskqiLLrSca4O0Vr8Wdcga943eThxnVp3JLnBMYtw==", + "dev": true, + "optional": true + }, + "@esbuild/android-arm64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.16.17.tgz", + "integrity": "sha512-MIGl6p5sc3RDTLLkYL1MyL8BMRN4tLMRCn+yRJJmEDvYZ2M7tmAf80hx1kbNEUX2KJ50RRtxZ4JHLvCfuB6kBg==", + "dev": true, + "optional": true + }, + "@esbuild/android-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.16.17.tgz", + "integrity": "sha512-a3kTv3m0Ghh4z1DaFEuEDfz3OLONKuFvI4Xqczqx4BqLyuFaFkuaG4j2MtA6fuWEFeC5x9IvqnX7drmRq/fyAQ==", + "dev": true, + "optional": true + }, + "@esbuild/darwin-arm64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.16.17.tgz", + "integrity": "sha512-/2agbUEfmxWHi9ARTX6OQ/KgXnOWfsNlTeLcoV7HSuSTv63E4DqtAc+2XqGw1KHxKMHGZgbVCZge7HXWX9Vn+w==", + "dev": true, + "optional": true + }, + "@esbuild/darwin-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.16.17.tgz", + "integrity": "sha512-2By45OBHulkd9Svy5IOCZt376Aa2oOkiE9QWUK9fe6Tb+WDr8hXL3dpqi+DeLiMed8tVXspzsTAvd0jUl96wmg==", + "dev": true, + "optional": true + }, + "@esbuild/freebsd-arm64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.16.17.tgz", + "integrity": "sha512-mt+cxZe1tVx489VTb4mBAOo2aKSnJ33L9fr25JXpqQqzbUIw/yzIzi+NHwAXK2qYV1lEFp4OoVeThGjUbmWmdw==", + "dev": true, + "optional": true + }, + "@esbuild/freebsd-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.16.17.tgz", + "integrity": "sha512-8ScTdNJl5idAKjH8zGAsN7RuWcyHG3BAvMNpKOBaqqR7EbUhhVHOqXRdL7oZvz8WNHL2pr5+eIT5c65kA6NHug==", + "dev": true, + "optional": true + }, + "@esbuild/linux-arm": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.16.17.tgz", + "integrity": "sha512-iihzrWbD4gIT7j3caMzKb/RsFFHCwqqbrbH9SqUSRrdXkXaygSZCZg1FybsZz57Ju7N/SHEgPyaR0LZ8Zbe9gQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-arm64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.16.17.tgz", + "integrity": "sha512-7S8gJnSlqKGVJunnMCrXHU9Q8Q/tQIxk/xL8BqAP64wchPCTzuM6W3Ra8cIa1HIflAvDnNOt2jaL17vaW+1V0g==", + "dev": true, + "optional": true + }, + "@esbuild/linux-ia32": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.16.17.tgz", + "integrity": "sha512-kiX69+wcPAdgl3Lonh1VI7MBr16nktEvOfViszBSxygRQqSpzv7BffMKRPMFwzeJGPxcio0pdD3kYQGpqQ2SSg==", + "dev": true, + "optional": true + }, + "@esbuild/linux-loong64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.16.17.tgz", + "integrity": "sha512-dTzNnQwembNDhd654cA4QhbS9uDdXC3TKqMJjgOWsC0yNCbpzfWoXdZvp0mY7HU6nzk5E0zpRGGx3qoQg8T2DQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-mips64el": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.16.17.tgz", + "integrity": "sha512-ezbDkp2nDl0PfIUn0CsQ30kxfcLTlcx4Foz2kYv8qdC6ia2oX5Q3E/8m6lq84Dj/6b0FrkgD582fJMIfHhJfSw==", + "dev": true, + "optional": true + }, + "@esbuild/linux-ppc64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.16.17.tgz", + "integrity": "sha512-dzS678gYD1lJsW73zrFhDApLVdM3cUF2MvAa1D8K8KtcSKdLBPP4zZSLy6LFZ0jYqQdQ29bjAHJDgz0rVbLB3g==", + "dev": true, + "optional": true + }, + "@esbuild/linux-riscv64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.16.17.tgz", + "integrity": "sha512-ylNlVsxuFjZK8DQtNUwiMskh6nT0vI7kYl/4fZgV1llP5d6+HIeL/vmmm3jpuoo8+NuXjQVZxmKuhDApK0/cKw==", + "dev": true, + "optional": true + }, + "@esbuild/linux-s390x": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.16.17.tgz", + "integrity": "sha512-gzy7nUTO4UA4oZ2wAMXPNBGTzZFP7mss3aKR2hH+/4UUkCOyqmjXiKpzGrY2TlEUhbbejzXVKKGazYcQTZWA/w==", + "dev": true, + "optional": true + }, + "@esbuild/linux-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.16.17.tgz", + "integrity": "sha512-mdPjPxfnmoqhgpiEArqi4egmBAMYvaObgn4poorpUaqmvzzbvqbowRllQ+ZgzGVMGKaPkqUmPDOOFQRUFDmeUw==", + "dev": true, + "optional": true + }, + "@esbuild/netbsd-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.16.17.tgz", + "integrity": "sha512-/PzmzD/zyAeTUsduZa32bn0ORug+Jd1EGGAUJvqfeixoEISYpGnAezN6lnJoskauoai0Jrs+XSyvDhppCPoKOA==", + "dev": true, + "optional": true + }, + "@esbuild/openbsd-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.16.17.tgz", + "integrity": "sha512-2yaWJhvxGEz2RiftSk0UObqJa/b+rIAjnODJgv2GbGGpRwAfpgzyrg1WLK8rqA24mfZa9GvpjLcBBg8JHkoodg==", + "dev": true, + "optional": true + }, + "@esbuild/sunos-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.16.17.tgz", + "integrity": "sha512-xtVUiev38tN0R3g8VhRfN7Zl42YCJvyBhRKw1RJjwE1d2emWTVToPLNEQj/5Qxc6lVFATDiy6LjVHYhIPrLxzw==", + "dev": true, + "optional": true + }, + "@esbuild/win32-arm64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.16.17.tgz", + "integrity": "sha512-ga8+JqBDHY4b6fQAmOgtJJue36scANy4l/rL97W+0wYmijhxKetzZdKOJI7olaBaMhWt8Pac2McJdZLxXWUEQw==", + "dev": true, + "optional": true + }, + "@esbuild/win32-ia32": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.16.17.tgz", + "integrity": "sha512-WnsKaf46uSSF/sZhwnqE4L/F89AYNMiD4YtEcYekBt9Q7nj0DiId2XH2Ng2PHM54qi5oPrQ8luuzGszqi/veig==", + "dev": true, + "optional": true + }, + "@esbuild/win32-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.16.17.tgz", + "integrity": "sha512-y+EHuSchhL7FjHgvQL/0fnnFmO4T1bhvWANX6gcnqTjtnKWbTvUMCpGnv2+t+31d7RzyEAYAd4u2fnIhHL6N/Q==", + "dev": true, + "optional": true + }, + "@r-wasm/webr": { + "version": "0.1.0-alpha.18", + "resolved": "https://registry.npmjs.org/@r-wasm/webr/-/webr-0.1.0-alpha.18.tgz", + "integrity": "sha512-of6392ld6scXgOqram3P46kPPb7b+4RNcv2x0/l+q2Z6Xvu/SpjWh0vdwOFOCnQKeD3EW6r9bB1QDkGKu8ujwQ==", + "requires": { + "@types/emscripten": "^1.39.6", + "jquery": "^3.6.0", + "jstree": "^3.3.12", + "xmlhttprequest-ssl": "^2.1.0", + "xterm": "^5.1.0", + "xterm-addon-fit": "^0.7.0", + "xterm-readline": "^1.1.1" + } + }, + "@swc/core": { + "version": "1.3.37", + "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.3.37.tgz", + "integrity": "sha512-VOFlEQ1pReOM73N9A7R8rt561GU8Rxsq833jiimWDUB2sXEN3V6n6wFTgYmZuMz2T4/R0cQA1nV48KkaT4gkFw==", + "dev": true, + "requires": { + "@swc/core-darwin-arm64": "1.3.37", + "@swc/core-darwin-x64": "1.3.37", + "@swc/core-linux-arm-gnueabihf": "1.3.37", + "@swc/core-linux-arm64-gnu": "1.3.37", + "@swc/core-linux-arm64-musl": "1.3.37", + "@swc/core-linux-x64-gnu": "1.3.37", + "@swc/core-linux-x64-musl": "1.3.37", + "@swc/core-win32-arm64-msvc": "1.3.37", + "@swc/core-win32-ia32-msvc": "1.3.37", + "@swc/core-win32-x64-msvc": "1.3.37" + } + }, + "@swc/core-darwin-arm64": { + "version": "1.3.37", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.3.37.tgz", + "integrity": "sha512-iIyVqqioUpVeT/hbBVfkrsjfCyL4idNH+LVKGmoTAWaTTSB0+UNhNuA7Wh2CqIHWh1Mv7IlumitWPcqsVDdoEw==", + "dev": true, + "optional": true + }, + "@swc/core-darwin-x64": { + "version": "1.3.37", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.3.37.tgz", + "integrity": "sha512-dao5nXPWKxtaxqak4ZkRyBoApNIelW/glantQhPhj0FjMjuIQc+v03ldJ8XDByWOG+6xuVUTheANCtEccxoQBw==", + "dev": true, + "optional": true + }, + "@swc/core-linux-arm-gnueabihf": { + "version": "1.3.37", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.3.37.tgz", + "integrity": "sha512-/mVrc8H/f062CUkqKGmBiil2VIYu4mKawHxERfeP1y38X5K/OwjG5s9MgO9TVxy+Ly6vejwj70kRhSa3hVp1Bw==", + "dev": true, + "optional": true + }, + "@swc/core-linux-arm64-gnu": { + "version": "1.3.37", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.3.37.tgz", + "integrity": "sha512-eRQ3KaZI0j5LidTfOIi/kUVOOMuVmw1HCdt/Z1TAUKoHMLVxY8xcJ3pEE3/+ednI60EmHpwpJRs6LelXyL6uzQ==", + "dev": true, + "optional": true + }, + "@swc/core-linux-arm64-musl": { + "version": "1.3.37", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.3.37.tgz", + "integrity": "sha512-w2BRLODyxNQY2rfHZMZ5ir6QrrnGBPlnIslTrgKmVbn1OjZoxUCtuqhrYnCmybaAc4DOkeH02TqynEFXrm+EMw==", + "dev": true, + "optional": true + }, + "@swc/core-linux-x64-gnu": { + "version": "1.3.37", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.3.37.tgz", + "integrity": "sha512-CfoH8EsZJZ9kunjMUjBNYD5fFuO86zw+K/o4wEw72Yg6ZEiqPmeIlCKU8tpTv4sK+CbhUXrmVzMB5tqsb2jALQ==", + "dev": true, + "optional": true + }, + "@swc/core-linux-x64-musl": { + "version": "1.3.37", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.3.37.tgz", + "integrity": "sha512-9YPrHYNdoG7PK11gV51GfL45biI2dic+YTqHUDKyykemsD7Ot1zUFX7Ty//pdvpKcKSff6SrHbfFACD5ziNirA==", + "dev": true, + "optional": true + }, + "@swc/core-win32-arm64-msvc": { + "version": "1.3.37", + "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.3.37.tgz", + "integrity": "sha512-h17Ek8/wCDje6BrXOvCXBM80oBRmTSMMdLyt87whTl5xqYlWYYs9oQIzZndNRTlNpTgjGO8Ns2eo4kwVxIkBIA==", + "dev": true, + "optional": true + }, + "@swc/core-win32-ia32-msvc": { + "version": "1.3.37", + "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.3.37.tgz", + "integrity": "sha512-1BR175E1olGy/zdt94cgdb6ps/lBNissAOaxyBk8taFpcjy3zpdP30yAoH0GIsC6isnZ5JfArbOJNRXXO5tE0Q==", + "dev": true, + "optional": true + }, + "@swc/core-win32-x64-msvc": { + "version": "1.3.37", + "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.3.37.tgz", + "integrity": "sha512-1siDQ7dccQ1pesJmgAL3BUBbRPtfbNInOWnZOkiie/DfFqGQ117QKnCVyjUvwFKfTQx1+3UUTDmMSlRd00SlXg==", + "dev": true, + "optional": true + }, + "@types/emscripten": { + "version": "1.39.6", + "resolved": "https://registry.npmjs.org/@types/emscripten/-/emscripten-1.39.6.tgz", + "integrity": "sha512-H90aoynNhhkQP6DRweEjJp5vfUVdIj7tdPLsu7pq89vODD/lcugKfZOsfgwpvM6XUewEp2N5dCg1Uf3Qe55Dcg==" + }, + "@types/prop-types": { + "version": "15.7.5", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", + "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==", + "dev": true + }, + "@types/react": { + "version": "18.0.28", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.28.tgz", + "integrity": "sha512-RD0ivG1kEztNBdoAK7lekI9M+azSnitIn85h4iOiaLjaTrMjzslhaqCGaI4IyCJ1RljWiLCEu4jyrLLgqxBTew==", + "dev": true, + "requires": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "@types/react-dom": { + "version": "18.0.11", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.0.11.tgz", + "integrity": "sha512-O38bPbI2CWtgw/OoQoY+BRelw7uysmXbWvw3nLWO21H1HSh+GOlqPuXshJfjmpNlKiiSDG9cc1JZAaMmVdcTlw==", + "dev": true, + "requires": { + "@types/react": "*" + } + }, + "@types/scheduler": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", + "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==", + "dev": true + }, + "@vitejs/plugin-react-swc": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react-swc/-/plugin-react-swc-3.2.0.tgz", + "integrity": "sha512-IcBoXL/mcH7JdQr/nfDlDwTdIaH8Rg7LpfQDF4nAht+juHWIuv6WhpKPCSfY4+zztAaB07qdBoFz1XCZsgo3pQ==", + "dev": true, + "requires": { + "@swc/core": "^1.3.35" + } + }, + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "csstype": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz", + "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==", + "dev": true + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "esbuild": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.16.17.tgz", + "integrity": "sha512-G8LEkV0XzDMNwXKgM0Jwu3nY3lSTwSGY6XbxM9cr9+s0T/qSV1q1JVPBGzm3dcjhCic9+emZDmMffkwgPeOeLg==", + "dev": true, + "requires": { + "@esbuild/android-arm": "0.16.17", + "@esbuild/android-arm64": "0.16.17", + "@esbuild/android-x64": "0.16.17", + "@esbuild/darwin-arm64": "0.16.17", + "@esbuild/darwin-x64": "0.16.17", + "@esbuild/freebsd-arm64": "0.16.17", + "@esbuild/freebsd-x64": "0.16.17", + "@esbuild/linux-arm": "0.16.17", + "@esbuild/linux-arm64": "0.16.17", + "@esbuild/linux-ia32": "0.16.17", + "@esbuild/linux-loong64": "0.16.17", + "@esbuild/linux-mips64el": "0.16.17", + "@esbuild/linux-ppc64": "0.16.17", + "@esbuild/linux-riscv64": "0.16.17", + "@esbuild/linux-s390x": "0.16.17", + "@esbuild/linux-x64": "0.16.17", + "@esbuild/netbsd-x64": "0.16.17", + "@esbuild/openbsd-x64": "0.16.17", + "@esbuild/sunos-x64": "0.16.17", + "@esbuild/win32-arm64": "0.16.17", + "@esbuild/win32-ia32": "0.16.17", + "@esbuild/win32-x64": "0.16.17" + } + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "highlight.js": { + "version": "11.7.0", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-11.7.0.tgz", + "integrity": "sha512-1rRqesRFhMO/PRF+G86evnyJkCgaZFOI+Z6kdj15TA18funfoqJXvgPCLSf0SWq3SRfg1j3HlDs8o4s3EGq1oQ==" + }, + "is-core-module": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", + "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + }, + "jquery": { + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.3.tgz", + "integrity": "sha512-bZ5Sy3YzKo9Fyc8wH2iIQK4JImJ6R0GWI9kL1/k7Z91ZBNgkRXE6U0JfHIizZbort8ZunhSI3jw9I6253ahKfg==" + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "jstree": { + "version": "3.3.15", + "resolved": "https://registry.npmjs.org/jstree/-/jstree-3.3.15.tgz", + "integrity": "sha512-fNK2EBgGjaJQ3cJuINX/80vDeAufYWtM0csudgYl3eJG+eRAH/1r1IJVUOvAlJIa+uSgg+Fi8uGrt+Xbs92eKg==", + "requires": { + "jquery": "^3.5.0" + } + }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, + "nanoid": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", + "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", + "dev": true + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "postcss": { + "version": "8.4.21", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz", + "integrity": "sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==", + "dev": true, + "requires": { + "nanoid": "^3.3.4", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + } + }, + "react": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "requires": { + "loose-envify": "^1.1.0" + } + }, + "react-dom": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", + "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", + "requires": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.0" + } + }, + "react-simple-code-editor": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/react-simple-code-editor/-/react-simple-code-editor-0.13.1.tgz", + "integrity": "sha512-XYeVwRZwgyKtjNIYcAEgg2FaQcCZwhbarnkJIV20U2wkCU9q/CPFBo8nRXrK4GXUz3AvbqZFsZRrpUTkqqEYyQ==", + "requires": {} + }, + "resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "dev": true, + "requires": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "rollup": { + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.18.0.tgz", + "integrity": "sha512-J8C6VfEBjkvYPESMQYxKHxNOh4A5a3FlP+0BETGo34HEcE4eTlgCrO2+eWzlu2a/sHs2QUkZco+wscH7jhhgWg==", + "dev": true, + "requires": { + "fsevents": "~2.3.2" + } + }, + "scheduler": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", + "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "requires": { + "loose-envify": "^1.1.0" + } + }, + "source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true + }, + "typescript": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "dev": true + }, + "vite": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.1.4.tgz", + "integrity": "sha512-3knk/HsbSTKEin43zHu7jTwYWv81f8kgAL99G5NWBcA1LKvtvcVAC4JjBH1arBunO9kQka+1oGbrMKOjk4ZrBg==", + "dev": true, + "requires": { + "esbuild": "^0.16.14", + "fsevents": "~2.3.2", + "postcss": "^8.4.21", + "resolve": "^1.22.1", + "rollup": "^3.10.0" + } + }, + "xmlhttprequest-ssl": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.1.0.tgz", + "integrity": "sha512-PlkG6ZrKEtYVRDboRw5uUzy3nc6vMrZyT94Z3MzLc0PvFzy6d6VD8OLKKcsk9GdQDxz0XQjIwNHvpIMC/1v0pA==" + }, + "xterm": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/xterm/-/xterm-5.1.0.tgz", + "integrity": "sha512-LovENH4WDzpwynj+OTkLyZgJPeDom9Gra4DMlGAgz6pZhIDCQ+YuO7yfwanY+gVbn/mmZIStNOnVRU/ikQuAEQ==" + }, + "xterm-addon-fit": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/xterm-addon-fit/-/xterm-addon-fit-0.7.0.tgz", + "integrity": "sha512-tQgHGoHqRTgeROPnvmtEJywLKoC/V9eNs4bLLz7iyJr1aW/QFzRwfd3MGiJ6odJd9xEfxcW36/xRU47JkD5NKQ==", + "requires": {} + }, + "xterm-readline": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/xterm-readline/-/xterm-readline-1.1.1.tgz", + "integrity": "sha512-f87S2/jKwRZoZTxE2vkPgBCipDl6k6tTkMTb9pmwC4R6XkfR491fWBuToZd/nZasp6seD2u0jdABinUDWsK6dw==", + "requires": { + "string-width": "^4.0.0" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..31f3a17 --- /dev/null +++ b/package.json @@ -0,0 +1,27 @@ +{ + "name": "webrreact", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "npm run build:worker && npm run build:serviceworker && vite", + "build:worker": "cp ./node_modules/@r-wasm/webr/dist/webr-worker.js ./public/", + "build:serviceworker": "cp ./node_modules/@r-wasm/webr/dist/webr-serviceworker.js ./public/", + "build": "tsc && vite build", + "preview": "vite preview" + }, + "dependencies": { + "@r-wasm/webr": "^0.1.0-alpha.18", + "highlight.js": "^11.7.0", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "react-simple-code-editor": "^0.13.1" + }, + "devDependencies": { + "@types/react": "^18.0.27", + "@types/react-dom": "^18.0.10", + "@vitejs/plugin-react-swc": "^3.0.0", + "typescript": "^4.9.3", + "vite": "^4.1.0" + } +} diff --git a/public/vite.svg b/public/vite.svg new file mode 100644 index 0000000..e7b8dfb --- /dev/null +++ b/public/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/webr-serviceworker.js b/public/webr-serviceworker.js new file mode 100644 index 0000000..73a4792 --- /dev/null +++ b/public/webr-serviceworker.js @@ -0,0 +1,147 @@ +"use strict"; +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); + +// webR/compat.ts +var IN_NODE = typeof process !== "undefined" && process.release && process.release.name === "node" && typeof process.browser === "undefined"; +var loadScript; +if (globalThis.document) { + loadScript = (url) => new Promise((resolve, reject) => { + const script = document.createElement("script"); + script.src = url; + script.onload = () => resolve(); + script.onerror = reject; + document.head.appendChild(script); + }); +} else if (globalThis.importScripts) { + loadScript = async (url) => { + try { + globalThis.importScripts(url); + } catch (e) { + if (e instanceof TypeError) { + await Promise.resolve().then(() => __toESM(require(url))); + } else { + throw e; + } + } + }; +} else if (IN_NODE) { + loadScript = async (url) => { + const nodePathMod = (await Promise.resolve().then(() => __toESM(require("path")))).default; + await Promise.resolve().then(() => __toESM(require(nodePathMod.resolve(url)))); + }; +} else { + throw new Error("Cannot determine runtime environment"); +} + +// webR/utils.ts +function promiseHandles() { + const out = { + resolve: (_value) => { + }, + reject: (_reason) => { + }, + promise: null + }; + const promise = new Promise((resolve, reject) => { + out.resolve = resolve; + out.reject = reject; + }); + out.promise = promise; + return out; +} + +// webR/chan/message.ts +var encoder = new TextEncoder(); +var decoder = new TextDecoder("utf-8"); +function encodeData(data) { + return encoder.encode(JSON.stringify(data)); +} +function decodeData(data) { + return JSON.parse(decoder.decode(data)); +} + +// webR/chan/serviceworker.ts +var requests = {}; +function handleInstall() { + console.log("webR service worker installed"); + self.skipWaiting(); +} +function handleActivate(event) { + console.log("webR service worker activating"); + event.waitUntil(self.clients.claim()); +} +var sendRequest = async (clientId, uuid) => { + const client = await self.clients.get(clientId); + if (!client) { + throw new Error("Service worker client not found"); + } + if (!(uuid in requests)) { + requests[uuid] = promiseHandles(); + client.postMessage({ type: "request", data: uuid }); + } + const response = await requests[uuid].promise; + const headers = { "Cross-Origin-Embedder-Policy": "require-corp" }; + return new Response(encodeData(response), { headers }); +}; +var handleFetch = (event) => { + const wasmMatch = /__wasm__\/webr-fetch-request\//.exec(event.request.url); + if (!wasmMatch) { + return; + } + const requestBody = event.request.arrayBuffer(); + const requestReponse = requestBody.then(async (body) => { + const data = decodeData(new Uint8Array(body)); + return await sendRequest(data.clientId, data.uuid); + }); + event.waitUntil(requestReponse); + event.respondWith(requestReponse); +}; +function handleMessage(event) { + switch (event.data.type) { + case "register-client-main": { + self.clients.claim(); + const source = event.source; + self.clients.get(source.id).then((client) => { + if (!client) { + throw new Error("Can't respond to client in service worker message handler"); + } + client.postMessage({ + type: "registration-successful", + clientId: source.id + }); + }); + break; + } + case "wasm-webr-fetch-response": { + if (event.data.uuid in requests) { + requests[event.data.uuid].resolve(event.data.response); + delete requests[event.data.uuid]; + } + break; + } + default: + throw new Error(`Unknown service worker message type: ${event.data.type}`); + } +} +self.addEventListener("install", handleInstall); +self.addEventListener("activate", handleActivate); +self.addEventListener("fetch", handleFetch); +self.addEventListener("message", handleMessage); +//# sourceMappingURL=webr-serviceworker.js.map diff --git a/public/webr-worker.js b/public/webr-worker.js new file mode 100644 index 0000000..fa1e595 --- /dev/null +++ b/public/webr-worker.js @@ -0,0 +1,2967 @@ +"use strict"; +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __commonJS = (cb, mod) => function __require() { + return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports; +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __accessCheck = (obj, member, msg) => { + if (!member.has(obj)) + throw TypeError("Cannot " + msg); +}; +var __privateGet = (obj, member, getter) => { + __accessCheck(obj, member, "read from private field"); + return getter ? getter.call(obj) : member.get(obj); +}; +var __privateAdd = (obj, member, value) => { + if (member.has(obj)) + throw TypeError("Cannot add the same private member more than once"); + member instanceof WeakSet ? member.add(obj) : member.set(obj, value); +}; +var __privateSet = (obj, member, value, setter) => { + __accessCheck(obj, member, "write to private field"); + setter ? setter.call(obj, value) : member.set(obj, value); + return value; +}; +var __privateMethod = (obj, member, method) => { + __accessCheck(obj, member, "access private method"); + return method; +}; + +// node_modules/xmlhttprequest-ssl/lib/XMLHttpRequest.js +var require_XMLHttpRequest = __commonJS({ + "node_modules/xmlhttprequest-ssl/lib/XMLHttpRequest.js"(exports, module2) { + var fs = require("fs"); + var Url = require("url"); + var spawn = require("child_process").spawn; + module2.exports = XMLHttpRequest2; + XMLHttpRequest2.XMLHttpRequest = XMLHttpRequest2; + function XMLHttpRequest2(opts) { + "use strict"; + opts = opts || {}; + var self = this; + var http = require("http"); + var https = require("https"); + var request; + var response; + var settings = {}; + var disableHeaderCheck = false; + var defaultHeaders = { + "User-Agent": "node-XMLHttpRequest", + "Accept": "*/*" + }; + var headers = Object.assign({}, defaultHeaders); + var forbiddenRequestHeaders = [ + "accept-charset", + "accept-encoding", + "access-control-request-headers", + "access-control-request-method", + "connection", + "content-length", + "content-transfer-encoding", + "cookie", + "cookie2", + "date", + "expect", + "host", + "keep-alive", + "origin", + "referer", + "te", + "trailer", + "transfer-encoding", + "upgrade", + "via" + ]; + var forbiddenRequestMethods = [ + "TRACE", + "TRACK", + "CONNECT" + ]; + var sendFlag = false; + var errorFlag = false; + var abortedFlag = false; + var listeners = {}; + this.UNSENT = 0; + this.OPENED = 1; + this.HEADERS_RECEIVED = 2; + this.LOADING = 3; + this.DONE = 4; + this.readyState = this.UNSENT; + this.onreadystatechange = null; + this.responseText = ""; + this.responseXML = ""; + this.response = Buffer.alloc(0); + this.status = null; + this.statusText = null; + var isAllowedHttpHeader = function(header) { + return disableHeaderCheck || header && forbiddenRequestHeaders.indexOf(header.toLowerCase()) === -1; + }; + var isAllowedHttpMethod = function(method) { + return method && forbiddenRequestMethods.indexOf(method) === -1; + }; + this.open = function(method, url, async, user, password) { + this.abort(); + errorFlag = false; + abortedFlag = false; + if (!isAllowedHttpMethod(method)) { + throw new Error("SecurityError: Request method not allowed"); + } + settings = { + "method": method, + "url": url.toString(), + "async": typeof async !== "boolean" ? true : async, + "user": user || null, + "password": password || null + }; + setState(this.OPENED); + }; + this.setDisableHeaderCheck = function(state) { + disableHeaderCheck = state; + }; + this.setRequestHeader = function(header, value) { + if (this.readyState != this.OPENED) { + throw new Error("INVALID_STATE_ERR: setRequestHeader can only be called when state is OPEN"); + } + if (!isAllowedHttpHeader(header)) { + console.warn('Refused to set unsafe header "' + header + '"'); + return false; + } + if (sendFlag) { + throw new Error("INVALID_STATE_ERR: send flag is true"); + } + headers[header] = value; + return true; + }; + this.getResponseHeader = function(header) { + if (typeof header === "string" && this.readyState > this.OPENED && response.headers[header.toLowerCase()] && !errorFlag) { + return response.headers[header.toLowerCase()]; + } + return null; + }; + this.getAllResponseHeaders = function() { + if (this.readyState < this.HEADERS_RECEIVED || errorFlag) { + return ""; + } + var result = ""; + for (var i in response.headers) { + if (i !== "set-cookie" && i !== "set-cookie2") { + result += i + ": " + response.headers[i] + "\r\n"; + } + } + return result.substr(0, result.length - 2); + }; + this.getRequestHeader = function(name) { + if (typeof name === "string" && headers[name]) { + return headers[name]; + } + return ""; + }; + this.send = function(data) { + if (this.readyState != this.OPENED) { + throw new Error("INVALID_STATE_ERR: connection must be opened before send() is called"); + } + if (sendFlag) { + throw new Error("INVALID_STATE_ERR: send has already been called"); + } + var ssl = false, local = false; + var url = Url.parse(settings.url); + var host; + switch (url.protocol) { + case "https:": + ssl = true; + case "http:": + host = url.hostname; + break; + case "file:": + local = true; + break; + case void 0: + case "": + host = "localhost"; + break; + default: + throw new Error("Protocol not supported."); + } + if (local) { + if (settings.method !== "GET") { + throw new Error("XMLHttpRequest: Only GET method is supported"); + } + if (settings.async) { + fs.readFile(unescape(url.pathname), function(error, data2) { + if (error) { + self.handleError(error, error.errno || -1); + } else { + self.status = 200; + self.responseText = data2.toString("utf8"); + self.response = data2; + setState(self.DONE); + } + }); + } else { + try { + this.response = fs.readFileSync(unescape(url.pathname)); + this.responseText = this.response.toString("utf8"); + this.status = 200; + setState(self.DONE); + } catch (e) { + this.handleError(e, e.errno || -1); + } + } + return; + } + var port = url.port || (ssl ? 443 : 80); + var uri = url.pathname + (url.search ? url.search : ""); + headers["Host"] = host; + if (!(ssl && port === 443 || port === 80)) { + headers["Host"] += ":" + url.port; + } + if (settings.user) { + if (typeof settings.password == "undefined") { + settings.password = ""; + } + var authBuf = new Buffer(settings.user + ":" + settings.password); + headers["Authorization"] = "Basic " + authBuf.toString("base64"); + } + if (settings.method === "GET" || settings.method === "HEAD") { + data = null; + } else if (data) { + headers["Content-Length"] = Buffer.isBuffer(data) ? data.length : Buffer.byteLength(data); + if (!headers["Content-Type"]) { + headers["Content-Type"] = "text/plain;charset=UTF-8"; + } + } else if (settings.method === "POST") { + headers["Content-Length"] = 0; + } + var agent = opts.agent || false; + var options = { + host, + port, + path: uri, + method: settings.method, + headers, + agent + }; + if (ssl) { + options.pfx = opts.pfx; + options.key = opts.key; + options.passphrase = opts.passphrase; + options.cert = opts.cert; + options.ca = opts.ca; + options.ciphers = opts.ciphers; + options.rejectUnauthorized = opts.rejectUnauthorized === false ? false : true; + } + errorFlag = false; + if (settings.async) { + var doRequest = ssl ? https.request : http.request; + sendFlag = true; + self.dispatchEvent("readystatechange"); + var responseHandler = function(resp2) { + response = resp2; + if (response.statusCode === 302 || response.statusCode === 303 || response.statusCode === 307) { + settings.url = response.headers.location; + var url2 = Url.parse(settings.url); + host = url2.hostname; + var newOptions = { + hostname: url2.hostname, + port: url2.port, + path: url2.path, + method: response.statusCode === 303 ? "GET" : settings.method, + headers + }; + if (ssl) { + newOptions.pfx = opts.pfx; + newOptions.key = opts.key; + newOptions.passphrase = opts.passphrase; + newOptions.cert = opts.cert; + newOptions.ca = opts.ca; + newOptions.ciphers = opts.ciphers; + newOptions.rejectUnauthorized = opts.rejectUnauthorized === false ? false : true; + } + request = doRequest(newOptions, responseHandler).on("error", errorHandler); + request.end(); + return; + } + setState(self.HEADERS_RECEIVED); + self.status = response.statusCode; + response.on("data", function(chunk) { + if (chunk) { + var data2 = Buffer.from(chunk); + self.responseText += data2.toString("utf8"); + self.response = Buffer.concat([self.response, data2]); + } + if (sendFlag) { + setState(self.LOADING); + } + }); + response.on("end", function() { + if (sendFlag) { + sendFlag = false; + setState(self.DONE); + } + }); + response.on("error", function(error) { + self.handleError(error); + }); + }; + var errorHandler = function(error) { + self.handleError(error); + }; + request = doRequest(options, responseHandler).on("error", errorHandler); + if (opts.autoUnref) { + request.on("socket", (socket) => { + socket.unref(); + }); + } + if (data) { + request.write(data); + } + request.end(); + self.dispatchEvent("loadstart"); + } else { + var contentFile = ".node-xmlhttprequest-content-" + process.pid; + var syncFile = ".node-xmlhttprequest-sync-" + process.pid; + fs.writeFileSync(syncFile, "", "utf8"); + var execString = "var http = require('http'), https = require('https'), fs = require('fs');var doRequest = http" + (ssl ? "s" : "") + ".request;var options = " + JSON.stringify(options) + ";var responseText = '';var responseData = Buffer.alloc(0);var req = doRequest(options, function(response) {response.on('data', function(chunk) { var data = Buffer.from(chunk); responseText += data.toString('utf8'); responseData = Buffer.concat([responseData, data]);});response.on('end', function() {fs.writeFileSync('" + contentFile + "', JSON.stringify({err: null, data: {statusCode: response.statusCode, headers: response.headers, text: responseText, data: responseData.toString('base64')}}), 'utf8');fs.unlinkSync('" + syncFile + "');});response.on('error', function(error) {fs.writeFileSync('" + contentFile + "', 'NODE-XMLHTTPREQUEST-ERROR:' + JSON.stringify(error), 'utf8');fs.unlinkSync('" + syncFile + "');});}).on('error', function(error) {fs.writeFileSync('" + contentFile + "', 'NODE-XMLHTTPREQUEST-ERROR:' + JSON.stringify(error), 'utf8');fs.unlinkSync('" + syncFile + "');});" + (data ? "req.write('" + JSON.stringify(data).slice(1, -1).replace(/'/g, "\\'") + "');" : "") + "req.end();"; + var syncProc = spawn(process.argv[0], ["-e", execString]); + var statusText; + while (fs.existsSync(syncFile)) { + } + self.responseText = fs.readFileSync(contentFile, "utf8"); + syncProc.stdin.end(); + fs.unlinkSync(contentFile); + if (self.responseText.match(/^NODE-XMLHTTPREQUEST-ERROR:/)) { + var errorObj = JSON.parse(self.responseText.replace(/^NODE-XMLHTTPREQUEST-ERROR:/, "")); + self.handleError(errorObj, 503); + } else { + self.status = self.responseText.replace(/^NODE-XMLHTTPREQUEST-STATUS:([0-9]*),.*/, "$1"); + var resp = JSON.parse(self.responseText.replace(/^NODE-XMLHTTPREQUEST-STATUS:[0-9]*,(.*)/, "$1")); + response = { + statusCode: self.status, + headers: resp.data.headers + }; + self.responseText = resp.data.text; + self.response = Buffer.from(resp.data.data, "base64"); + setState(self.DONE, true); + } + } + }; + this.handleError = function(error, status) { + this.status = status || 0; + this.statusText = error; + this.responseText = error.stack; + errorFlag = true; + setState(this.DONE); + }; + this.abort = function() { + if (request) { + request.abort(); + request = null; + } + headers = Object.assign({}, defaultHeaders); + this.responseText = ""; + this.responseXML = ""; + this.response = Buffer.alloc(0); + errorFlag = abortedFlag = true; + if (this.readyState !== this.UNSENT && (this.readyState !== this.OPENED || sendFlag) && this.readyState !== this.DONE) { + sendFlag = false; + setState(this.DONE); + } + this.readyState = this.UNSENT; + }; + this.addEventListener = function(event, callback) { + if (!(event in listeners)) { + listeners[event] = []; + } + listeners[event].push(callback); + }; + this.removeEventListener = function(event, callback) { + if (event in listeners) { + listeners[event] = listeners[event].filter(function(ev) { + return ev !== callback; + }); + } + }; + this.dispatchEvent = function(event) { + if (typeof self["on" + event] === "function") { + if (this.readyState === this.DONE && settings.async) + setImmediate(function() { + self["on" + event](); + }); + else + self["on" + event](); + } + if (event in listeners) { + for (let i = 0, len = listeners[event].length; i < len; i++) { + if (this.readyState === this.DONE) + setImmediate(function() { + listeners[event][i].call(self); + }); + else + listeners[event][i].call(self); + } + } + }; + var setState = function(state) { + if (self.readyState === state || self.readyState === self.UNSENT && abortedFlag) + return; + self.readyState = state; + if (settings.async || self.readyState < self.OPENED || self.readyState === self.DONE) { + self.dispatchEvent("readystatechange"); + } + if (self.readyState === self.DONE) { + let fire; + if (abortedFlag) + fire = "abort"; + else if (errorFlag) + fire = "error"; + else + fire = "load"; + self.dispatchEvent(fire); + self.dispatchEvent("loadend"); + } + }; + } + } +}); + +// webR/compat.ts +var IN_NODE = typeof process !== "undefined" && process.release && process.release.name === "node" && typeof process.browser === "undefined"; +var loadScript; +if (globalThis.document) { + loadScript = (url) => new Promise((resolve, reject) => { + const script = document.createElement("script"); + script.src = url; + script.onload = () => resolve(); + script.onerror = reject; + document.head.appendChild(script); + }); +} else if (globalThis.importScripts) { + loadScript = async (url) => { + try { + globalThis.importScripts(url); + } catch (e) { + if (e instanceof TypeError) { + await Promise.resolve().then(() => __toESM(require(url))); + } else { + throw e; + } + } + }; +} else if (IN_NODE) { + loadScript = async (url) => { + const nodePathMod = (await Promise.resolve().then(() => __toESM(require("path")))).default; + await Promise.resolve().then(() => __toESM(require(nodePathMod.resolve(url)))); + }; +} else { + throw new Error("Cannot determine runtime environment"); +} + +// webR/utils.ts +function promiseHandles() { + const out = { + resolve: (_value) => { + }, + reject: (_reason) => { + }, + promise: null + }; + const promise = new Promise((resolve, reject) => { + out.resolve = resolve; + out.reject = reject; + }); + out.promise = promise; + return out; +} +function sleep(ms) { + return new Promise((resolve) => setTimeout(resolve, ms)); +} +function replaceInObject(obj, test, replacer, ...replacerArgs) { + if (obj === null || typeof obj !== "object") { + return obj; + } + if (test(obj)) { + return replacer(obj, ...replacerArgs); + } + if (Array.isArray(obj) || ArrayBuffer.isView(obj)) { + return obj.map( + (v) => replaceInObject(v, test, replacer, ...replacerArgs) + ); + } + return Object.fromEntries( + Object.entries(obj).map(([k, v], i) => [k, replaceInObject(v, test, replacer, ...replacerArgs)]) + ); +} +function newCrossOriginWorker(url, cb) { + const req = new XMLHttpRequest(); + req.open("get", url, true); + req.onload = () => { + const worker = new Worker(URL.createObjectURL(new Blob([req.responseText]))); + cb(worker); + }; + req.send(); +} +function isCrossOrigin(urlString) { + if (IN_NODE) + return false; + const url1 = new URL(location.href); + const url2 = new URL(urlString, location.origin); + if (url1.host === url2.host && url1.port === url2.port && url1.protocol === url2.protocol) { + return false; + } + return true; +} +function throwUnreachable(context) { + let msg = "Reached the unreachable"; + msg = msg + (context ? ": " + context : "."); + throw new Error(msg); +} + +// webR/chan/task-common.ts +var SZ_BUF_DOESNT_FIT = 0; +var SZ_BUF_FITS_IDX = 1; +var SZ_BUF_SIZE_IDX = 0; +var transferCache = /* @__PURE__ */ new WeakMap(); +function transfer(obj, transfers) { + transferCache.set(obj, transfers); + return obj; +} +function isUUID(x) { + return typeof x === "string" && x.length === UUID_LENGTH; +} +var UUID_LENGTH = 63; +function generateUUID() { + const result = Array.from({ length: 4 }, randomSegment).join("-"); + if (result.length !== UUID_LENGTH) { + throw new Error("comlink internal error: UUID has the wrong length"); + } + return result; +} +function randomSegment() { + let result = Math.floor(Math.random() * Number.MAX_SAFE_INTEGER).toString(16); + const pad = 15 - result.length; + if (pad > 0) { + result = Array.from({ length: pad }, () => 0).join("") + result; + } + return result; +} + +// webR/chan/message.ts +function newRequest(msg, transferables) { + return newRequestResponseMessage( + { + type: "request", + data: { + uuid: generateUUID(), + msg + } + }, + transferables + ); +} +function newResponse(uuid, resp, transferables) { + return newRequestResponseMessage( + { + type: "response", + data: { + uuid, + resp + } + }, + transferables + ); +} +function newRequestResponseMessage(msg, transferables) { + if (transferables) { + transfer(msg, transferables); + } + return msg; +} +function newSyncRequest(msg, data) { + return { + type: "sync-request", + data: { msg, reqData: data } + }; +} +var encoder = new TextEncoder(); +var decoder = new TextDecoder("utf-8"); +function encodeData(data) { + return encoder.encode(JSON.stringify(data)); +} +function decodeData(data) { + return JSON.parse(decoder.decode(data)); +} + +// webR/chan/task-main.ts +var encoder2 = new TextEncoder(); +async function syncResponse(endpoint, data, response) { + try { + let { taskId, sizeBuffer, dataBuffer, signalBuffer } = data; + const bytes = encodeData(response); + const fits = bytes.length <= dataBuffer.length; + Atomics.store(sizeBuffer, SZ_BUF_SIZE_IDX, bytes.length); + Atomics.store(sizeBuffer, SZ_BUF_FITS_IDX, +fits); + if (!fits) { + const [uuid, dataPromise] = requestResponseMessage(endpoint); + dataBuffer.set(encoder2.encode(uuid)); + await signalRequester(signalBuffer, taskId); + dataBuffer = (await dataPromise).dataBuffer; + } + dataBuffer.set(bytes); + Atomics.store(sizeBuffer, SZ_BUF_FITS_IDX, 1); + await signalRequester(signalBuffer, taskId); + } catch (e) { + console.warn(e); + } +} +function requestResponseMessage(ep) { + const id = generateUUID(); + return [ + id, + new Promise((resolve) => { + if (IN_NODE) { + ep.once("message", (message) => { + if (!message.id || message.id !== id) { + return; + } + resolve(message); + }); + } else { + ep.addEventListener("message", function l(ev) { + if (!ev.data || !ev.data.id || ev.data.id !== id) { + return; + } + ep.removeEventListener("message", l); + resolve(ev.data); + }); + } + if (ep.start) { + ep.start(); + } + }) + ]; +} +async function signalRequester(signalBuffer, taskId) { + const index = (taskId >> 1) % 32; + let sleepTime = 1; + while (Atomics.compareExchange(signalBuffer, index + 1, 0, taskId) !== 0) { + await sleep(sleepTime); + if (sleepTime < 32) { + sleepTime *= 2; + } + } + Atomics.or(signalBuffer, 0, 1 << index); + Atomics.notify(signalBuffer, 0); +} + +// webR/chan/queue.ts +var _promises, _resolvers, _add, add_fn; +var AsyncQueue = class { + constructor() { + __privateAdd(this, _add); + __privateAdd(this, _promises, void 0); + __privateAdd(this, _resolvers, void 0); + __privateSet(this, _resolvers, []); + __privateSet(this, _promises, []); + } + put(t) { + if (!__privateGet(this, _resolvers).length) { + __privateMethod(this, _add, add_fn).call(this); + } + const resolve = __privateGet(this, _resolvers).shift(); + resolve(t); + } + async get() { + if (!__privateGet(this, _promises).length) { + __privateMethod(this, _add, add_fn).call(this); + } + const promise = __privateGet(this, _promises).shift(); + return promise; + } + isEmpty() { + return !__privateGet(this, _promises).length; + } + isBlocked() { + return !!__privateGet(this, _resolvers).length; + } + get length() { + return __privateGet(this, _promises).length - __privateGet(this, _resolvers).length; + } +}; +_promises = new WeakMap(); +_resolvers = new WeakMap(); +_add = new WeakSet(); +add_fn = function() { + __privateGet(this, _promises).push( + new Promise((resolve) => { + __privateGet(this, _resolvers).push(resolve); + }) + ); +}; + +// webR/payload.ts +function webRPayloadError(payload) { + const e = new Error(payload.obj.message); + e.name = payload.obj.name; + e.stack = payload.obj.stack; + return e; +} +function isWebRPayload(value) { + return value && typeof value === "object" && "payloadType" in value && "obj" in value; +} +function isWebRPayloadPtr(value) { + return isWebRPayload(value) && value.payloadType === "ptr"; +} + +// webR/chan/channel.ts +var _parked; +var ChannelMain = class { + constructor() { + this.inputQueue = new AsyncQueue(); + this.outputQueue = new AsyncQueue(); + __privateAdd(this, _parked, /* @__PURE__ */ new Map()); + } + async read() { + return await this.outputQueue.get(); + } + async flush() { + const msg = []; + while (!this.outputQueue.isEmpty()) { + msg.push(await this.read()); + } + return msg; + } + write(msg) { + this.inputQueue.put(msg); + } + async request(msg, transferables) { + const req = newRequest(msg, transferables); + const { resolve, reject, promise } = promiseHandles(); + __privateGet(this, _parked).set(req.data.uuid, { resolve, reject }); + this.write(req); + return promise; + } + resolveResponse(msg) { + const uuid = msg.data.uuid; + const handles = __privateGet(this, _parked).get(uuid); + if (handles) { + const payload = msg.data.resp; + __privateGet(this, _parked).delete(uuid); + if (payload.payloadType === "err") { + handles.reject(webRPayloadError(payload)); + } else { + handles.resolve(payload); + } + } else { + console.warn("Can't find request."); + } + } +}; +_parked = new WeakMap(); + +// webR/chan/task-worker.ts +var decoder2 = new TextDecoder("utf-8"); +var _scheduled, _resolved, _result, _exception, _syncGen; +var SyncTask = class { + constructor(endpoint, msg, transfers = []) { + __privateAdd(this, _scheduled, false); + __privateAdd(this, _resolved, void 0); + __privateAdd(this, _result, void 0); + __privateAdd(this, _exception, void 0); + __privateAdd(this, _syncGen, void 0); + this.syncifier = new _Syncifier(); + this.endpoint = endpoint; + this.msg = msg; + this.transfers = transfers; + __privateSet(this, _resolved, false); + } + scheduleSync() { + if (__privateGet(this, _scheduled)) { + return; + } + __privateSet(this, _scheduled, true); + this.syncifier.scheduleTask(this); + __privateSet(this, _syncGen, this.doSync()); + __privateGet(this, _syncGen).next(); + return this; + } + poll() { + if (!__privateGet(this, _scheduled)) { + throw new Error("Task not synchronously scheduled"); + } + const { done, value } = __privateGet(this, _syncGen).next(); + if (!done) { + return false; + } + __privateSet(this, _resolved, true); + __privateSet(this, _result, value); + return true; + } + *doSync() { + const { endpoint, msg, transfers } = this; + const sizeBuffer = new Int32Array(new SharedArrayBuffer(8)); + const signalBuffer = this.signalBuffer; + const taskId = this.taskId; + let dataBuffer = acquireDataBuffer(UUID_LENGTH); + const syncMsg = newSyncRequest(msg, { + sizeBuffer, + dataBuffer, + signalBuffer, + taskId + }); + endpoint.postMessage(syncMsg, transfers); + yield; + if (Atomics.load(sizeBuffer, SZ_BUF_FITS_IDX) === SZ_BUF_DOESNT_FIT) { + const id = decoder2.decode(dataBuffer.slice(0, UUID_LENGTH)); + releaseDataBuffer(dataBuffer); + const size2 = Atomics.load(sizeBuffer, SZ_BUF_SIZE_IDX); + dataBuffer = acquireDataBuffer(size2); + endpoint.postMessage({ id, dataBuffer }); + yield; + } + const size = Atomics.load(sizeBuffer, SZ_BUF_SIZE_IDX); + return decodeData(dataBuffer.slice(0, size)); + } + get result() { + if (__privateGet(this, _exception)) { + throw __privateGet(this, _exception); + } + if (__privateGet(this, _resolved)) { + return __privateGet(this, _result); + } + throw new Error("Not ready."); + } + syncify() { + this.scheduleSync(); + this.syncifier.syncifyTask(this); + return this.result; + } +}; +_scheduled = new WeakMap(); +_resolved = new WeakMap(); +_result = new WeakMap(); +_exception = new WeakMap(); +_syncGen = new WeakMap(); +var _Syncifier = class { + constructor() { + this.nextTaskId = new Int32Array([1]); + this.signalBuffer = new Int32Array(new SharedArrayBuffer(32 * 4 + 4)); + this.tasks = /* @__PURE__ */ new Map(); + } + scheduleTask(task) { + task.taskId = this.nextTaskId[0]; + this.nextTaskId[0] += 2; + task.signalBuffer = this.signalBuffer; + this.tasks.set(task.taskId, task); + } + waitOnSignalBuffer() { + const timeout = 50; + for (; ; ) { + const status = Atomics.wait(this.signalBuffer, 0, 0, timeout); + switch (status) { + case "ok": + case "not-equal": + return; + case "timed-out": + if (interruptBuffer[0] !== 0) { + handleInterrupt(); + } + break; + default: + throw new Error("Unreachable"); + } + } + } + *tasksIdsToWakeup() { + const flag = Atomics.load(this.signalBuffer, 0); + for (let i = 0; i < 32; i++) { + const bit = 1 << i; + if (flag & bit) { + Atomics.and(this.signalBuffer, 0, ~bit); + const wokenTask = Atomics.exchange(this.signalBuffer, i + 1, 0); + yield wokenTask; + } + } + } + pollTasks(task) { + let result = false; + for (const wokenTaskId of this.tasksIdsToWakeup()) { + const wokenTask = this.tasks.get(wokenTaskId); + if (!wokenTask) { + throw new Error(`Assertion error: unknown taskId ${wokenTaskId}.`); + } + if (wokenTask.poll()) { + this.tasks.delete(wokenTaskId); + if (wokenTask === task) { + result = true; + } + } + } + return result; + } + syncifyTask(task) { + for (; ; ) { + this.waitOnSignalBuffer(); + if (this.pollTasks(task)) { + return; + } + } + } +}; +var dataBuffers = []; +function acquireDataBuffer(size) { + const powerof2 = Math.ceil(Math.log2(size)); + if (!dataBuffers[powerof2]) { + dataBuffers[powerof2] = []; + } + const result = dataBuffers[powerof2].pop(); + if (result) { + result.fill(0); + return result; + } + return new Uint8Array(new SharedArrayBuffer(2 ** powerof2)); +} +function releaseDataBuffer(buffer) { + const powerof2 = Math.ceil(Math.log2(buffer.byteLength)); + dataBuffers[powerof2].push(buffer); +} +var interruptBuffer = new Int32Array(new ArrayBuffer(4)); +var handleInterrupt = () => { + interruptBuffer[0] = 0; + throw new Error("Interrupted!"); +}; +function setInterruptHandler(handler) { + handleInterrupt = handler; +} +function setInterruptBuffer(buffer) { + interruptBuffer = new Int32Array(buffer); +} + +// webR/emscripten.ts +var Module = {}; +function dictEmFree(dict) { + Object.keys(dict).forEach((key) => Module._free(dict[key])); +} + +// webR/chan/channel-shared.ts +if (IN_NODE) { + globalThis.Worker = require("worker_threads").Worker; +} +var _interruptBuffer, _handleEventsFromWorker, handleEventsFromWorker_fn, _onMessageFromWorker; +var SharedBufferChannelMain = class extends ChannelMain { + constructor(config) { + super(); + __privateAdd(this, _handleEventsFromWorker); + __privateAdd(this, _interruptBuffer, void 0); + this.close = () => { + }; + __privateAdd(this, _onMessageFromWorker, async (worker, message) => { + if (!message || !message.type) { + return; + } + switch (message.type) { + case "resolve": + __privateSet(this, _interruptBuffer, new Int32Array(message.data)); + this.resolve(); + return; + case "response": + this.resolveResponse(message); + return; + default: + this.outputQueue.put(message); + return; + case "sync-request": { + const msg = message; + const payload = msg.data.msg; + const reqData = msg.data.reqData; + switch (payload.type) { + case "read": { + const response = await this.inputQueue.get(); + await syncResponse(worker, reqData, response); + break; + } + default: + throw new TypeError(`Unsupported request type '${payload.type}'.`); + } + return; + } + case "request": + throw new TypeError( + "Can't send messages of type 'request' from a worker. Please Use 'sync-request' instead." + ); + } + }); + const initWorker = (worker) => { + __privateMethod(this, _handleEventsFromWorker, handleEventsFromWorker_fn).call(this, worker); + this.close = () => worker.terminate(); + const msg = { + type: "init", + data: { config, channelType: ChannelType.SharedArrayBuffer } + }; + worker.postMessage(msg); + }; + if (isCrossOrigin(config.WEBR_URL)) { + newCrossOriginWorker( + `${config.WEBR_URL}webr-worker.js`, + (worker) => initWorker(worker) + ); + } else { + const worker = new Worker(`${config.WEBR_URL}webr-worker.js`); + initWorker(worker); + } + ({ resolve: this.resolve, promise: this.initialised } = promiseHandles()); + } + interrupt() { + if (!__privateGet(this, _interruptBuffer)) { + throw new Error("Failed attempt to interrupt before initialising interruptBuffer"); + } + __privateGet(this, _interruptBuffer)[0] = 1; + } +}; +_interruptBuffer = new WeakMap(); +_handleEventsFromWorker = new WeakSet(); +handleEventsFromWorker_fn = function(worker) { + if (IN_NODE) { + worker.on("message", (message) => { + __privateGet(this, _onMessageFromWorker).call(this, worker, message); + }); + } else { + worker.onmessage = (ev) => __privateGet(this, _onMessageFromWorker).call(this, worker, ev.data); + } +}; +_onMessageFromWorker = new WeakMap(); +var _ep, _dispatch, _interruptBuffer2, _interrupt; +var SharedBufferChannelWorker = class { + constructor() { + __privateAdd(this, _ep, void 0); + __privateAdd(this, _dispatch, () => 0); + __privateAdd(this, _interruptBuffer2, new Int32Array(new SharedArrayBuffer(4))); + __privateAdd(this, _interrupt, () => { + }); + __privateSet(this, _ep, IN_NODE ? require("worker_threads").parentPort : globalThis); + setInterruptBuffer(__privateGet(this, _interruptBuffer2).buffer); + setInterruptHandler(() => this.handleInterrupt()); + } + resolve() { + this.write({ type: "resolve", data: __privateGet(this, _interruptBuffer2).buffer }); + } + write(msg, transfer2) { + __privateGet(this, _ep).postMessage(msg, transfer2); + } + read() { + const msg = { type: "read" }; + const task = new SyncTask(__privateGet(this, _ep), msg); + return task.syncify(); + } + inputOrDispatch() { + for (; ; ) { + const msg = this.read(); + if (msg.type === "stdin") { + return Module.allocateUTF8(msg.data); + } + __privateGet(this, _dispatch).call(this, msg); + } + } + run(args) { + Module.callMain(args); + } + setInterrupt(interrupt) { + __privateSet(this, _interrupt, interrupt); + } + handleInterrupt() { + if (__privateGet(this, _interruptBuffer2)[0] !== 0) { + __privateGet(this, _interruptBuffer2)[0] = 0; + __privateGet(this, _interrupt).call(this); + } + } + setDispatchHandler(dispatch2) { + __privateSet(this, _dispatch, dispatch2); + } +}; +_ep = new WeakMap(); +_dispatch = new WeakMap(); +_interruptBuffer2 = new WeakMap(); +_interrupt = new WeakMap(); + +// webR/chan/channel-service.ts +if (IN_NODE) { + globalThis.Worker = require("worker_threads").Worker; +} +var _syncMessageCache, _registration, _interrupted, _registerServiceWorker, registerServiceWorker_fn, _onMessageFromServiceWorker, onMessageFromServiceWorker_fn, _handleEventsFromWorker2, handleEventsFromWorker_fn2, _onMessageFromWorker2; +var ServiceWorkerChannelMain = class extends ChannelMain { + constructor(config) { + super(); + __privateAdd(this, _registerServiceWorker); + __privateAdd(this, _onMessageFromServiceWorker); + __privateAdd(this, _handleEventsFromWorker2); + this.close = () => { + }; + __privateAdd(this, _syncMessageCache, /* @__PURE__ */ new Map()); + __privateAdd(this, _registration, void 0); + __privateAdd(this, _interrupted, false); + __privateAdd(this, _onMessageFromWorker2, async (worker, message) => { + if (!message || !message.type) { + return; + } + switch (message.type) { + case "resolve": + this.resolve(); + return; + case "response": + this.resolveResponse(message); + return; + default: + this.outputQueue.put(message); + return; + case "sync-request": { + const request = message.data; + __privateGet(this, _syncMessageCache).set(request.data.uuid, request.data.msg); + return; + } + case "request": + throw new TypeError( + "Can't send messages of type 'request' from a worker.Use service worker fetch request instead." + ); + } + }); + const initWorker = (worker) => { + __privateMethod(this, _handleEventsFromWorker2, handleEventsFromWorker_fn2).call(this, worker); + this.close = () => worker.terminate(); + __privateMethod(this, _registerServiceWorker, registerServiceWorker_fn).call(this, `${config.SW_URL}webr-serviceworker.js`).then((clientId) => { + const msg = { + type: "init", + data: { + config, + channelType: ChannelType.ServiceWorker, + clientId, + location: window.location.href + } + }; + worker.postMessage(msg); + }); + }; + if (isCrossOrigin(config.SW_URL)) { + newCrossOriginWorker( + `${config.SW_URL}webr-worker.js`, + (worker) => initWorker(worker) + ); + } else { + const worker = new Worker(`${config.SW_URL}webr-worker.js`); + initWorker(worker); + } + ({ resolve: this.resolve, promise: this.initialised } = promiseHandles()); + } + activeRegistration() { + var _a; + if (!((_a = __privateGet(this, _registration)) == null ? void 0 : _a.active)) { + throw new Error("Attempted to obtain a non-existent active registration."); + } + return __privateGet(this, _registration).active; + } + interrupt() { + __privateSet(this, _interrupted, true); + } +}; +_syncMessageCache = new WeakMap(); +_registration = new WeakMap(); +_interrupted = new WeakMap(); +_registerServiceWorker = new WeakSet(); +registerServiceWorker_fn = async function(url) { + __privateSet(this, _registration, await navigator.serviceWorker.register(url)); + await navigator.serviceWorker.ready; + window.addEventListener("beforeunload", () => { + var _a; + (_a = __privateGet(this, _registration)) == null ? void 0 : _a.unregister(); + }); + const clientId = await new Promise((resolve) => { + navigator.serviceWorker.addEventListener( + "message", + function listener(event) { + if (event.data.type === "registration-successful") { + navigator.serviceWorker.removeEventListener("message", listener); + resolve(event.data.clientId); + } + } + ); + this.activeRegistration().postMessage({ type: "register-client-main" }); + }); + navigator.serviceWorker.addEventListener("message", (event) => { + __privateMethod(this, _onMessageFromServiceWorker, onMessageFromServiceWorker_fn).call(this, event); + }); + return clientId; +}; +_onMessageFromServiceWorker = new WeakSet(); +onMessageFromServiceWorker_fn = async function(event) { + if (event.data.type === "request") { + const uuid = event.data.data; + const message = __privateGet(this, _syncMessageCache).get(uuid); + if (!message) { + throw new Error("Request not found during service worker XHR request"); + } + __privateGet(this, _syncMessageCache).delete(uuid); + switch (message.type) { + case "read": { + const response = await this.inputQueue.get(); + this.activeRegistration().postMessage({ + type: "wasm-webr-fetch-response", + uuid, + response: newResponse(uuid, response) + }); + break; + } + case "interrupt": { + const response = __privateGet(this, _interrupted); + this.activeRegistration().postMessage({ + type: "wasm-webr-fetch-response", + uuid, + response: newResponse(uuid, response) + }); + __privateSet(this, _interrupted, false); + break; + } + default: + throw new TypeError(`Unsupported request type '${message.type}'.`); + } + return; + } +}; +_handleEventsFromWorker2 = new WeakSet(); +handleEventsFromWorker_fn2 = function(worker) { + if (IN_NODE) { + worker.on("message", (message) => { + __privateGet(this, _onMessageFromWorker2).call(this, worker, message); + }); + } else { + worker.onmessage = (ev) => __privateGet(this, _onMessageFromWorker2).call(this, worker, ev.data); + } +}; +_onMessageFromWorker2 = new WeakMap(); +var _ep2, _mainThreadId, _location, _dispatch2, _interrupt2; +var ServiceWorkerChannelWorker = class { + constructor(data) { + __privateAdd(this, _ep2, void 0); + __privateAdd(this, _mainThreadId, void 0); + __privateAdd(this, _location, void 0); + __privateAdd(this, _dispatch2, () => 0); + __privateAdd(this, _interrupt2, () => { + }); + this.onMessageFromMainThread = () => { + }; + if (!data.clientId || !data.location) { + throw Error("Can't start service worker channel"); + } + __privateSet(this, _mainThreadId, data.clientId); + __privateSet(this, _location, data.location); + __privateSet(this, _ep2, IN_NODE ? require("worker_threads").parentPort : globalThis); + } + resolve() { + this.write({ type: "resolve" }); + } + write(msg, transfer2) { + __privateGet(this, _ep2).postMessage(msg, transfer2); + } + syncRequest(message) { + const request = newRequest(message); + this.write({ type: "sync-request", data: request }); + let retryCount = 0; + for (; ; ) { + try { + const url = new URL("__wasm__/webr-fetch-request/", __privateGet(this, _location)); + const xhr = new XMLHttpRequest(); + xhr.timeout = 6e4; + xhr.responseType = "arraybuffer"; + xhr.open("POST", url, false); + const fetchReqBody = { + clientId: __privateGet(this, _mainThreadId), + uuid: request.data.uuid + }; + xhr.send(encodeData(fetchReqBody)); + return decodeData(new Uint8Array(xhr.response)); + } catch (e) { + if (e instanceof DOMException && retryCount++ < 1e3) { + console.log("Service worker request failed - resending request"); + } else { + throw e; + } + } + } + } + read() { + const response = this.syncRequest({ type: "read" }); + return response.data.resp; + } + inputOrDispatch() { + for (; ; ) { + const msg = this.read(); + if (msg.type === "stdin") { + return Module.allocateUTF8(msg.data); + } + __privateGet(this, _dispatch2).call(this, msg); + } + } + run(args) { + Module.callMain(args); + } + setInterrupt(interrupt) { + __privateSet(this, _interrupt2, interrupt); + } + handleInterrupt() { + const response = this.syncRequest({ type: "interrupt" }); + const interrupted = response.data.resp; + if (interrupted) { + __privateGet(this, _interrupt2).call(this); + } + } + setDispatchHandler(dispatch2) { + __privateSet(this, _dispatch2, dispatch2); + } +}; +_ep2 = new WeakMap(); +_mainThreadId = new WeakMap(); +_location = new WeakMap(); +_dispatch2 = new WeakMap(); +_interrupt2 = new WeakMap(); + +// webR/chan/channel-common.ts +var ChannelType = { + Automatic: 0, + SharedArrayBuffer: 1, + ServiceWorker: 2 +}; +function newChannelWorker(msg) { + switch (msg.data.channelType) { + case ChannelType.SharedArrayBuffer: + return new SharedBufferChannelWorker(); + case ChannelType.ServiceWorker: + return new ServiceWorkerChannelWorker(msg.data); + default: + throw new Error("Unknown worker channel type recieved"); + } +} + +// webR/robj.ts +var RTypeMap = { + null: 0, + symbol: 1, + pairlist: 2, + closure: 3, + environment: 4, + promise: 5, + call: 6, + special: 7, + builtin: 8, + string: 9, + logical: 10, + integer: 13, + double: 14, + complex: 15, + character: 16, + dots: 17, + any: 18, + list: 19, + expression: 20, + bytecode: 21, + pointer: 22, + weakref: 23, + raw: 24, + s4: 25, + new: 30, + free: 31, + function: 99 +}; +function isComplex(value) { + return value && typeof value === "object" && "re" in value && "im" in value; +} + +// webR/utils-r.ts +function protect(x) { + Module._Rf_protect(handlePtr(x)); + return x; +} +function protectInc(x, prot) { + Module._Rf_protect(handlePtr(x)); + ++prot.n; + return x; +} +function protectWithIndex(x) { + const pLoc = Module._malloc(4); + Module._R_ProtectWithIndex(handlePtr(x), pLoc); + const loc = Module.getValue(pLoc, "i32"); + return { loc, ptr: pLoc }; +} +function unprotectIndex(index) { + Module._Rf_unprotect(1); + Module._free(index.ptr); +} +function reprotect(x, index) { + Module._R_Reprotect(handlePtr(x), index.loc); + return x; +} +function unprotect(n) { + Module._Rf_unprotect(n); +} +function envPoke(env, sym, value) { + Module._Rf_defineVar(handlePtr(sym), handlePtr(value), handlePtr(env)); +} +function parseEvalBare(code, env) { + const strings = {}; + const prot = { n: 0 }; + try { + const envObj = new REnvironment(env); + protectInc(envObj, prot); + strings.code = Module.allocateUTF8(code); + const out = Module._R_ParseEvalString(strings.code, envObj.ptr); + return RObject.wrap(out); + } finally { + dictEmFree(strings); + unprotect(prot.n); + } +} +var UnwindProtectException = class extends Error { + constructor(message, cont) { + super(message); + this.name = "UnwindProtectException"; + this.cont = cont; + } +}; +function safeEval(call, env) { + return Module.LDSO.loadedLibsByName["/usr/lib/R/library/webr/libs/webr.so"].module.ffi_safe_eval( + handlePtr(call), + handlePtr(env) + ); +} + +// webR/tree.ts +function isWebRDataTree(value) { + return value && typeof value === "object" && Object.keys(RTypeMap).includes(value.type); +} + +// webR/robj-worker.ts +function handlePtr(x) { + if (isRObject(x)) { + return x.ptr; + } else { + return x; + } +} +function assertRType(obj, type) { + if (Module._TYPEOF(obj.ptr) !== RTypeMap[type]) { + throw new Error(`Unexpected object type "${obj.type()}" when expecting type "${type}"`); + } +} +var shelters = /* @__PURE__ */ new Map(); +function keep(shelter, x) { + const ptr = handlePtr(x); + Module._R_PreserveObject(ptr); + if (shelter === void 0) { + return; + } + if (isUUID(shelter)) { + shelters.get(shelter).push(ptr); + return; + } + throw new Error("Unexpected shelter type " + typeof shelter); +} +function destroy(shelter, x) { + const ptr = handlePtr(x); + Module._R_ReleaseObject(ptr); + const objs = shelters.get(shelter); + const loc = objs.indexOf(ptr); + if (loc < 0) { + throw new Error("Can't find object in shelter."); + } + objs.splice(loc, 1); +} +function purge(shelter) { + const ptrs = shelters.get(shelter); + for (const ptr of ptrs) { + try { + Module._R_ReleaseObject(ptr); + } catch (e) { + console.error(e); + } + } + shelters.set(shelter, []); +} +function newObjectFromData(obj) { + if (isWebRDataTree(obj)) { + return new (getRWorkerClass(RTypeMap[obj.type]))(obj); + } + if (obj && typeof obj === "object" && "type" in obj && obj.type === "null") { + return new RNull(); + } + if (obj === null) { + return new RLogical({ type: "logical", names: null, values: [null] }); + } + if (typeof obj === "boolean") { + return new RLogical(obj); + } + if (typeof obj === "number") { + return new RDouble(obj); + } + if (typeof obj === "string") { + return new RCharacter(obj); + } + if (isComplex(obj)) { + return new RComplex(obj); + } + if (Array.isArray(obj)) { + return newObjectFromArray(obj); + } + throw new Error("Robj construction for this JS object is not yet supported"); +} +function newObjectFromArray(arr) { + const prot = { n: 0 }; + try { + const call = new RCall([new RSymbol("c"), ...arr]); + protectInc(call, prot); + return call.eval(); + } finally { + unprotect(prot.n); + } +} +var RObjectBase = class { + constructor(ptr) { + this.ptr = ptr; + } + type() { + const typeNumber = Module._TYPEOF(this.ptr); + const type = Object.keys(RTypeMap).find( + (typeName) => RTypeMap[typeName] === typeNumber + ); + return type; + } +}; +var _slice, slice_fn; +var _RObject = class extends RObjectBase { + constructor(data) { + if (!(data instanceof RObjectBase)) { + return newObjectFromData(data); + } + super(data.ptr); + __privateAdd(this, _slice); + } + static wrap(ptr) { + const type = Module._TYPEOF(ptr); + return new (getRWorkerClass(type))(new RObjectBase(ptr)); + } + get [Symbol.toStringTag]() { + return `RObject:${this.type()}`; + } + static getStaticPropertyValue(prop) { + return _RObject[prop]; + } + getPropertyValue(prop) { + return this[prop]; + } + inspect() { + parseEvalBare(".Internal(inspect(x))", { x: this }); + } + isNull() { + return Module._TYPEOF(this.ptr) === RTypeMap.null; + } + isUnbound() { + return this.ptr === _RObject.unboundValue.ptr; + } + attrs() { + return RPairlist.wrap(Module._ATTRIB(this.ptr)); + } + setNames(values) { + let namesObj; + if (values === null) { + namesObj = _RObject.null; + } else if (Array.isArray(values) && values.every((v) => typeof v === "string" || v === null)) { + namesObj = new RCharacter(values); + } else { + throw new Error("Argument to setNames must be null or an Array of strings or null"); + } + Module._Rf_setAttrib(this.ptr, _RObject.namesSymbol.ptr, namesObj.ptr); + return this; + } + names() { + const names = RCharacter.wrap(Module._Rf_getAttrib(this.ptr, _RObject.namesSymbol.ptr)); + if (names.isNull()) { + return null; + } else { + return names.toArray(); + } + } + includes(name) { + const names = this.names(); + return names && names.includes(name); + } + toTree(options = { depth: 0 }, depth = 1) { + throw new Error("This R object cannot be converted to JS"); + } + toJs() { + return this.toTree(); + } + subset(prop) { + return __privateMethod(this, _slice, slice_fn).call(this, prop, _RObject.bracketSymbol.ptr); + } + get(prop) { + return __privateMethod(this, _slice, slice_fn).call(this, prop, _RObject.bracket2Symbol.ptr); + } + getDollar(prop) { + return __privateMethod(this, _slice, slice_fn).call(this, prop, _RObject.dollarSymbol.ptr); + } + pluck(...path) { + const index = protectWithIndex(_RObject.null); + try { + const getter = (obj, prop) => { + const out = obj.get(prop); + return reprotect(out, index); + }; + const result = path.reduce(getter, this); + return result.isNull() ? void 0 : result; + } finally { + unprotectIndex(index); + } + } + set(prop, value) { + const prot = { n: 0 }; + try { + const idx = new _RObject(prop); + protectInc(idx, prot); + const valueObj = new _RObject(value); + protectInc(valueObj, prot); + const assign = new RSymbol("[[<-"); + const call = Module._Rf_lang4(assign.ptr, this.ptr, idx.ptr, valueObj.ptr); + protectInc(call, prot); + return _RObject.wrap(safeEval(call, _RObject.baseEnv)); + } finally { + unprotect(prot.n); + } + } + static getMethods(obj) { + const props = /* @__PURE__ */ new Set(); + let cur = obj; + do { + Object.getOwnPropertyNames(cur).map((p) => props.add(p)); + } while (cur = Object.getPrototypeOf(cur)); + return [...props.keys()].filter((i) => typeof obj[i] === "function"); + } + static get globalEnv() { + return _RObject.wrap(Module.getValue(Module._R_GlobalEnv, "*")); + } + static get emptyEnv() { + return _RObject.wrap(Module.getValue(Module._R_EmptyEnv, "*")); + } + static get baseEnv() { + return _RObject.wrap(Module.getValue(Module._R_BaseEnv, "*")); + } + static get null() { + return RNull.wrap(Module.getValue(Module._R_NilValue, "*")); + } + static get naLogical() { + return Module.getValue(Module._R_NaInt, "i32"); + } + static get naInteger() { + return Module.getValue(Module._R_NaInt, "i32"); + } + static get naDouble() { + return Module.getValue(Module._R_NaReal, "double"); + } + static get naString() { + return _RObject.wrap(Module.getValue(Module._R_NaString, "*")); + } + static get true() { + return RLogical.wrap(Module.getValue(Module._R_TrueValue, "*")); + } + static get false() { + return RLogical.wrap(Module.getValue(Module._R_FalseValue, "*")); + } + static get logicalNA() { + return RLogical.wrap(Module.getValue(Module._R_LogicalNAValue, "*")); + } + static get unboundValue() { + return _RObject.wrap(Module.getValue(Module._R_UnboundValue, "*")); + } + static get bracketSymbol() { + return RSymbol.wrap(Module.getValue(Module._R_BracketSymbol, "*")); + } + static get bracket2Symbol() { + return RSymbol.wrap(Module.getValue(Module._R_Bracket2Symbol, "*")); + } + static get dollarSymbol() { + return RSymbol.wrap(Module.getValue(Module._R_DollarSymbol, "*")); + } + static get namesSymbol() { + return RSymbol.wrap(Module.getValue(Module._R_NamesSymbol, "*")); + } +}; +var RObject = _RObject; +_slice = new WeakSet(); +slice_fn = function(prop, op) { + const prot = { n: 0 }; + try { + const idx = new _RObject(prop); + protectInc(idx, prot); + const call = Module._Rf_lang3(op, this.ptr, idx.ptr); + protectInc(call, prot); + return _RObject.wrap(safeEval(call, _RObject.baseEnv)); + } finally { + unprotect(prot.n); + } +}; +var RNull = class extends RObject { + constructor() { + super(new RObjectBase(Module.getValue(Module._R_NilValue, "*"))); + return this; + } + toTree() { + return { type: "null" }; + } +}; +var RSymbol = class extends RObject { + constructor(x) { + if (x instanceof RObjectBase) { + assertRType(x, "symbol"); + super(x); + return; + } + const name = Module.allocateUTF8(x); + try { + super(new RObjectBase(Module._Rf_install(name))); + } finally { + Module._free(name); + } + } + toTree() { + const obj = this.toObject(); + return { + type: "symbol", + printname: obj.printname, + symvalue: obj.symvalue, + internal: obj.internal + }; + } + toObject() { + return { + printname: this.printname().isUnbound() ? null : this.printname().toString(), + symvalue: this.symvalue().isUnbound() ? null : this.symvalue().ptr, + internal: this.internal().isNull() ? null : this.internal().ptr + }; + } + toString() { + return this.printname().toString(); + } + printname() { + return RString.wrap(Module._PRINTNAME(this.ptr)); + } + symvalue() { + return RObject.wrap(Module._SYMVALUE(this.ptr)); + } + internal() { + return RObject.wrap(Module._INTERNAL(this.ptr)); + } +}; +var RPairlist = class extends RObject { + constructor(val) { + if (val instanceof RObjectBase) { + assertRType(val, "pairlist"); + super(val); + return this; + } + const prot = { n: 0 }; + try { + const { names, values } = toWebRData(val); + const list = RPairlist.wrap(Module._Rf_allocList(values.length)); + protectInc(list, prot); + for (let [i, next] = [0, list]; !next.isNull(); [i, next] = [i + 1, next.cdr()]) { + next.setcar(new RObject(values[i])); + } + list.setNames(names); + super(list); + } finally { + unprotect(prot.n); + } + } + get length() { + return this.toArray().length; + } + toArray(options = { depth: 1 }) { + return this.toTree(options).values; + } + toObject({ + allowDuplicateKey = true, + allowEmptyKey = false, + depth = 1 + } = {}) { + const entries = this.entries({ depth }); + const keys = entries.map(([k, v]) => k); + if (!allowDuplicateKey && new Set(keys).size !== keys.length) { + throw new Error("Duplicate key when converting pairlist without allowDuplicateKey enabled"); + } + if (!allowEmptyKey && keys.some((k) => !k)) { + throw new Error("Empty or null key when converting pairlist without allowEmptyKey enabled"); + } + return Object.fromEntries( + entries.filter((u, idx) => entries.findIndex((v) => v[0] === u[0]) === idx) + ); + } + entries(options = { depth: 1 }) { + const obj = this.toTree(options); + return obj.values.map((v, i) => [obj.names ? obj.names[i] : null, v]); + } + toTree(options = { depth: 0 }, depth = 1) { + const namesArray = []; + let hasNames = false; + const values = []; + for (let next = this; !next.isNull(); next = next.cdr()) { + const symbol = next.tag(); + if (symbol.isNull()) { + namesArray.push(""); + } else { + hasNames = true; + namesArray.push(symbol.toString()); + } + if (options.depth && depth >= options.depth) { + values.push(next.car()); + } else { + values.push(next.car().toTree(options, depth + 1)); + } + } + const names = hasNames ? namesArray : null; + return { type: "pairlist", names, values }; + } + includes(name) { + return name in this.toObject(); + } + setcar(obj) { + Module._SETCAR(this.ptr, obj.ptr); + } + car() { + return RObject.wrap(Module._CAR(this.ptr)); + } + cdr() { + return RObject.wrap(Module._CDR(this.ptr)); + } + tag() { + return RObject.wrap(Module._TAG(this.ptr)); + } +}; +var RCall = class extends RObject { + constructor(val) { + if (val instanceof RObjectBase) { + assertRType(val, "call"); + super(val); + return this; + } + const prot = { n: 0 }; + try { + const { values } = toWebRData(val); + const objs = values.map((value) => protectInc(new RObject(value), prot)); + const call = RCall.wrap(Module._Rf_allocVector(RTypeMap.call, values.length)); + protectInc(call, prot); + for (let [i, next] = [0, call]; !next.isNull(); [i, next] = [i + 1, next.cdr()]) { + next.setcar(objs[i]); + } + super(call); + } finally { + unprotect(prot.n); + } + } + setcar(obj) { + Module._SETCAR(this.ptr, obj.ptr); + } + car() { + return RObject.wrap(Module._CAR(this.ptr)); + } + cdr() { + return RObject.wrap(Module._CDR(this.ptr)); + } + eval() { + return RObject.wrap(safeEval(this.ptr, RObject.baseEnv)); + } +}; +var RList = class extends RObject { + constructor(val) { + if (val instanceof RObjectBase) { + assertRType(val, "list"); + super(val); + return this; + } + const prot = { n: 0 }; + try { + const { names, values } = toWebRData(val); + const ptr = Module._Rf_allocVector(RTypeMap.list, values.length); + protectInc(ptr, prot); + values.forEach((v, i) => { + Module._SET_VECTOR_ELT(ptr, i, new RObject(v).ptr); + }); + RObject.wrap(ptr).setNames(names); + super(new RObjectBase(ptr)); + } finally { + unprotect(prot.n); + } + } + get length() { + return Module._LENGTH(this.ptr); + } + toArray(options = { depth: 1 }) { + return this.toTree(options).values; + } + toObject({ + allowDuplicateKey = true, + allowEmptyKey = false, + depth = 1 + } = {}) { + const entries = this.entries({ depth }); + const keys = entries.map(([k, v]) => k); + if (!allowDuplicateKey && new Set(keys).size !== keys.length) { + throw new Error("Duplicate key when converting list without allowDuplicateKey enabled"); + } + if (!allowEmptyKey && keys.some((k) => !k)) { + throw new Error("Empty or null key when converting list without allowEmptyKey enabled"); + } + return Object.fromEntries( + entries.filter((u, idx) => entries.findIndex((v) => v[0] === u[0]) === idx) + ); + } + entries(options = { depth: 1 }) { + const obj = this.toTree(options); + return obj.values.map((v, i) => [obj.names ? obj.names[i] : null, v]); + } + toTree(options = { depth: 0 }, depth = 1) { + return { + type: "list", + names: this.names(), + values: [...Array(this.length).keys()].map((i) => { + if (options.depth && depth >= options.depth) { + return this.get(i + 1); + } else { + return this.get(i + 1).toTree(options, depth + 1); + } + }) + }; + } +}; +var RFunction = class extends RObject { + exec(...args) { + const prot = { n: 0 }; + try { + const call = new RCall([this, ...args]); + protectInc(call, prot); + return call.eval(); + } finally { + unprotect(prot.n); + } + } +}; +var RString = class extends RObject { + constructor(x) { + if (x instanceof RObjectBase) { + assertRType(x, "string"); + super(x); + return; + } + const name = Module.allocateUTF8(x); + try { + super(new RObjectBase(Module._Rf_mkChar(name))); + } finally { + Module._free(name); + } + } + toString() { + return Module.UTF8ToString(Module._R_CHAR(this.ptr)); + } + toTree() { + return { + type: "string", + value: this.toString() + }; + } +}; +var REnvironment = class extends RObject { + constructor(val = {}) { + if (val instanceof RObjectBase) { + assertRType(val, "environment"); + super(val); + return this; + } + let nProt = 0; + try { + const { names, values } = toWebRData(val); + const ptr = protect(Module._R_NewEnv(RObject.globalEnv.ptr, 0, 0)); + ++nProt; + values.forEach((v, i) => { + const name = names ? names[i] : null; + if (!name) { + throw new Error("Can't create object in new environment with empty symbol name"); + } + const sym = new RSymbol(name); + const vObj = protect(new RObject(v)); + try { + envPoke(ptr, sym, vObj); + } finally { + unprotect(1); + } + }); + super(new RObjectBase(ptr)); + } finally { + unprotect(nProt); + } + } + ls(all = false, sorted = true) { + const ls = RCharacter.wrap(Module._R_lsInternal3(this.ptr, Number(all), Number(sorted))); + return ls.toArray(); + } + bind(name, value) { + const sym = new RSymbol(name); + const valueObj = protect(new RObject(value)); + try { + envPoke(this, sym, valueObj); + } finally { + unprotect(1); + } + } + names() { + return this.ls(true, true); + } + frame() { + return RObject.wrap(Module._FRAME(this.ptr)); + } + subset(prop) { + if (typeof prop === "number") { + throw new Error("Object of type environment is not subsettable"); + } + return this.getDollar(prop); + } + toObject({ depth = 0 } = {}) { + const symbols = this.names(); + return Object.fromEntries( + [...Array(symbols.length).keys()].map((i) => { + return [symbols[i], this.getDollar(symbols[i]).toTree({ depth })]; + }) + ); + } + toTree(options = { depth: 0 }, depth = 1) { + const names = this.names(); + const values = [...Array(names.length).keys()].map((i) => { + if (options.depth && depth >= options.depth) { + return this.getDollar(names[i]); + } else { + return this.getDollar(names[i]).toTree(options, depth + 1); + } + }); + return { + type: "environment", + names, + values + }; + } +}; +var RVectorAtomic = class extends RObject { + constructor(val, kind, newSetter) { + if (val instanceof RObjectBase) { + assertRType(val, kind); + super(val); + return this; + } + const prot = { n: 0 }; + try { + const { names, values } = toWebRData(val); + const ptr = Module._Rf_allocVector(RTypeMap[kind], values.length); + protectInc(ptr, prot); + values.forEach(newSetter(ptr)); + RObject.wrap(ptr).setNames(names); + super(new RObjectBase(ptr)); + } finally { + unprotect(prot.n); + } + } + get length() { + return Module._LENGTH(this.ptr); + } + get(prop) { + return super.get(prop); + } + subset(prop) { + return super.subset(prop); + } + getDollar(prop) { + throw new Error("$ operator is invalid for atomic vectors"); + } + detectMissing() { + const prot = { n: 0 }; + try { + const call = Module._Rf_lang2(new RSymbol("is.na").ptr, this.ptr); + protectInc(call, prot); + const val = RLogical.wrap(safeEval(call, RObject.baseEnv)); + protectInc(val, prot); + const ret = val.toTypedArray(); + return Array.from(ret).map((elt) => Boolean(elt)); + } finally { + unprotect(prot.n); + } + } + toArray() { + const arr = this.toTypedArray(); + return this.detectMissing().map((m, idx) => m ? null : arr[idx]); + } + toObject({ allowDuplicateKey = true, allowEmptyKey = false } = {}) { + const entries = this.entries(); + const keys = entries.map(([k, v]) => k); + if (!allowDuplicateKey && new Set(keys).size !== keys.length) { + throw new Error( + "Duplicate key when converting atomic vector without allowDuplicateKey enabled" + ); + } + if (!allowEmptyKey && keys.some((k) => !k)) { + throw new Error( + "Empty or null key when converting atomic vector without allowEmptyKey enabled" + ); + } + return Object.fromEntries( + entries.filter((u, idx) => entries.findIndex((v) => v[0] === u[0]) === idx) + ); + } + entries() { + const values = this.toArray(); + const names = this.names(); + return values.map((v, i) => [names ? names[i] : null, v]); + } + toTree() { + return { + type: this.type(), + names: this.names(), + values: this.toArray() + }; + } +}; +var _newSetter; +var _RLogical = class extends RVectorAtomic { + constructor(val) { + super(val, "logical", __privateGet(_RLogical, _newSetter)); + } + getBoolean(idx) { + return this.get(idx).toArray()[0]; + } + toBoolean() { + if (this.length !== 1) { + throw new Error("Can't convert atomic vector of length > 1 to a scalar JS value"); + } + const val = this.getBoolean(1); + if (val === null) { + throw new Error("Can't convert missing value `NA` to a JS boolean"); + } + return val; + } + toTypedArray() { + return new Int32Array( + Module.HEAP32.subarray( + Module._LOGICAL(this.ptr) / 4, + Module._LOGICAL(this.ptr) / 4 + this.length + ) + ); + } + toArray() { + const arr = this.toTypedArray(); + return this.detectMissing().map((m, idx) => m ? null : Boolean(arr[idx])); + } +}; +var RLogical = _RLogical; +_newSetter = new WeakMap(); +__privateAdd(RLogical, _newSetter, (ptr) => { + const data = Module._LOGICAL(ptr); + return (v, i) => { + Module.setValue(data + 4 * i, v === null ? RObject.naLogical : Boolean(v), "i32"); + }; +}); +var _newSetter2; +var _RInteger = class extends RVectorAtomic { + constructor(val) { + super(val, "integer", __privateGet(_RInteger, _newSetter2)); + } + getNumber(idx) { + return this.get(idx).toArray()[0]; + } + toNumber() { + if (this.length !== 1) { + throw new Error("Can't convert atomic vector of length > 1 to a scalar JS value"); + } + const val = this.getNumber(1); + if (val === null) { + throw new Error("Can't convert missing value `NA` to a JS number"); + } + return val; + } + toTypedArray() { + return new Int32Array( + Module.HEAP32.subarray( + Module._INTEGER(this.ptr) / 4, + Module._INTEGER(this.ptr) / 4 + this.length + ) + ); + } +}; +var RInteger = _RInteger; +_newSetter2 = new WeakMap(); +__privateAdd(RInteger, _newSetter2, (ptr) => { + const data = Module._INTEGER(ptr); + return (v, i) => { + Module.setValue(data + 4 * i, v === null ? RObject.naInteger : Math.round(Number(v)), "i32"); + }; +}); +var _newSetter3; +var _RDouble = class extends RVectorAtomic { + constructor(val) { + super(val, "double", __privateGet(_RDouble, _newSetter3)); + } + getNumber(idx) { + return this.get(idx).toArray()[0]; + } + toNumber() { + if (this.length !== 1) { + throw new Error("Can't convert atomic vector of length > 1 to a scalar JS value"); + } + const val = this.getNumber(1); + if (val === null) { + throw new Error("Can't convert missing value `NA` to a JS number"); + } + return val; + } + toTypedArray() { + return new Float64Array( + Module.HEAPF64.subarray(Module._REAL(this.ptr) / 8, Module._REAL(this.ptr) / 8 + this.length) + ); + } +}; +var RDouble = _RDouble; +_newSetter3 = new WeakMap(); +__privateAdd(RDouble, _newSetter3, (ptr) => { + const data = Module._REAL(ptr); + return (v, i) => { + Module.setValue(data + 8 * i, v === null ? RObject.naDouble : v, "double"); + }; +}); +var _newSetter4; +var _RComplex = class extends RVectorAtomic { + constructor(val) { + super(val, "complex", __privateGet(_RComplex, _newSetter4)); + } + getComplex(idx) { + return this.get(idx).toArray()[0]; + } + toComplex() { + if (this.length !== 1) { + throw new Error("Can't convert atomic vector of length > 1 to a scalar JS value"); + } + const val = this.getComplex(1); + if (val === null) { + throw new Error("Can't convert missing value `NA` to a JS object"); + } + return val; + } + toTypedArray() { + return new Float64Array( + Module.HEAPF64.subarray( + Module._COMPLEX(this.ptr) / 8, + Module._COMPLEX(this.ptr) / 8 + 2 * this.length + ) + ); + } + toArray() { + const arr = this.toTypedArray(); + return this.detectMissing().map( + (m, idx) => m ? null : { re: arr[2 * idx], im: arr[2 * idx + 1] } + ); + } +}; +var RComplex = _RComplex; +_newSetter4 = new WeakMap(); +__privateAdd(RComplex, _newSetter4, (ptr) => { + const data = Module._COMPLEX(ptr); + return (v, i) => { + Module.setValue(data + 8 * (2 * i), v === null ? RObject.naDouble : v.re, "double"); + Module.setValue(data + 8 * (2 * i + 1), v === null ? RObject.naDouble : v.im, "double"); + }; +}); +var _newSetter5; +var _RCharacter = class extends RVectorAtomic { + constructor(val) { + super(val, "character", __privateGet(_RCharacter, _newSetter5)); + } + getString(idx) { + return this.get(idx).toArray()[0]; + } + toString() { + if (this.length !== 1) { + throw new Error("Can't convert atomic vector of length > 1 to a scalar JS value"); + } + const val = this.getString(1); + if (val === null) { + throw new Error("Can't convert missing value `NA` to a JS string"); + } + return val; + } + toTypedArray() { + return new Uint32Array( + Module.HEAPU32.subarray( + Module._STRING_PTR(this.ptr) / 4, + Module._STRING_PTR(this.ptr) / 4 + this.length + ) + ); + } + toArray() { + return this.detectMissing().map( + (m, idx) => m ? null : Module.UTF8ToString(Module._R_CHAR(Module._STRING_ELT(this.ptr, idx))) + ); + } +}; +var RCharacter = _RCharacter; +_newSetter5 = new WeakMap(); +__privateAdd(RCharacter, _newSetter5, (ptr) => { + return (v, i) => { + if (v === null) { + Module._SET_STRING_ELT(ptr, i, RObject.naString.ptr); + } else { + Module._SET_STRING_ELT(ptr, i, new RString(v).ptr); + } + }; +}); +var _newSetter6; +var _RRaw = class extends RVectorAtomic { + constructor(val) { + super(val, "raw", __privateGet(_RRaw, _newSetter6)); + } + getNumber(idx) { + return this.get(idx).toArray()[0]; + } + toNumber() { + if (this.length !== 1) { + throw new Error("Can't convert atomic vector of length > 1 to a scalar JS value"); + } + const val = this.getNumber(1); + if (val === null) { + throw new Error("Can't convert missing value `NA` to a JS number"); + } + return val; + } + toTypedArray() { + return new Uint8Array( + Module.HEAPU8.subarray(Module._RAW(this.ptr), Module._RAW(this.ptr) + this.length) + ); + } +}; +var RRaw = _RRaw; +_newSetter6 = new WeakMap(); +__privateAdd(RRaw, _newSetter6, (ptr) => { + const data = Module._RAW(ptr); + return (v, i) => { + Module.setValue(data + i, Number(v), "i8"); + }; +}); +function toWebRData(jsObj) { + if (isWebRDataTree(jsObj)) { + return jsObj; + } else if (Array.isArray(jsObj)) { + return { names: null, values: jsObj }; + } else if (jsObj && typeof jsObj === "object" && !isComplex(jsObj)) { + return { + names: Object.keys(jsObj), + values: Object.values(jsObj) + }; + } + return { names: null, values: [jsObj] }; +} +function getRWorkerClass(type) { + const typeClasses = { + [RTypeMap.null]: RNull, + [RTypeMap.symbol]: RSymbol, + [RTypeMap.pairlist]: RPairlist, + [RTypeMap.closure]: RFunction, + [RTypeMap.environment]: REnvironment, + [RTypeMap.call]: RCall, + [RTypeMap.special]: RFunction, + [RTypeMap.builtin]: RFunction, + [RTypeMap.string]: RString, + [RTypeMap.logical]: RLogical, + [RTypeMap.integer]: RInteger, + [RTypeMap.double]: RDouble, + [RTypeMap.complex]: RComplex, + [RTypeMap.character]: RCharacter, + [RTypeMap.list]: RList, + [RTypeMap.raw]: RRaw, + [RTypeMap.function]: RFunction + }; + if (type in typeClasses) { + return typeClasses[type]; + } + return RObject; +} +function isRObject(value) { + return value instanceof RObject; +} + +// webR/webr-worker.ts +var initialised = false; +var chan; +var onWorkerMessage = function(msg) { + if (!msg || !msg.type || msg.type !== "init") { + return; + } + if (initialised) { + throw new Error("Can't initialise worker multiple times."); + } + const messageInit = msg; + chan = newChannelWorker(messageInit); + init(messageInit.data.config); + initialised = true; +}; +if (IN_NODE) { + require("worker_threads").parentPort.on("message", onWorkerMessage); + globalThis.XMLHttpRequest = require_XMLHttpRequest().XMLHttpRequest; +} else { + globalThis.onmessage = (ev) => onWorkerMessage(ev.data); +} +var _config; +function dispatch(msg) { + switch (msg.type) { + case "request": { + const req = msg; + const reqMsg = req.data.msg; + const write = (resp, transferables) => chan == null ? void 0 : chan.write(newResponse(req.data.uuid, resp, transferables)); + try { + switch (reqMsg.type) { + case "lookupPath": { + const msg2 = reqMsg; + const node = Module.FS.lookupPath(msg2.data.path, {}).node; + write({ + obj: copyFSNode(node), + payloadType: "raw" + }); + break; + } + case "mkdir": { + const msg2 = reqMsg; + write({ + obj: copyFSNode(Module.FS.mkdir(msg2.data.path)), + payloadType: "raw" + }); + break; + } + case "readFile": { + const msg2 = reqMsg; + const reqData = msg2.data; + const out = { + obj: Module.FS.readFile(reqData.path, { + encoding: "binary", + flags: reqData.flags + }), + payloadType: "raw" + }; + write(out, [out.obj.buffer]); + break; + } + case "rmdir": { + const msg2 = reqMsg; + write({ + obj: Module.FS.rmdir(msg2.data.path), + payloadType: "raw" + }); + break; + } + case "writeFile": { + const msg2 = reqMsg; + const reqData = msg2.data; + const data = Uint8Array.from(Object.values(reqData.data)); + write({ + obj: Module.FS.writeFile(reqData.path, data, { flags: reqData.flags }), + payloadType: "raw" + }); + break; + } + case "unlink": { + const msg2 = reqMsg; + write({ + obj: Module.FS.unlink(msg2.data.path), + payloadType: "raw" + }); + break; + } + case "newShelter": { + const id = generateUUID(); + shelters.set(id, []); + write({ + payloadType: "raw", + obj: id + }); + break; + } + case "shelterSize": { + const msg2 = reqMsg; + const size = shelters.get(msg2.data).length; + write({ payloadType: "raw", obj: size }); + break; + } + case "shelterPurge": { + const msg2 = reqMsg; + purge(msg2.data); + write({ payloadType: "raw", obj: null }); + break; + } + case "shelterDestroy": { + const msg2 = reqMsg; + destroy(msg2.data.id, msg2.data.obj.obj.ptr); + write({ payloadType: "raw", obj: null }); + break; + } + case "captureR": { + const msg2 = reqMsg; + const data = msg2.data; + const shelter = data.shelter; + const prot = { n: 0 }; + try { + const capture = captureR(data.code, data.env, data.options); + protectInc(capture, prot); + const result = capture.get("result"); + const outputs = capture.get(2); + keep(shelter, result); + const n = outputs.length; + const output = []; + for (let i = 1; i < n + 1; ++i) { + const out = outputs.get(i); + const type = out.pluck(1, 1).toString(); + const data2 = out.get(2); + if (type === "stdout" || type === "stderr") { + const msg3 = data2.toString(); + output.push({ type, data: msg3 }); + } else { + keep(shelter, data2); + const payload = { + obj: { + ptr: data2.ptr, + type: data2.type(), + methods: RObject.getMethods(data2) + }, + payloadType: "ptr" + }; + output.push({ type, data: payload }); + } + } + const resultPayload = { + payloadType: "ptr", + obj: { + ptr: result.ptr, + type: result.type(), + methods: RObject.getMethods(result) + } + }; + write({ + payloadType: "raw", + obj: { + result: resultPayload, + output + } + }); + } finally { + unprotect(prot.n); + } + break; + } + case "evalR": { + const msg2 = reqMsg; + const result = evalR(msg2.data.code, msg2.data.env); + keep(msg2.data.shelter, result); + write({ + obj: { + type: result.type(), + ptr: result.ptr, + methods: RObject.getMethods(result) + }, + payloadType: "ptr" + }); + break; + } + case "evalRRaw": { + const msg2 = reqMsg; + const result = evalR(msg2.data.code, msg2.data.env); + protect(result); + const throwType = () => { + throw new Error(`Can't convert object of type ${result.type()} to ${msg2.data.outputType}.`); + }; + try { + let out = void 0; + switch (msg2.data.outputType) { + case "void": + break; + case "boolean": + switch (result.type()) { + case "logical": + out = result.toBoolean(); + break; + default: + throwType(); + } + break; + case "number": + switch (result.type()) { + case "logical": + out = result.toBoolean(); + out = Number(out); + break; + case "integer": + out = result.toNumber(); + break; + case "double": + out = result.toNumber(); + break; + default: + throwType(); + } + break; + case "string": + switch (result.type()) { + case "character": + out = result.toString(); + break; + default: + throwType(); + } + break; + default: + throw new Error("Unexpected output type in `evalRRaw()."); + } + write({ + obj: out, + payloadType: "raw" + }); + break; + } finally { + unprotect(1); + } + } + case "newRObject": { + const msg2 = reqMsg; + const payload = newRObject(msg2.data.obj, msg2.data.objType); + keep(msg2.data.shelter, payload.obj.ptr); + write(payload); + break; + } + case "callRObjectMethod": { + const msg2 = reqMsg; + const data = msg2.data; + const obj = data.payload ? RObject.wrap(data.payload.obj.ptr) : RObject; + const payload = callRObjectMethod(obj, data.prop, data.args); + if (isWebRPayloadPtr(payload)) { + keep(data.shelter, payload.obj.ptr); + } + write(payload); + break; + } + case "installPackage": { + evalR(`webr::install("${reqMsg.data.name}", repos="${_config.PKG_URL}")`); + write({ + obj: true, + payloadType: "raw" + }); + break; + } + default: + throw new Error("Unknown event `" + reqMsg.type + "`"); + } + } catch (_e) { + const e = _e; + write({ + payloadType: "err", + obj: { name: e.name, message: e.message, stack: e.stack } + }); + if (e instanceof UnwindProtectException) { + Module._R_ContinueUnwind(e.cont); + throwUnreachable(); + } + } + break; + } + default: + throw new Error("Unknown event `" + msg.type + "`"); + } +} +function copyFSNode(obj) { + const retObj = { + id: obj.id, + name: obj.name, + mode: obj.mode, + isFolder: obj.isFolder, + contents: {} + }; + if (obj.isFolder) { + retObj.contents = Object.entries(obj.contents).map(([, node]) => copyFSNode(node)); + } + return retObj; +} +function downloadFileContent(URL2, headers = []) { + const request = new XMLHttpRequest(); + request.open("GET", URL2, false); + request.responseType = "arraybuffer"; + try { + headers.forEach((header) => { + const splitHeader = header.split(": "); + request.setRequestHeader(splitHeader[0], splitHeader[1]); + }); + } catch { + const responseText = "An error occured setting headers in XMLHttpRequest"; + console.error(responseText); + return { status: 400, response: responseText }; + } + try { + request.send(null); + const status = IN_NODE ? JSON.parse(String(request.status)).data.statusCode : request.status; + if (status >= 200 && status < 300) { + return { status, response: request.response }; + } else { + const responseText = new TextDecoder().decode(request.response); + console.error(`Error fetching ${URL2} - ${responseText}`); + return { status, response: responseText }; + } + } catch { + return { status: 400, response: "An error occured in XMLHttpRequest" }; + } +} +function newRObject(data, objType) { + const RClass = objType === "object" ? RObject : getRWorkerClass(RTypeMap[objType]); + const obj = new RClass( + replaceInObject( + data, + isWebRPayloadPtr, + (t) => RObject.wrap(t.obj.ptr) + ) + ); + return { + obj: { + type: obj.type(), + ptr: obj.ptr, + methods: RObject.getMethods(obj) + }, + payloadType: "ptr" + }; +} +function callRObjectMethod(obj, prop, args) { + if (!(prop in obj)) { + throw new ReferenceError(`${prop} is not defined`); + } + const fn = obj[prop]; + if (typeof fn !== "function") { + throw Error("Requested property cannot be invoked"); + } + const res = fn.apply( + obj, + args.map((arg) => { + if (arg.payloadType === "ptr") { + return RObject.wrap(arg.obj.ptr); + } + return replaceInObject( + arg.obj, + isWebRPayloadPtr, + (t) => RObject.wrap(t.obj.ptr) + ); + }) + ); + const ret = replaceInObject(res, isRObject, (obj2) => { + return { + obj: { type: obj2.type(), ptr: obj2.ptr, methods: RObject.getMethods(obj2) }, + payloadType: "ptr" + }; + }); + return { obj: ret, payloadType: "raw" }; +} +function captureR(code, env, options = {}) { + var _a; + const prot = { n: 0 }; + try { + const _options = Object.assign( + { + captureStreams: true, + captureConditions: true, + withAutoprint: false, + throwJsException: true, + withHandlers: true + }, + options + ); + let envObj = RObject.globalEnv; + if (env) { + envObj = REnvironment.wrap(env.obj.ptr); + if (envObj.type() !== "environment") { + throw new Error("Attempted to eval R code with an env argument with invalid SEXP type"); + } + } + const tPtr = RObject.true.ptr; + const fPtr = RObject.false.ptr; + const fn = parseEvalBare("webr::eval_r", RObject.baseEnv); + protectInc(fn, prot); + const codeObj = new RCharacter(code); + protectInc(codeObj, prot); + const call = Module._Rf_lang6( + fn.ptr, + codeObj.ptr, + _options.captureConditions ? tPtr : fPtr, + _options.captureStreams ? tPtr : fPtr, + _options.withAutoprint ? tPtr : fPtr, + _options.withHandlers ? tPtr : fPtr + ); + protectInc(call, prot); + const capture = RList.wrap(safeEval(call, envObj.ptr)); + protectInc(capture, prot); + if (_options.captureConditions && _options.throwJsException) { + const output = capture.get("output"); + const error = output.toArray().find( + (out) => out.get("type").toString() === "error" + ); + if (error) { + throw new Error( + ((_a = error.pluck("data", "message")) == null ? void 0 : _a.toString()) || "An error occured evaluating R code." + ); + } + } + return capture; + } finally { + unprotect(prot.n); + } +} +function evalR(code, env) { + var _a, _b; + const capture = captureR(code, env, void 0); + Module._Rf_protect(capture.ptr); + try { + const output = capture.get("output"); + for (let i = 1; i <= output.length; i++) { + const out = output.get(i); + const outputType = out.get("type").toString(); + switch (outputType) { + case "stdout": + console.log(out.get("data").toString()); + break; + case "stderr": + console.warn(out.get("data").toString()); + break; + case "message": + console.warn(((_a = out.pluck("data", "message")) == null ? void 0 : _a.toString()) || ""); + break; + case "warning": + console.warn(`Warning message: +${((_b = out.pluck("data", "message")) == null ? void 0 : _b.toString()) || ""}`); + break; + default: + console.warn(`Output of type ${outputType}:`); + console.warn(out.get("data").toJs()); + break; + } + } + return capture.get("result"); + } finally { + Module._Rf_unprotect(1); + } +} +function init(config) { + _config = config; + const env = { ...config.REnv }; + if (!env.TZ) { + const fmt = new Intl.DateTimeFormat(); + env.TZ = fmt.resolvedOptions().timeZone; + } + Module.preRun = []; + Module.arguments = _config.RArgs; + Module.noExitRuntime = true; + Module.noImageDecoding = true; + Module.noAudioDecoding = true; + Module.noInitialRun = true; + Module.noWasmDecoding = true; + Module.preRun.push(() => { + if (IN_NODE) { + globalThis.FS = Module.FS; + } + Module.FS.mkdirTree(_config.homedir); + Module.ENV.HOME = _config.homedir; + Module.FS.chdir(_config.homedir); + Module.ENV = Object.assign(Module.ENV, env); + }); + chan == null ? void 0 : chan.setDispatchHandler(dispatch); + Module.onRuntimeInitialized = () => { + chan == null ? void 0 : chan.run(_config.RArgs); + }; + Module.webr = { + UnwindProtectException, + resolveInit: () => { + chan == null ? void 0 : chan.setInterrupt(Module._Rf_onintr); + Module.setValue(Module._R_Interactive, _config.interactive, "*"); + evalR(`options(webr_pkg_repos="${_config.PKG_URL}")`); + chan == null ? void 0 : chan.resolve(); + }, + readConsole: () => { + if (!chan) { + throw new Error("Can't read console input without a communication channel"); + } + return chan.inputOrDispatch(); + }, + handleEvents: () => { + chan == null ? void 0 : chan.handleInterrupt(); + }, + evalJs: (code) => { + try { + return (0, eval)(Module.UTF8ToString(code)); + } catch (e) { + if (e instanceof UnwindProtectException) { + Module._R_ContinueUnwind(e.cont); + throwUnreachable(); + } + const msg = Module.allocateUTF8OnStack( + `An error occured during JavaScript evaluation: + ${e.message}` + ); + Module._Rf_error(msg); + } + throwUnreachable(); + return 0; + } + }; + Module.locateFile = (path) => _config.WEBR_URL + path; + Module.downloadFileContent = downloadFileContent; + Module.print = (text) => { + chan == null ? void 0 : chan.write({ type: "stdout", data: text }); + }; + Module.printErr = (text) => { + chan == null ? void 0 : chan.write({ type: "stderr", data: text }); + }; + Module.setPrompt = (prompt) => { + chan == null ? void 0 : chan.write({ type: "prompt", data: prompt }); + }; + Module.canvasExec = (op) => { + chan == null ? void 0 : chan.write({ type: "canvasExec", data: op }); + }; + globalThis.Module = Module; + setTimeout(() => { + const scriptSrc = `${_config.WEBR_URL}R.bin.js`; + loadScript(scriptSrc); + }); +} +/** + * Wrapper for built-in http.js to emulate the browser XMLHttpRequest object. + * + * This can be used with JS designed for browsers to improve reuse of code and + * allow the use of existing libraries. + * + * Usage: include("XMLHttpRequest.js") and use XMLHttpRequest per W3C specs. + * + * @author Dan DeFelippi + * @contributor David Ellis + * @license MIT + */ +//# sourceMappingURL=webr-worker.js.map diff --git a/src/App.tsx b/src/App.tsx new file mode 100644 index 0000000..be90d0f --- /dev/null +++ b/src/App.tsx @@ -0,0 +1,194 @@ +import { WebR } from "@r-wasm/webr"; +import { KeyboardEvent, useEffect, useState } from "react"; +import Plot from "./components/Plot"; +import Code from "./components/Code"; +import Console from "./components/Console"; +import DataFrame from "./components/DataFrame"; +import Heading from "./components/Heading"; +import Loading from "./components/Loading"; +import Script from "./components/Script"; +import { ConsoleContextProvider } from "./context/ConsoleContext"; +import { StdContextProvider } from "./context/StdContext"; +import { cleanScript } from "./helpers"; + +import hljs from "highlight.js"; +import r from "highlight.js/lib/languages/r"; +hljs.registerLanguage("r", r); + +import setupR from "./scripts/setup.R?raw"; +import summaryR from "./scripts/summary.R?raw"; +import Editor from "react-simple-code-editor"; + +const webR = new WebR({ + REnv: { + R_HOME: "/usr/lib/R", + R_ENABLE_JIT: "0", + R_DEFAULT_DEVICE: "canvas", + }, +}); + +function App() { + const [loadingMessage, setLoadingMessage] = useState( + "Loading WebR..." + ); + + const [scripts, setScripts] = useState(0); + + const [updates, setUpdates] = useState(0); + + const startWebR = async () => { + await webR.init(); + + // setLoadingMessage("Installing packages..."); + // await webR.installPackages(["ggplot2"]); + + setLoadingMessage("Running setup script..."); + + await webR.evalR(cleanScript(setupR)); + + setLoadingMessage(null); + }; + + // const onKeyDown = async (ev: KeyboardEvent) => { + // if (ev.code === "Enter") { + // const input = ev.target as HTMLInputElement; + // consoleR.stdin(input.value); + // input.value = ""; + // await consoleR.stdin("plot(data)"); + // } + // }; + + const updateData = async () => { + setUpdates((prev) => prev + 1); + }; + + useEffect(() => { + startWebR(); + }, []); + + return ( +
+ + + {loadingMessage && {loadingMessage}} + {!loadingMessage && ( +
+ R Setup + +

+ This code was ran before rendering the page. The R enviroment is + shared between all scripts, so these variables can be used in + other scripts +

+ + +
+
+ + + +
+
+ + Console + +

+ In the bottom left corner, you can click on the{" "} + + Console + {" "} + button to display the R console +

+ +
+
+ + Scripts + +

+ The scripts are editable. After every (except the last one) + statement a semicolon (;) is needed because of how the + input is sent. +

+ +

+ Edit "modl" to "model" and click on the{" "} + + Run + {" "} + button to run this code. +

+ + + ))} + + + +
+
+
+
+ + Dataframes + + + +

+ The{" "} + + DataFrame + {" "} + button can be used to display DataFrames with HTML +

+ + + +
+
+
+ + Plots +
+ + + +

+ The{" "} + + Plot + {" "} + button can be used to display plots. +

+ +