Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
436 changes: 76 additions & 360 deletions Cargo.lock

Large diffs are not rendered by default.

39 changes: 20 additions & 19 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,18 @@ edition.workspace = true
publish = false

[[bin]]
name = "jco"
path = "bin/main.rs"
name = "self-build"
path = "bin/self_build.rs"

[build-dependencies]
[dependencies]
anyhow = { workspace = true }
js-component-bindgen = { path = "./crates/js-component-bindgen" }
wit-component = { workspace = true }

[build-dependencies]
anyhow = "1.0.71"
js-component-bindgen = { path = "./crates/js-component-bindgen" }
wit-component = { workspace = true }

[workspace]
members = ["crates/js-component-bindgen", "crates/js-component-bindgen-component", "crates/wasm-tools-component"]
Expand All @@ -22,21 +27,17 @@ edition = "2021"
version = "0.1.0"

[workspace.dependencies]
anyhow = "1.0.69"
base64 = "0.21.0"
bitflags = "1.3.2"
clap = { version = "4.1.8", features = ["derive"] }
env_logger = "0.10.0"
anyhow = "1.0.71"
base64 = "0.21.2"
heck = { version = "0.4", features = ["unicode"] }
indexmap = "1.9"
pulldown-cmark = { version = "0.8", default-features = false }
wasm-encoder = "0.27.0"
wasm-metadata = "0.6.0"
wasmparser = "0.105.0"
wasmprinter = "0.2.57"
wasmtime = { version = "8.0.1", features = ["component-model"] }
wasmtime-environ = "8.0.1"
wat = "1.0.64"
wit-bindgen = { git = "https://github.com/bytecodealliance/wit-bindgen", rev = "c1eb6ba2ffe303574219a3787aa1187d70d877ec" }
wit-component = { version = "0.9.0", features = ['dummy-module'] }
wit-parser = "0.7.1"
wasm-encoder = "0.29.0"
wasm-metadata = "0.8.0"
wasmparser = "0.107.0"
wasmprinter = "0.2.59"
wasmtime = { git = "https://github.com/bytecodealliance/wasmtime", features = ["component-model"], rev = "f7ae056a0a757492c0842ca3f2852f9a5f4bd19c" }
wasmtime-environ = { git = "https://github.com/bytecodealliance/wasmtime", rev = "f7ae056a0a757492c0842ca3f2852f9a5f4bd19c" }
wat = "1.0.66"
wit-bindgen = { git = "https://github.com/bytecodealliance/wit-bindgen", rev = "e69cf5db8754f829637e25491c560ec0d9728852" }
wit-component = { version = "0.11.0", features = ['dummy-module'] }
wit-parser = "0.8.0"
3 changes: 0 additions & 3 deletions bin/main.rs

This file was deleted.

60 changes: 60 additions & 0 deletions bin/self_build.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
use std::{collections::HashMap, fs, io::Write, path::PathBuf};

use js_component_bindgen;
use wit_component::ComponentEncoder;

use anyhow::Result;

fn main() -> Result<()> {
fn transpile(component_path: &str, name: String) -> Result<()> {
let component = fs::read(&component_path).expect("wasm bindgen component missing");

let adapter_path = "lib/wasi_snapshot_preview1.reactor.wasm";
let adapter = fs::read(&adapter_path).expect("preview1 adapter file missing");

let mut encoder = ComponentEncoder::default()
.validate(true)
.module(&component)?;

encoder = encoder.adapter("wasi_snapshot_preview1", &adapter)?;

let adapted_component = encoder.encode()?;

let import_map = HashMap::from([(
"wasi:*".to_string(),
"@bytecodealliance/preview2-shim/*".to_string(),
)]);
let opts = js_component_bindgen::TranspileOpts {
name,
no_typescript: false,
instantiation: false,
map: Some(import_map),
no_nodejs_compat: false,
base64_cutoff: 5000_usize,
tla_compat: false,
valid_lifting_optimization: false,
};

let transpiled = js_component_bindgen::transpile(adapted_component, opts)?;

for (filename, contents) in transpiled.files.iter() {
let outfile = PathBuf::from("./obj").join(filename);
fs::create_dir_all(outfile.parent().unwrap()).unwrap();
let mut file = fs::File::create(outfile).unwrap();
file.write_all(contents).unwrap();
}

Ok(())
}

transpile(
"target/wasm32-wasi/release/js_component_bindgen_component.wasm",
"js-component-bindgen-component".to_string(),
)?;
transpile(
"target/wasm32-wasi/release/wasm_tools_js.wasm",
"wasm-tools".to_string(),
)?;

Ok(())
}
50 changes: 26 additions & 24 deletions build.rs
Original file line number Diff line number Diff line change
@@ -1,39 +1,41 @@
use std::{collections::HashMap, env, fs, io::Write, path::PathBuf};
use anyhow::Result;
use std::{env, fs, io::Write, path::PathBuf};

fn main() {
use js_component_bindgen::{generate_types, source::wit_parser::Resolve};

fn main() -> Result<()> {
if env::var("PREVIEW2_SHIM_TYPES").is_ok() {
let current_dir = std::env::current_dir().unwrap();
let fixtures_dir = current_dir.join("./test/fixtures/components");
for world in ["reactor", "proxy"] {
let component_path = fixtures_dir.join(format!("dummy_{}.component.wasm", world));
let component = fs::read(&component_path).expect("component to be read from file");
for world in ["proxy", "command", "reactor"] {
let name = format!("wasi-{}", world);
let preview2_wit_path = "./test/fixtures/wit/wasi";

let mut resolve = Resolve::default();
let (id, _) = resolve.push_dir(&PathBuf::from(preview2_wit_path))?;

let world = resolve.select_world(id, Some(world))?;

let import_map = HashMap::from([]);
let opts = js_component_bindgen::TranspileOpts {
name: format!("wasi-{}", world),
name: "component".to_string(),
no_typescript: false,
instantiation: true,
map: Some(import_map),
no_nodejs_compat: true,
base64_cutoff: 5000_usize,
no_nodejs_compat: false,
instantiation: false,
map: None,
tla_compat: false,
valid_lifting_optimization: false,
base64_cutoff: 0,
};

let transpiled = js_component_bindgen::transpile(component, opts)
.map_err(|e| format!("{:?}", e))
.unwrap();
let files = generate_types(name, resolve, world, opts)?;

for (filename, contents) in transpiled.files.iter() {
if filename.ends_with(".d.ts") {
let outfile = PathBuf::from("./packages/preview2-shim/types").join(filename);
fs::create_dir_all(outfile.parent().unwrap()).unwrap();
let mut file = fs::File::create(outfile).unwrap();
file.write_all(contents).unwrap();
}
for (filename, contents) in files.iter() {
let outfile = PathBuf::from("./packages/preview2-shim/types").join(filename);
fs::create_dir_all(outfile.parent().unwrap()).unwrap();
let mut file = fs::File::create(outfile).unwrap();
file.write_all(contents).unwrap();
}
println!("cargo:rerun-if-changed={:?}", component_path);
println!("cargo:rerun-if-changed={:?}", preview2_wit_path);
}
}
println!("cargo:rerun-if-changed=build.rs");
Ok(())
}
8 changes: 1 addition & 7 deletions crates/js-component-bindgen-component/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -11,12 +11,6 @@ crate-type = ["cdylib"]

[dependencies]
anyhow = { workspace = true }
heck = { workspace = true }
clap = { workspace = true, optional = true }
js-component-bindgen = { path = "../js-component-bindgen" }
wasmtime-environ = { workspace = true, features = ['component-model'] }
wasmtime-environ = { workspace = true }
wit-bindgen = { workspace = true }
wit-component = { workspace = true }
wit-parser = { workspace = true }
indexmap = { workspace = true }
base64 = { workspace = true }
71 changes: 53 additions & 18 deletions crates/js-component-bindgen-component/src/lib.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,11 @@
use std::path::PathBuf;

use anyhow::Result;
use js_component_bindgen::transpile;
use js_component_bindgen::{
generate_types,
source::wit_parser::{Resolve, UnresolvedPackage},
transpile,
};

/// Calls [`write!`] with the passed arguments and unwraps the result.
///
Expand Down Expand Up @@ -29,27 +35,12 @@ macro_rules! uwriteln {

wit_bindgen::generate!("js-component-bindgen");

use crate::exports::*;

struct JsComponentBindgenComponent;

export_js_component_bindgen_component!(JsComponentBindgenComponent);

// fn init() {
// static INIT: Once = Once::new();
// INIT.call_once(|| {
// let prev_hook = std::panic::take_hook();
// std::panic::set_hook(Box::new(move |info| {
// console::error(&info.to_string());
// prev_hook(info);
// }));
// });
// }
export_js_component_bindgen!(JsComponentBindgenComponent);

impl exports::Exports for JsComponentBindgenComponent {
impl JsComponentBindgen for JsComponentBindgenComponent {
fn generate(component: Vec<u8>, options: GenerateOptions) -> Result<Transpiled, String> {
// init();

let opts = js_component_bindgen::TranspileOpts {
name: options.name,
no_typescript: options.no_typescript.unwrap_or(false),
Expand Down Expand Up @@ -96,4 +87,48 @@ impl exports::Exports for JsComponentBindgenComponent {
.collect(),
})
}

fn generate_types(
name: String,
opts: TypeGenerationOptions,
) -> Result<Vec<(String, Vec<u8>)>, String> {
let mut resolve = Resolve::default();
let pkg = match opts.wit {
Wit::Source(source) => {
UnresolvedPackage::parse(&PathBuf::from(format!("{name}.wit")), &source)
.map_err(|e| e.to_string())?
}
Wit::Path(path) => {
UnresolvedPackage::parse_file(&PathBuf::from(path)).map_err(|e| e.to_string())?
}
Wit::Binary(_) => todo!(),
};
let id = resolve.push(pkg).map_err(|e| e.to_string())?;

let world_string = match &opts.world {
Some(world) => Some(world.to_string()),
None => None,
};
let world = resolve
.select_world(id, world_string.as_deref())
.map_err(|e| e.to_string())?;

let opts = js_component_bindgen::TranspileOpts {
name: "component".to_string(),
no_typescript: false,
no_nodejs_compat: false,
instantiation: opts.instantiation.unwrap_or(false),
map: match opts.map {
Some(map) => Some(map.into_iter().collect()),
None => None,
},
tla_compat: opts.tla_compat.unwrap_or(false),
valid_lifting_optimization: false,
base64_cutoff: 0,
};

let files = generate_types(name, resolve, world, opts).map_err(|e| e.to_string())?;

Ok(files)
}
}
Loading