From 5b8ed8424ef494e1c4d3df02d3e25244232bd474 Mon Sep 17 00:00:00 2001 From: Mingwei Samuel Date: Wed, 4 Sep 2024 14:35:33 -0700 Subject: [PATCH 1/2] add working test harness site --- Cargo.lock | 12 + Cargo.toml | 1 + docs/src/pages/playground.js | 2 + wasm_test_site/.github/dependabot.yml | 8 + wasm_test_site/.gitignore | 6 + wasm_test_site/Cargo.toml | 27 + wasm_test_site/README.md | 88 ++ wasm_test_site/src/lib.rs | 31 + wasm_test_site/tests/web.rs | 13 + wasm_test_site/www/.gitignore | 1 + wasm_test_site/www/README.md | 79 ++ wasm_test_site/www/index.html | 10 + wasm_test_site/www/index.ts | 4 + wasm_test_site/www/package-lock.json | 1093 +++++++++++++++++++++++++ wasm_test_site/www/package.json | 30 + wasm_test_site/www/tsconfig.json | 12 + wasm_test_site/www/vite.config.ts | 8 + 17 files changed, 1425 insertions(+) create mode 100644 wasm_test_site/.github/dependabot.yml create mode 100644 wasm_test_site/.gitignore create mode 100644 wasm_test_site/Cargo.toml create mode 100644 wasm_test_site/README.md create mode 100644 wasm_test_site/src/lib.rs create mode 100644 wasm_test_site/tests/web.rs create mode 100644 wasm_test_site/www/.gitignore create mode 100644 wasm_test_site/www/README.md create mode 100644 wasm_test_site/www/index.html create mode 100644 wasm_test_site/www/index.ts create mode 100644 wasm_test_site/www/package-lock.json create mode 100644 wasm_test_site/www/package.json create mode 100644 wasm_test_site/www/tsconfig.json create mode 100644 wasm_test_site/www/vite.config.ts diff --git a/Cargo.lock b/Cargo.lock index 28c15037ea84..ec00cea1d0b5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3769,6 +3769,18 @@ dependencies = [ "syn 2.0.75", ] +[[package]] +name = "wasm_test_site" +version = "0.1.0" +dependencies = [ + "console_error_panic_hook", + "hydroflow", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm-bindgen-test", + "web-sys", +] + [[package]] name = "wasmparser" version = "0.206.0" diff --git a/Cargo.toml b/Cargo.toml index 53af7d2e836a..28330f318888 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -29,6 +29,7 @@ members = [ "stageleft_tool", "topolotree", "variadics", + "wasm_test_site", "website_playground", ] diff --git a/docs/src/pages/playground.js b/docs/src/pages/playground.js index e1f706d3f5a1..b1225ab49c37 100644 --- a/docs/src/pages/playground.js +++ b/docs/src/pages/playground.js @@ -30,6 +30,8 @@ if (siteConfig.customFields.LOAD_PLAYGROUND === '1') { } playgroundJS.init(); + + window.test_hydroflow = playgroundJS.test_hydroflow; } import mermaid from "mermaid"; diff --git a/wasm_test_site/.github/dependabot.yml b/wasm_test_site/.github/dependabot.yml new file mode 100644 index 000000000000..7377d37597f7 --- /dev/null +++ b/wasm_test_site/.github/dependabot.yml @@ -0,0 +1,8 @@ +version: 2 +updates: +- package-ecosystem: cargo + directory: "/" + schedule: + interval: daily + time: "08:00" + open-pull-requests-limit: 10 diff --git a/wasm_test_site/.gitignore b/wasm_test_site/.gitignore new file mode 100644 index 000000000000..4e301317e55e --- /dev/null +++ b/wasm_test_site/.gitignore @@ -0,0 +1,6 @@ +/target +**/*.rs.bk +Cargo.lock +bin/ +pkg/ +wasm-pack.log diff --git a/wasm_test_site/Cargo.toml b/wasm_test_site/Cargo.toml new file mode 100644 index 000000000000..9bf32fb4c69c --- /dev/null +++ b/wasm_test_site/Cargo.toml @@ -0,0 +1,27 @@ +[package] +name = "wasm_test_site" +version = "0.1.0" +authors = ["Mingwei Samuel "] +edition = "2018" + +[lib] +crate-type = ["cdylib", "rlib"] + +[dependencies] +hydroflow = { path = "../hydroflow" } +wasm-bindgen = "0.2.84" +wasm-bindgen-futures = "0.4.43" +web-sys = { version = "0.3.51", features = [ "console" ] } + +# The `console_error_panic_hook` crate provides better debugging of panics by +# logging them with `console.error`. This is great for development, but requires +# all the `std::fmt` and `std::panicking` infrastructure, so isn't great for +# code size when deploying. +console_error_panic_hook = "0.1.7" + +[dev-dependencies] +wasm-bindgen-test = "0.3.34" + +[profile.release] +# Tell `rustc` to optimize for small code size. +opt-level = "s" diff --git a/wasm_test_site/README.md b/wasm_test_site/README.md new file mode 100644 index 000000000000..6279fd688ffa --- /dev/null +++ b/wasm_test_site/README.md @@ -0,0 +1,88 @@ +# Go to `www/README.md` + +--- + +
+ +

wasm-pack-template

+ + A template for kick starting a Rust and WebAssembly project using wasm-pack. + +

+ Build Status +

+ +

+ Tutorial + | + Chat +

+ + Built with 🦀🕸 by The Rust and WebAssembly Working Group +
+ +## About + +[**📚 Read this template tutorial! 📚**][template-docs] + +This template is designed for compiling Rust libraries into WebAssembly and +publishing the resulting package to NPM. + +Be sure to check out [other `wasm-pack` tutorials online][tutorials] for other +templates and usages of `wasm-pack`. + +[tutorials]: https://rustwasm.github.io/docs/wasm-pack/tutorials/index.html +[template-docs]: https://rustwasm.github.io/docs/wasm-pack/tutorials/npm-browser-packages/index.html + +## 🚴 Usage + +### 🐑 Use `cargo generate` to Clone this Template + +[Learn more about `cargo generate` here.](https://github.com/ashleygwilliams/cargo-generate) + +``` +cargo generate --git https://github.com/rustwasm/wasm-pack-template.git --name my-project +cd my-project +``` + +### 🛠️ Build with `wasm-pack build` + +``` +wasm-pack build +``` + +### 🔬 Test in Headless Browsers with `wasm-pack test` + +``` +wasm-pack test --headless --firefox +``` + +### 🎁 Publish to NPM with `wasm-pack publish` + +``` +wasm-pack publish +``` + +## 🔋 Batteries Included + +* [`wasm-bindgen`](https://github.com/rustwasm/wasm-bindgen) for communicating + between WebAssembly and JavaScript. +* [`console_error_panic_hook`](https://github.com/rustwasm/console_error_panic_hook) + for logging panic messages to the developer console. +* `LICENSE-APACHE` and `LICENSE-MIT`: most Rust projects are licensed this way, so these are included for you + +## License + +Licensed under either of + +* Apache License, Version 2.0, ([LICENSE-APACHE](LICENSE-APACHE) or http://www.apache.org/licenses/LICENSE-2.0) +* MIT license ([LICENSE-MIT](LICENSE-MIT) or http://opensource.org/licenses/MIT) + +at your option. + +### Contribution + +Unless you explicitly state otherwise, any contribution intentionally +submitted for inclusion in the work by you, as defined in the Apache-2.0 +license, shall be dual licensed as above, without any additional terms or +conditions. diff --git a/wasm_test_site/src/lib.rs b/wasm_test_site/src/lib.rs new file mode 100644 index 000000000000..4ccae8151197 --- /dev/null +++ b/wasm_test_site/src/lib.rs @@ -0,0 +1,31 @@ +use wasm_bindgen::prelude::*; + +fn log(string: impl AsRef) { + web_sys::console::log_1(&JsValue::from_str(string.as_ref())); +} + +#[wasm_bindgen] +pub fn greet() { + console_error_panic_hook::set_once(); + + log("Hello, wasm_test_site!"); +} + +#[wasm_bindgen] +pub fn test_hydroflow() -> web_sys::js_sys::Promise { + console_error_panic_hook::set_once(); + + let mut df = hydroflow::hydroflow_syntax! { + // https://hydro.run/docs/hydroflow/quickstart/example_1_simplest + source_iter(0..10) -> for_each(|n| log(format!("Hello {}", n))); + }; + + wasm_bindgen_futures::future_to_promise(async move { + let work_done = df.run_available_async().await; + Ok(if work_done { + JsValue::TRUE + } else { + JsValue::FALSE + }) + }) +} diff --git a/wasm_test_site/tests/web.rs b/wasm_test_site/tests/web.rs new file mode 100644 index 000000000000..de5c1dafefb6 --- /dev/null +++ b/wasm_test_site/tests/web.rs @@ -0,0 +1,13 @@ +//! Test suite for the Web and headless browsers. + +#![cfg(target_arch = "wasm32")] + +extern crate wasm_bindgen_test; +use wasm_bindgen_test::*; + +wasm_bindgen_test_configure!(run_in_browser); + +#[wasm_bindgen_test] +fn pass() { + assert_eq!(1 + 1, 2); +} diff --git a/wasm_test_site/www/.gitignore b/wasm_test_site/www/.gitignore new file mode 100644 index 000000000000..096746c1480d --- /dev/null +++ b/wasm_test_site/www/.gitignore @@ -0,0 +1 @@ +/node_modules/ \ No newline at end of file diff --git a/wasm_test_site/www/README.md b/wasm_test_site/www/README.md new file mode 100644 index 000000000000..e0bb5ed4374b --- /dev/null +++ b/wasm_test_site/www/README.md @@ -0,0 +1,79 @@ +Run once to init: +``` +npm ci +``` +Run to rebuild: +``` +npm run wasm +npm run dev +``` + +--- + +
+ +

create-wasm-app

+ + An npm init template for kick starting a project that uses NPM packages containing Rust-generated WebAssembly and bundles them with Webpack. + +

+ Build Status +

+ +

+ Usage + | + Chat +

+ + Built with 🦀🕸 by The Rust and WebAssembly Working Group +
+ +## About + +This template is designed for depending on NPM packages that contain +Rust-generated WebAssembly and using them to create a Website. + +* Want to create an NPM package with Rust and WebAssembly? [Check out + `wasm-pack-template`.](https://github.com/rustwasm/wasm-pack-template) +* Want to make a monorepo-style Website without publishing to NPM? Check out + [`rust-webpack-template`](https://github.com/rustwasm/rust-webpack-template) + and/or + [`rust-parcel-template`](https://github.com/rustwasm/rust-parcel-template). + +## 🚴 Usage + +``` +npm init wasm-app +``` + +## 🔋 Batteries Included + +- `.gitignore`: ignores `node_modules` +- `LICENSE-APACHE` and `LICENSE-MIT`: most Rust projects are licensed this way, so these are included for you +- `README.md`: the file you are reading now! +- `index.html`: a bare bones html document that includes the webpack bundle +- `index.js`: example js file with a comment showing how to import and use a wasm pkg +- `package.json` and `package-lock.json`: + - pulls in devDependencies for using webpack: + - [`webpack`](https://www.npmjs.com/package/webpack) + - [`webpack-cli`](https://www.npmjs.com/package/webpack-cli) + - [`webpack-dev-server`](https://www.npmjs.com/package/webpack-dev-server) + - defines a `start` script to run `webpack-dev-server` +- `webpack.config.js`: configuration file for bundling your js with webpack + +## License + +Licensed under either of + +* Apache License, Version 2.0, ([LICENSE-APACHE](LICENSE-APACHE) or http://www.apache.org/licenses/LICENSE-2.0) +* MIT license ([LICENSE-MIT](LICENSE-MIT) or http://opensource.org/licenses/MIT) + +at your option. + +### Contribution + +Unless you explicitly state otherwise, any contribution intentionally +submitted for inclusion in the work by you, as defined in the Apache-2.0 +license, shall be dual licensed as above, without any additional terms or +conditions. diff --git a/wasm_test_site/www/index.html b/wasm_test_site/www/index.html new file mode 100644 index 000000000000..adf9ab2f9ac1 --- /dev/null +++ b/wasm_test_site/www/index.html @@ -0,0 +1,10 @@ + + + + + Hello wasm-pack! + + + + + diff --git a/wasm_test_site/www/index.ts b/wasm_test_site/www/index.ts new file mode 100644 index 000000000000..31168be73a8a --- /dev/null +++ b/wasm_test_site/www/index.ts @@ -0,0 +1,4 @@ +import init, { greet, test_hydroflow } from "wasm_test_site"; +let { memory } = await init(); +greet(); +test_hydroflow(); diff --git a/wasm_test_site/www/package-lock.json b/wasm_test_site/www/package-lock.json new file mode 100644 index 000000000000..a6fa21bb31f0 --- /dev/null +++ b/wasm_test_site/www/package-lock.json @@ -0,0 +1,1093 @@ +{ + "name": "create-wasm-app", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "create-wasm-app", + "version": "0.1.0", + "license": "(MIT OR Apache-2.0)", + "dependencies": { + "wasm_test_site": "file:../pkg" + }, + "devDependencies": { + "typescript": "^4.9.5", + "vite": "^4.1.4", + "vite-plugin-html": "^3.2.0", + "vite-plugin-wasm-pack": "^0.1.12" + } + }, + "../pkg": { + "name": "wasm_test_site", + "version": "0.1.0" + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.16.17", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.17", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@rollup/pluginutils": { + "version": "4.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "estree-walker": "^2.0.1", + "picomatch": "^2.2.2" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/@types/node": { + "version": "18.14.6", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "node_modules/acorn": { + "version": "8.8.2", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/async": { + "version": "3.2.4", + "dev": true, + "license": "MIT" + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/boolbase": { + "version": "1.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/camel-case": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/clean-css": { + "version": "5.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "source-map": "~0.6.0" + }, + "engines": { + "node": ">= 10.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/colorette": { + "version": "2.0.19", + "dev": true, + "license": "MIT" + }, + "node_modules/commander": { + "version": "8.3.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/connect-history-api-fallback": { + "version": "1.6.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/consola": { + "version": "2.15.3", + "dev": true, + "license": "MIT" + }, + "node_modules/css-select": { + "version": "4.3.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-what": { + "version": "6.1.0", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/dom-serializer": { + "version": "1.4.1", + "dev": true, + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, + "node_modules/domhandler": { + "version": "4.3.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "2.8.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dot-case": { + "version": "3.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/dotenv": { + "version": "16.0.3", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/dotenv-expand": { + "version": "8.0.3", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/ejs": { + "version": "3.1.8", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/entities": { + "version": "2.2.0", + "dev": true, + "license": "BSD-2-Clause", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/esbuild": { + "version": "0.16.17", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "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/estree-walker": { + "version": "2.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.2.12", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fastq": { + "version": "1.15.0", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/filelist": { + "version": "1.0.4", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "minimatch": "^5.0.1" + } + }, + "node_modules/filelist/node_modules/brace-expansion": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.6", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fs-extra": { + "version": "10.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "dev": true, + "license": "MIT" + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.10", + "dev": true, + "license": "ISC" + }, + "node_modules/has": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/he": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, + "node_modules/html-minifier-terser": { + "version": "6.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "camel-case": "^4.1.2", + "clean-css": "^5.2.2", + "commander": "^8.3.0", + "he": "^1.2.0", + "param-case": "^3.0.4", + "relateurl": "^0.2.7", + "terser": "^5.10.0" + }, + "bin": { + "html-minifier-terser": "cli.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/is-core-module": { + "version": "2.11.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/jake": { + "version": "10.8.5", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.1", + "minimatch": "^3.0.4" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/lower-case": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/nanoid": { + "version": "3.3.4", + "dev": true, + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/narrowing": { + "version": "1.5.0", + "dev": true, + "license": "MIT" + }, + "node_modules/no-case": { + "version": "3.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "node_modules/node-html-parser": { + "version": "5.4.2", + "dev": true, + "license": "MIT", + "dependencies": { + "css-select": "^4.2.1", + "he": "1.2.0" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/param-case": { + "version": "3.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/pascal-case": { + "version": "3.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "dev": true, + "license": "MIT" + }, + "node_modules/pathe": { + "version": "0.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.4.21", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.4", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/relateurl": { + "version": "0.2.7", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/resolve": { + "version": "1.22.1", + "dev": true, + "license": "MIT", + "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/reusify": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rollup": { + "version": "3.18.0", + "dev": true, + "license": "MIT", + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=14.18.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/terser": { + "version": "5.16.6", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@jridgewell/source-map": "^0.3.2", + "acorn": "^8.5.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "dev": true, + "license": "MIT" + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tslib": { + "version": "2.5.0", + "dev": true, + "license": "0BSD" + }, + "node_modules/typescript": { + "version": "4.9.5", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/universalify": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/vite": { + "version": "4.1.4", + "dev": true, + "license": "MIT", + "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/vite-plugin-html": { + "version": "3.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^4.2.0", + "colorette": "^2.0.16", + "connect-history-api-fallback": "^1.6.0", + "consola": "^2.15.3", + "dotenv": "^16.0.0", + "dotenv-expand": "^8.0.2", + "ejs": "^3.1.6", + "fast-glob": "^3.2.11", + "fs-extra": "^10.0.1", + "html-minifier-terser": "^6.1.0", + "node-html-parser": "^5.3.3", + "pathe": "^0.2.0" + }, + "peerDependencies": { + "vite": ">=2.0.0" + } + }, + "node_modules/vite-plugin-wasm-pack": { + "version": "0.1.12", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.2", + "fs-extra": "^10.0.0", + "narrowing": "^1.4.0" + } + }, + "node_modules/wasm_test_site": { + "resolved": "../pkg", + "link": true + } + } +} diff --git a/wasm_test_site/www/package.json b/wasm_test_site/www/package.json new file mode 100644 index 000000000000..0b2a75af9d98 --- /dev/null +++ b/wasm_test_site/www/package.json @@ -0,0 +1,30 @@ +{ + "name": "create-wasm-app", + "version": "0.1.0", + "description": "create an app to consume rust-generated wasm packages", + "main": "index.js", + "type": "module", + "scripts": { + "build": "vite build", + "dev": "vite serve", + "preview": "vite preview", + "wasm": "wasm-pack build ../ --target web" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/rustwasm/create-wasm-app.git" + }, + "keywords": [ + "webassembly", + "wasm", + "rust", + "webpack" + ], + "license": "(MIT OR Apache-2.0)", + "devDependencies": { + "typescript": "^4.9.5", + "vite": "^4.1.4", + "vite-plugin-html": "^3.2.0", + "vite-plugin-wasm-pack": "^0.1.12" + } +} diff --git a/wasm_test_site/www/tsconfig.json b/wasm_test_site/www/tsconfig.json new file mode 100644 index 000000000000..a0b6b0c55bb5 --- /dev/null +++ b/wasm_test_site/www/tsconfig.json @@ -0,0 +1,12 @@ +{ + "compilerOptions": { + "outDir": "./dist/", + "noImplicitAny": true, + "module": "esnext", + "target": "es2017", + "jsx": "react", + "allowJs": true, + "moduleResolution": "node", + "esModuleInterop": true + } +} diff --git a/wasm_test_site/www/vite.config.ts b/wasm_test_site/www/vite.config.ts new file mode 100644 index 000000000000..76b29b842a20 --- /dev/null +++ b/wasm_test_site/www/vite.config.ts @@ -0,0 +1,8 @@ +import { defineConfig } from "vite"; +import wasmPack from "vite-plugin-wasm-pack"; +import path from "node:path"; + +export default defineConfig({ + // pass your local crate path to the plugin + plugins: [wasmPack(path.resolve("../"))], +}); From 871263528d33a39b18c89e3baa63513fad600931 Mon Sep 17 00:00:00 2001 From: Mingwei Samuel Date: Thu, 5 Sep 2024 10:29:09 -0700 Subject: [PATCH 2/2] call global javascript function from rust (ugly) --- wasm_test_site/src/lib.rs | 8 +++++++- wasm_test_site/www/index.ts | 6 ++++++ wasm_test_site/www/package-lock.json | 10 ++-------- wasm_test_site/www/package.json | 2 +- 4 files changed, 16 insertions(+), 10 deletions(-) diff --git a/wasm_test_site/src/lib.rs b/wasm_test_site/src/lib.rs index 4ccae8151197..2384e595a19e 100644 --- a/wasm_test_site/src/lib.rs +++ b/wasm_test_site/src/lib.rs @@ -4,6 +4,12 @@ fn log(string: impl AsRef) { web_sys::console::log_1(&JsValue::from_str(string.as_ref())); } +#[wasm_bindgen] +extern "C" { + #[wasm_bindgen(js_namespace = window)] + fn writeToDom(s: &str); +} + #[wasm_bindgen] pub fn greet() { console_error_panic_hook::set_once(); @@ -17,7 +23,7 @@ pub fn test_hydroflow() -> web_sys::js_sys::Promise { let mut df = hydroflow::hydroflow_syntax! { // https://hydro.run/docs/hydroflow/quickstart/example_1_simplest - source_iter(0..10) -> for_each(|n| log(format!("Hello {}", n))); + source_iter(0..10) -> for_each(|n| writeToDom(&format!("Hello {}", n))); }; wasm_bindgen_futures::future_to_promise(async move { diff --git a/wasm_test_site/www/index.ts b/wasm_test_site/www/index.ts index 31168be73a8a..fcc5ed436434 100644 --- a/wasm_test_site/www/index.ts +++ b/wasm_test_site/www/index.ts @@ -1,4 +1,10 @@ import init, { greet, test_hydroflow } from "wasm_test_site"; let { memory } = await init(); + +(window as any).writeToDom = function(str: string) { + document.body.appendChild(document.createTextNode(str)); + document.body.append(document.createElement('br')); +}; + greet(); test_hydroflow(); diff --git a/wasm_test_site/www/package-lock.json b/wasm_test_site/www/package-lock.json index a6fa21bb31f0..4d37c875cc22 100644 --- a/wasm_test_site/www/package-lock.json +++ b/wasm_test_site/www/package-lock.json @@ -8,9 +8,6 @@ "name": "create-wasm-app", "version": "0.1.0", "license": "(MIT OR Apache-2.0)", - "dependencies": { - "wasm_test_site": "file:../pkg" - }, "devDependencies": { "typescript": "^4.9.5", "vite": "^4.1.4", @@ -20,7 +17,8 @@ }, "../pkg": { "name": "wasm_test_site", - "version": "0.1.0" + "version": "0.1.0", + "extraneous": true }, "node_modules/@esbuild/win32-x64": { "version": "0.16.17", @@ -1084,10 +1082,6 @@ "fs-extra": "^10.0.0", "narrowing": "^1.4.0" } - }, - "node_modules/wasm_test_site": { - "resolved": "../pkg", - "link": true } } } diff --git a/wasm_test_site/www/package.json b/wasm_test_site/www/package.json index 0b2a75af9d98..51c26c38cab0 100644 --- a/wasm_test_site/www/package.json +++ b/wasm_test_site/www/package.json @@ -27,4 +27,4 @@ "vite-plugin-html": "^3.2.0", "vite-plugin-wasm-pack": "^0.1.12" } -} +} \ No newline at end of file