diff options
Diffstat (limited to 'deno_typescript')
-rw-r--r-- | deno_typescript/README.md | 11 | ||||
-rw-r--r-- | deno_typescript/system_loader.js | 21 |
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 }, }; } |