Skip to content

Commit

Permalink
Merge pull request #1503 from alexcrichton/fix-web-imports
Browse files Browse the repository at this point in the history
Fix direct imports in `--target web`
  • Loading branch information
alexcrichton authored May 1, 2019
2 parents 8174973 + 22eb34d commit a13eb10
Show file tree
Hide file tree
Showing 4 changed files with 47 additions and 2 deletions.
33 changes: 31 additions & 2 deletions crates/cli-support/src/js/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ use crate::{
};
use failure::{bail, Error, ResultExt};
use std::{
collections::{BTreeMap, HashMap, HashSet},
collections::{BTreeMap, HashMap, HashSet, BTreeSet},
env, fs,
};
use walrus::{MemoryId, Module};
Expand Down Expand Up @@ -918,13 +918,41 @@ impl<'a> Context<'a> {
} else {
""
};

let ts = Self::ts_for_init_fn(mem.import.is_some());

// Generate extra initialization for the `imports` object if necessary
// based on the values in `direct_imports` we find. These functions are
// intended to be imported directly to the wasm module and we need to
// ensure that the modules are actually imported from and inserted into
// the object correctly.
let mut map = BTreeMap::new();
for &(module, name) in self.direct_imports.values() {
map.entry(module).or_insert(BTreeSet::new()).insert(name);
}
let mut imports_init = String::new();
for (module, names) in map {
imports_init.push_str("imports['");
imports_init.push_str(module);
imports_init.push_str("'] = { ");
for (i, name) in names.into_iter().enumerate() {
if i != 0 {
imports_init.push_str(", ");
}
let import = Import::Module { module, name, field: None };
let identifier = self.import_identifier(import);
imports_init.push_str(name);
imports_init.push_str(": ");
imports_init.push_str(&identifier);
}
imports_init.push_str(" };\n");
}

let js = format!(
"\
function init(module{init_memory_arg}) {{
let result;
const imports = {{ './{module}': __exports }};
{imports_init}
if (module instanceof URL || typeof module === 'string' || module instanceof Request) {{
{init_memory2}
const response = fetch(module);
Expand Down Expand Up @@ -973,6 +1001,7 @@ impl<'a> Context<'a> {
} else {
""
},
imports_init = imports_init,
);

(js, ts)
Expand Down
1 change: 1 addition & 0 deletions tests/headless/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -39,3 +39,4 @@ fn can_log_html_strings() {
}

pub mod snippets;
pub mod modules;
3 changes: 3 additions & 0 deletions tests/headless/modules.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
export function get_five() {
return 5;
}
12 changes: 12 additions & 0 deletions tests/headless/modules.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
use wasm_bindgen::prelude::*;
use wasm_bindgen_test::*;

#[wasm_bindgen(raw_module = "./tests/headless/modules.js")]
extern "C" {
fn get_five() -> u32;
}

#[wasm_bindgen_test]
fn test_get_five() {
assert_eq!(get_five(), 5);
}

0 comments on commit a13eb10

Please sign in to comment.