diff --git a/.gitignore b/.gitignore index 1ade5b683..12933c0f3 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,2 @@ -/target +target/ *.spv \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json index 49684b9cc..3726a7660 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,12 +1,15 @@ -{ - "[rust]": { - "editor.formatOnSave": true, - "editor.formatOnPaste": true - }, - "rust-analyzer.rustfmt.extraArgs": [ - "--config", // Remove when rustfmt 2.0 - "match_block_trailing_comma=true", // is released - "--config", // Remove when control_brace_style - "control_brace_style=ClosingNextLine" // becomes stable - ] +{ + "[rust]": { + "editor.formatOnSave": true, + "editor.formatOnPaste": true + }, + "rust-analyzer.rustfmt.extraArgs": [ + "--config", // Remove when rustfmt 2.0 + "match_block_trailing_comma=true", // is released + "--config", // Remove when control_brace_style + "control_brace_style=ClosingNextLine" // becomes stable https://github.com/rust-lang/rustfmt/issues/3377 + ], + "rust-analyzer.diagnostics.disabled": [ // Remove when rust-analyzer bug fixes + "missing-unsafe" // unsafe code on WASM JavaScript + ] // https://github.com/rust-analyzer/rust-analyzer/issues/5412 } \ No newline at end of file diff --git a/Cargo.lock b/Cargo.lock index c7c6de087..fea85a4ff 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,13 +1,258 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. +[[package]] +name = "bumpalo" +version = "3.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "099e596ef14349721d9016f6b80dd3419ea1bf289ab9b44df8e4dfd3a005d5d9" + +[[package]] +name = "cfg-if" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + [[package]] name = "cli" version = "0.1.0" +[[package]] +name = "console_error_panic_hook" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8d976903543e0c48546a91908f21588a680a8c8f984df9a5d69feccb2b2a211" +dependencies = [ + "cfg-if 0.1.10", + "wasm-bindgen", +] + +[[package]] +name = "js-sys" +version = "0.3.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cfb73131c35423a367daf8cbd24100af0d077668c8c2943f0e7dd775fef0f65" +dependencies = [ + "wasm-bindgen", +] + +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" + +[[package]] +name = "libc" +version = "0.2.86" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7282d924be3275cec7f6756ff4121987bc6481325397dde6ba3e7802b1a8b1c" + +[[package]] +name = "log" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51b9bbe6c47d51fc3e1a9b945965946b4c44142ab8792c50835a980d362c2710" +dependencies = [ + "cfg-if 1.0.0", +] + +[[package]] +name = "memory_units" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8452105ba047068f40ff7093dd1d9da90898e63dd61736462e9cdda6a90ad3c3" + +[[package]] +name = "proc-macro2" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e0704ee1a7e00d7bb417d0770ea303c1bccbabf0ef1667dae92b5967f5f8a71" +dependencies = [ + "unicode-xid", +] + +[[package]] +name = "quote" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3d0b9745dc2debf507c8422de05d7226cc1f0644216dfdfead988f9b1ab32a7" +dependencies = [ + "proc-macro2", +] + [[package]] name = "render-engine" version = "0.1.0" +[[package]] +name = "scoped-tls" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea6a9290e3c9cf0f18145ef7ffa62d68ee0bf5fcd651017e586dc7fd5da448c2" + +[[package]] +name = "syn" +version = "1.0.60" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c700597eca8a5a762beb35753ef6b94df201c81cca676604f547495a0d7f0081" +dependencies = [ + "proc-macro2", + "quote", + "unicode-xid", +] + +[[package]] +name = "unicode-xid" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7fe0bb3479651439c9112f72b6c505038574c9fbb575ed1bf3b797fa39dd564" + +[[package]] +name = "wasm-bindgen" +version = "0.2.70" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55c0f7123de74f0dab9b7d00fd614e7b19349cd1e2f5252bbe9b1754b59433be" +dependencies = [ + "cfg-if 1.0.0", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.70" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7bc45447f0d4573f3d65720f636bbcc3dd6ce920ed704670118650bcd47764c7" +dependencies = [ + "bumpalo", + "lazy_static", + "log", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3de431a2910c86679c34283a33f66f4e4abd7e0aec27b6669060148872aadf94" +dependencies = [ + "cfg-if 1.0.0", + "js-sys", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.70" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b8853882eef39593ad4174dd26fc9865a64e84026d223f63bb2c42affcbba2c" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.70" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4133b5e7f2a531fa413b3a1695e925038a05a71cf67e87dafa295cb645a01385" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.70" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd4945e4943ae02d15c13962b38a5b1e81eadd4b71214eee75af64a4d6a4fd64" + +[[package]] +name = "wasm-bindgen-test" +version = "0.3.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0d4da138503a4cf86801b94d95781ee3619faa8feca830569cc6b54997b8b5c" +dependencies = [ + "console_error_panic_hook", + "js-sys", + "scoped-tls", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm-bindgen-test-macro", +] + +[[package]] +name = "wasm-bindgen-test-macro" +version = "0.3.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3199c33f06500c731d5544664c24d0c2b742b98debc6b1c6f0c6d6e8fb7c19b" +dependencies = [ + "proc-macro2", + "quote", +] + [[package]] name = "wasm-bindings" version = "0.1.0" +dependencies = [ + "console_error_panic_hook", + "wasm-bindgen", + "wasm-bindgen-test", + "wee_alloc", +] + +[[package]] +name = "web-sys" +version = "0.3.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c40dc691fc48003eba817c38da7113c15698142da971298003cac3ef175680b3" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "wee_alloc" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbb3b5a6b2bb17cb6ad44a2e68a43e8d2722c997da10e928665c72ec6c0a0b8e" +dependencies = [ + "cfg-if 0.1.10", + "libc", + "memory_units", + "winapi", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" diff --git a/packages/cli/Cargo.toml b/packages/cli/Cargo.toml index df4a0a7c8..a1ab91f7b 100644 --- a/packages/cli/Cargo.toml +++ b/packages/cli/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "cli" version = "0.1.0" -authors = ["Keavon Chambers "] +authors = ["Keavon Chambers "] edition = "2018" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/packages/render-engine/Cargo.toml b/packages/render-engine/Cargo.toml index 8e00789bc..f0818cee0 100644 --- a/packages/render-engine/Cargo.toml +++ b/packages/render-engine/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "render-engine" version = "0.1.0" -authors = ["Keavon Chambers "] +authors = ["Keavon Chambers "] edition = "2018" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/packages/wasm-bindings/.gitignore b/packages/wasm-bindings/.gitignore new file mode 100644 index 000000000..b2bcbe85e --- /dev/null +++ b/packages/wasm-bindings/.gitignore @@ -0,0 +1 @@ +pkg/ \ No newline at end of file diff --git a/packages/wasm-bindings/Cargo.toml b/packages/wasm-bindings/Cargo.toml index cebac436b..c0a1784d1 100644 --- a/packages/wasm-bindings/Cargo.toml +++ b/packages/wasm-bindings/Cargo.toml @@ -1,9 +1,36 @@ [package] name = "wasm-bindings" version = "0.1.0" -authors = ["Keavon Chambers "] +authors = ["Keavon Chambers "] edition = "2018" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html +[lib] +crate-type = ["cdylib", "rlib"] + +[features] +default = ["console_error_panic_hook"] + [dependencies] +wasm-bindgen = "0.2.7" + +# 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 = { version = "0.1.6", optional = true } + +# `wee_alloc` is a tiny allocator for wasm that is only ~1K in code size +# compared to the default allocator's ~10K. It is slower than the default +# allocator, however. +# +# Unfortunately, `wee_alloc` requires nightly Rust when targeting wasm for now. +wee_alloc = { version = "0.4.5", optional = true } + +[dev-dependencies] +wasm-bindgen-test = "0.3.13" + +[profile.release] +# Tell `rustc` to optimize for small code size. +opt-level = "s" \ No newline at end of file diff --git a/packages/wasm-bindings/src/lib.rs b/packages/wasm-bindings/src/lib.rs index 909562f6d..1c1570223 100644 --- a/packages/wasm-bindings/src/lib.rs +++ b/packages/wasm-bindings/src/lib.rs @@ -1,7 +1,18 @@ -#[cfg(test)] -mod tests { - #[test] - fn it_works() { - assert_eq!(2 + 2, 4); - } +mod utils; + +use wasm_bindgen::prelude::*; + +// When the `wee_alloc` feature is enabled, use `wee_alloc` as the global allocator. +#[cfg(feature = "wee_alloc")] +#[global_allocator] +static ALLOC: wee_alloc::WeeAlloc = wee_alloc::WeeAlloc::INIT; + +#[wasm_bindgen] +extern "C" { + fn alert(s: &str); +} + +#[wasm_bindgen] +pub fn greet() { + alert("Hello, Graphite!"); } diff --git a/packages/wasm-bindings/src/utils.rs b/packages/wasm-bindings/src/utils.rs new file mode 100644 index 000000000..6c8519d18 --- /dev/null +++ b/packages/wasm-bindings/src/utils.rs @@ -0,0 +1,10 @@ +pub fn set_panic_hook() { + // When the `console_error_panic_hook` feature is enabled, we can call the + // `set_panic_hook` function at least once during initialization, and then + // we will get better error messages if our code ever panics. + // + // For more details see + // https://github.com/rustwasm/console_error_panic_hook#readme + #[cfg(feature = "console_error_panic_hook")] + console_error_panic_hook::set_once(); +} diff --git a/web-frontend/.gitignore b/web-frontend/.gitignore new file mode 100644 index 000000000..a5b4be128 --- /dev/null +++ b/web-frontend/.gitignore @@ -0,0 +1,3 @@ +node_modules/ +dist/ +pkg/ \ No newline at end of file diff --git a/web-frontend/main.js b/web-frontend/main.js new file mode 100644 index 000000000..61c9347f7 --- /dev/null +++ b/web-frontend/main.js @@ -0,0 +1,5 @@ +const wasm = import("./pkg"); + +wasm + .then(wasm => wasm.greet()) + .catch(console.error); \ No newline at end of file diff --git a/web-frontend/package.json b/web-frontend/package.json new file mode 100644 index 000000000..a46b62e06 --- /dev/null +++ b/web-frontend/package.json @@ -0,0 +1,24 @@ +{ + "name": "graphite-web-frontend", + "version": "0.1.0", + "description": "Graphite's web app frontend pathfinder. Planned to be replaced by a Rust native GUI framework in the future.", + "main": "main.js", + "scripts": { + "build": "webpack", + "start": "webpack serve" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/keavon/graphite.git" + }, + "author": "Keavon Chambers ", + "license": "Apache-2.0", + "homepage": "https://www.graphite.design", + "devDependencies": { + "@wasm-tool/wasm-pack-plugin": "^1.3.3", + "html-webpack-plugin": "^5.1.0", + "webpack": "^5.21.2", + "webpack-cli": "^4.5.0", + "webpack-dev-server": "^3.11.2" + } +} diff --git a/web-frontend/webpack.config.js b/web-frontend/webpack.config.js new file mode 100644 index 000000000..f543d4f14 --- /dev/null +++ b/web-frontend/webpack.config.js @@ -0,0 +1,23 @@ +const path = require('path'); +const HtmlWebpackPlugin = require("html-webpack-plugin"); +const WasmPackPlugin = require("@wasm-tool/wasm-pack-plugin"); + +module.exports = { + entry: "./main.js", + output: { + path: path.resolve(__dirname, "dist"), + filename: "main.js", + }, + plugins: [ + new HtmlWebpackPlugin({ title: 'Graphite' }), + new WasmPackPlugin({ + crateDirectory: path.resolve(__dirname, "..", "packages", "wasm-bindings"), + outDir: path.resolve(__dirname, "pkg"), + }), + ], + mode: "development", + devtool: 'source-map', + experiments: { + syncWebAssembly: true, + }, +};