diff options
Diffstat (limited to 'cli/system_loader.js')
-rw-r--r-- | cli/system_loader.js | 99 |
1 files changed, 99 insertions, 0 deletions
diff --git a/cli/system_loader.js b/cli/system_loader.js new file mode 100644 index 000000000..c96b2c7f6 --- /dev/null +++ b/cli/system_loader.js @@ -0,0 +1,99 @@ +// Copyright 2018-2020 the Deno authors. All rights reserved. MIT license. + +// This is a specialised implementation of a System module loader. + +"use strict"; + +// @ts-nocheck +/* eslint-disable */ +let System, __instantiate; +(() => { + const r = new Map(); + + System = { + register(id, d, f) { + r.set(id, { d, f, exp: {} }); + }, + }; + 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: (m) => dI(m, id), + meta: { url: id, main }, + }; + } + + function gE(exp) { + return (id, v) => { + v = typeof id === "string" ? { [id]: v } : id; + for (const [id, value] of Object.entries(v)) { + Object.defineProperty(exp, id, { + value, + writable: true, + enumerable: true, + }); + } + }; + } + + function rF(main) { + for (const [id, m] of r.entries()) { + const { f, exp } = m; + const { execute: e, setters: s } = f(gE(exp), gC(id, id === main)); + delete m.f; + m.e = e; + m.s = s; + } + } + + async function gExpA(id) { + if (!r.has(id)) return; + const m = r.get(id); + if (m.s) { + const { d, e, s } = m; + delete m.s; + delete m.e; + for (let i = 0; i < s.length; i++) s[i](await gExpA(d[i])); + const r = e(); + if (r) await r; + } + return m.exp; + } + + function gExp(id) { + if (!r.has(id)) return; + const m = r.get(id); + if (m.s) { + const { d, e, s } = m; + delete m.s; + delete m.e; + for (let i = 0; i < s.length; i++) s[i](gExp(d[i])); + e(); + } + return m.exp; + } + __instantiate = (m, a) => { + System = __instantiate = undefined; + rF(m); + return a ? gExpA(m) : gExp(m); + }; +})(); |