summaryrefslogtreecommitdiff
path: root/deno_typescript
diff options
context:
space:
mode:
Diffstat (limited to 'deno_typescript')
-rw-r--r--deno_typescript/README.md11
-rw-r--r--deno_typescript/system_loader.js21
2 files changed, 31 insertions, 1 deletions
diff --git a/deno_typescript/README.md b/deno_typescript/README.md
index 220b04ae4..8ab969c78 100644
--- a/deno_typescript/README.md
+++ b/deno_typescript/README.md
@@ -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
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
returns an object with two keys, `execute` and `setters`. `execute` is a
function which finalises that instantiation of the module, and `setters` which
diff --git a/deno_typescript/system_loader.js b/deno_typescript/system_loader.js
index b5b10af48..0004d055d 100644
--- a/deno_typescript/system_loader.js
+++ b/deno_typescript/system_loader.js
@@ -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) {
return {
id,
- import: async (id) => r.get(id)?.exp,
+ import: (m) => dI(m, id),
meta: { url: id, main },
};
}