0
0
Fork 0
mirror of https://github.com/denoland/deno.git synced 2025-02-01 20:25:12 -05:00

Support dynamic import in bundles. (#4561)

This commit is contained in:
Kitson Kelly 2020-04-02 14:14:30 +11:00 committed by GitHub
parent 2ff8012dcc
commit 2e24385c48
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 69 additions and 1 deletions

View file

@ -490,6 +490,38 @@ fn bundle_js() {
assert_eq!(output.stderr, b""); assert_eq!(output.stderr, b"");
} }
#[test]
fn bundle_dynamic_import() {
let dynamic_import =
util::root_path().join("cli/tests/subdir/subdir2/dynamic_import.ts");
assert!(dynamic_import.is_file());
let t = TempDir::new().expect("tempdir fail");
let bundle = t.path().join("dynamic_import.bundle.js");
let mut deno = util::deno_cmd()
.current_dir(util::root_path())
.arg("bundle")
.arg(dynamic_import)
.arg(&bundle)
.spawn()
.expect("failed to spawn script");
let status = deno.wait().expect("failed to wait for the child process");
assert!(status.success());
assert!(bundle.is_file());
let output = util::deno_cmd()
.current_dir(util::root_path())
.arg("run")
.arg(&bundle)
.output()
.expect("failed to spawn script");
// check the output of the test.ts program.
assert!(std::str::from_utf8(&output.stdout)
.unwrap()
.trim()
.ends_with("Hello"));
assert_eq!(output.stderr, b"");
}
#[test] #[test]
fn repl_test_console_log() { fn repl_test_console_log() {
let (out, err) = util::run_and_collect_output( let (out, err) = util::run_and_collect_output(

View file

@ -0,0 +1,6 @@
(async (): Promise<void> => {
const { printHello } = await import("../mod2.ts");
printHello();
})();
export {};

View file

@ -34,6 +34,17 @@ module specifier, a reference to the dynamic `import()` and the equivalent of
and its value, or an object record of keys of the named exports and the values and its value, or an object record of keys of the named exports and the values
of the exports. of the exports.
Currently, TypeScript does not re-write dynamic imports which resolve to static
strings (see
[microsoft/TypeScript#37429](https://github.com/microsoft/TypeScript/issues/37429)),
which means the import specifier for a dynamic import which has been
incorporated in the bundle does not automatically match a module specifier that
has been registered in the bundle. The `di()` function provides the capability
to try to identify relative import specifiers and resolve them to a specifier
inside the bundle. If it does this, it resolves with the exports of the module,
otherwise it simply passes the module specifier to `import()` and returns the
resulting promise.
The running of the factories is handled by `rF()`. When the factory is run, it The running of the factories is handled by `rF()`. When the factory is run, it
returns an object with two keys, `execute` and `setters`. `execute` is a returns an object with two keys, `execute` and `setters`. `execute` is a
function which finalises that instantiation of the module, and `setters` which function which finalises that instantiation of the module, and `setters` which

View file

@ -15,10 +15,29 @@ let System, __instantiateAsync, __instantiate;
}, },
}; };
async function dI(mid, src) {
let id = mid.replace(/\.\w+$/i, "");
if (id.includes("./")) {
const [o, ...ia] = id.split("/").reverse(),
[, ...sa] = src.split("/").reverse(),
oa = [o];
let s = 0,
i;
while ((i = ia.shift())) {
if (i === "..") s++;
else if (i === ".") break;
else oa.push(i);
}
if (s < sa.length) oa.push(...sa.slice(s));
id = oa.reverse().join("/");
}
return r.has(id) ? gExpA(id) : import(mid);
}
function gC(id, main) { function gC(id, main) {
return { return {
id, id,
import: async (id) => r.get(id)?.exp, import: (m) => dI(m, id),
meta: { url: id, main }, meta: { url: id, main },
}; };
} }