Skip to content

ESM dynamic import to glob imports, throw synchronous error #3980

Open
@suguanYang

Description

@suguanYang

Expected behavior

the transformed Import Calls should follow the ecma specification, which should be a Rejected Promise.

current behavior:

const main = async () => {
   const num = 1;
   await import(`./file${num }`).catch(err => {
         // can not capture module not fould error
   });

   try {
      await import(`./file${num }`)
   } catch (err) {
     // this could
   }

}

the transformed code:

  var __glob = (map) => (path) => {
    var fn = map[path];
    if (fn) return fn();
    throw new Error("Module not found in bundle: " + path); // synchronously throws an error.
  };
  // import("./file*") in entry.js
  var globImport_file = __glob({
    "./file.js": () => Promise.resolve().then(() => (init_file(), file_exports))
  });
  var main = async () => {
    const num = 3;
    await globImport_file(`./file${num}`).catch((err) => {
      if (err.code === "ERR_MODULE_NOT_FOUND") {
        console.log(err);
      }
    });
    try {
      await globImport_file(`./file${num}`);
    } catch (err) {
    }
  };

demo: https://esbuild.github.io/try/#YgAwLjI0LjAAIC0tYnVuZGxlAGUAZW50cnkuanMAY29uc3QgbWFpbiA9IGFzeW5jICgpID0+IHsKICAgY29uc3QgbnVtID0gMTsKICAgYXdhaXQgaW1wb3J0KGAuL2ZpbGUke251bSB9YCkuY2F0Y2goZXJyID0+IHsKICAgICAgIGlmIChlcnIuY29kZSA9PT0gIkVSUl9NT0RVTEVfTk9UX0ZPVU5EIikgewogICAgICAgICAvLyBub3Qgd29ya3MKICAgICAgIH0KICAgfSk7CgogICB0cnkgewogICAgICBhd2FpdCBpbXBvcnQoYC4vZmlsZSR7bnVtIH1gKQogICB9IGNhdGNoIChlcnIpIHsKICAgICAvLyB0aGlzIHdvcmtzCiAgIH0KCn0AAGZpbGUuanMAZXhwb3J0IGRlZmF1bHQgMTsAAGZpbGUyLmpzAGV4cG9ydCBkZWZhdWx0IDE7

Possible Workaround:

add a new glob for dynamic import:

var __globImport = map => path => {
	var fn = map[path]
	if (fn) return fn()
	return Promise.reject('Module not found')
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions