UNPKG

typework

Version:

Manage And Vendor JSDoc Types. Import Typedefs Into Target Projects.

386 lines (383 loc) 9.38 kB
#!/usr/bin/env node const path = require('path'); const fs = require('fs'); const os = require('os'); const stream = require('stream'); const {dirname:q, join:t, relative:u, resolve:v} = path; const {createReadStream:w, createWriteStream:x, existsSync:y, lstat:z, mkdir:aa, readFileSync:A} = fs; const B = (a, b = 0, c = !1) => { if (0 === b && !c) { return a; } a = a.split("\n", c ? b + 1 : void 0); return c ? a[a.length - 1] : a.slice(b).join("\n"); }, ba = (a, b = !1) => B(a, 2 + (b ? 1 : 0)), C = a => { ({callee:{caller:a}} = a); return a; }; const {homedir:ca} = os; const D = /\s+at.*(?:\(|\s)(.*)\)?/, da = /^(?:(?:(?:node|(?:internal\/[\w/]*|.*node_modules\/(?:IGNORED_MODULES)\/.*)?\w+)\.js:\d+:\d+)|native)/, ea = ca(), E = a => { const {pretty:b = !1, ignoredModules:c = ["pirates"]} = {}, d = c.join("|"), f = new RegExp(da.source.replace("IGNORED_MODULES", d)); return a.replace(/\\/g, "/").split("\n").filter(e => { e = e.match(D); if (null === e || !e[1]) { return !0; } e = e[1]; return e.includes(".app/Contents/Resources/electron.asar") || e.includes(".app/Contents/Resources/default_app.asar") ? !1 : !f.test(e); }).filter(e => e.trim()).map(e => b ? e.replace(D, (k, h) => k.replace(h, h.replace(ea, "~"))) : e).join("\n"); }; function fa(a, b, c = !1) { return function(d) { var f = C(arguments), {stack:e} = Error(); const k = B(e, 2, !0), h = (e = d instanceof Error) ? d.message : d; f = [`Error: ${h}`, ...null !== f && a === f || c ? [b] : [k, b]].join("\n"); f = E(f); return Object.assign(e ? d : Error(), {message:h, stack:f}); }; } ;function F(a) { var {stack:b} = Error(); const c = C(arguments); b = ba(b, a); return fa(c, b, a); } ;function G(a, b) { if (b > a - 2) { throw Error("Function does not accept that many arguments."); } } async function H(a, b, c) { const d = F(!0); if ("function" !== typeof a) { throw Error("Function must be passed."); } const {length:f} = a; if (!f) { throw Error("Function does not accept any arguments."); } return await new Promise((e, k) => { const h = (m, g) => m ? (m = d(m), k(m)) : e(c || g); let l = [h]; Array.isArray(b) ? (b.forEach((m, g) => { G(f, g); }), l = [...b, h]) : 1 < Array.from(arguments).length && (G(f, 0), l = [b, h]); a(...l); }); } ;const I = async a => { try { return await H(z, a); } catch (b) { return null; } }; const K = async a => { var b = await I(a); let c = a, d = !1; if (!b) { if (c = await J(a), !c) { throw Error(`${a}.js or ${a}.jsx is not found.`); } } else { if (b.isDirectory()) { b = !1; let f; a.endsWith("/") || (f = c = await J(a), b = !0); if (!f) { c = await J(t(a, "index")); if (!c) { throw Error(`${b ? `${a}.jsx? does not exist, and ` : ""}index.jsx? file is not found in ${a}`); } d = !0; } } } return {path:a.startsWith(".") ? u("", c) : c, i:d}; }, J = async a => { a = `${a}.js`; let b = await I(a); b || (a = `${a}x`); if (b = await I(a)) { return a; } }; var ha = stream; const {Transform:ia, Writable:ja} = stream; const ka = (a, b) => { b.once("error", c => { a.emit("error", c); }); return b; }; class la extends ja { constructor(a) { var b = a || {}, c = Object.assign({}, b); const d = void 0 === b.binary ? !1 : b.binary, f = void 0 === b.rs ? null : b.rs; b = (delete c.binary, delete c.rs, c); const {h:e = F(!0), proxyError:k} = a || {}, h = (l, m) => e(m); super(b); this.a = []; this.c = new Promise((l, m) => { this.on("finish", () => { let g; d ? g = Buffer.concat(this.a) : g = this.a.join(""); l(g); this.a = []; }); this.once("error", g => { if (-1 == g.stack.indexOf("\n")) { h`${g}`; } else { const n = E(g.stack); g.stack = n; k && h`${g}`; } m(g); }); f && ka(this, f).pipe(this); }); } _write(a, b, c) { this.a.push(a); c(); } get b() { return this.c; } } const L = async a => { var b = void 0 === b ? {} : b; ({b:a} = new la(Object.assign({}, {rs:a}, b, {h:F(!0)}))); return await a; }; async function M(a) { a = w(a); return await L(a); } ;async function N(a, b) { if (!a) { throw Error("No path is given."); } const c = F(!0), d = x(a); await new Promise((f, e) => { d.on("error", k => { k = c(k); e(k); }).on("close", f).end(b); }); } ;async function ma(a) { const b = q(a); try { return await O(b), a; } catch (c) { if (/EEXIST/.test(c.message) && -1 != c.message.indexOf(b)) { return a; } throw c; } } async function O(a) { try { await H(aa, a); } catch (b) { if ("ENOENT" == b.code) { const c = q(a); await O(c); await O(a); } else { if ("EEXIST" != b.code) { throw b; } } } } ;function na(a) { if ("object" != typeof a) { return !1; } const {re:b, replacement:c} = a; a = b instanceof RegExp; const d = -1 != ["string", "function"].indexOf(typeof c); return a && d; } const P = (a, b) => { if (!(b instanceof Error)) { throw b; } [, , a] = a.stack.split("\n", 3); a = b.stack.indexOf(a); if (-1 == a) { throw b; } a = b.stack.substr(0, a - 1); const c = a.lastIndexOf("\n"); b.stack = a.substr(0, c); throw b; }; async function Q(a, b) { b instanceof ha ? b.pipe(a) : a.end(b); return await L(a); } async function oa(a, b) { return await a.b.reduce(async(c, {re:d, replacement:f}) => { c = await c; if (a.a) { return c; } if ("string" == typeof f) { c = c.replace(d, f); } else { const e = []; let k; const h = c.replace(d, (l, ...m) => { k = Error(); try { if (a.a) { return e.length ? e.push(Promise.resolve(l)) : l; } const g = f.call(a, l, ...m); g instanceof Promise && e.push(g); return g; } catch (g) { P(k, g); } }); if (e.length) { try { const l = await Promise.all(e); c = c.replace(d, () => l.shift()); } catch (l) { P(k, l); } } else { c = h; } } return c; }, `${b}`); } class R extends ia { constructor(a, b) { super(b); this.b = (Array.isArray(a) ? a : [a]).filter(na); this.a = !1; this.f = b; } async replace(a, b) { const c = new R(this.b, this.f); b && Object.assign(c, b); a = await Q(c, a); c.a && this.brake(); b && Object.keys(b).forEach(d => { b[d] = c[d]; }); return a; } brake() { this.a = !0; } async _transform(a, b, c) { try { const d = await oa(this, a); this.push(d); c(); } catch (d) { a = E(d.stack), d.stack = a, c(d); } } } ;const [, , S] = process.argv; var T; { let a; try { a = require(v(S)); } catch (b) { const c = t(process.cwd(), S); a = require(v(c)); } T = a; } const {entry:U, js:V, destination:pa} = T; let W, X = W; try { W = A(U).toString(); } catch (a) { if ("ENOENT" != a.code) { throw a; } try { X = require.resolve(); } catch (b) { const c = t(process.cwd(), "node_modules", U); X = require.resolve(c); } W = A(X).toString(); } const qa = q(X), ra = q(V), [, Y] = W.split("/* typework */\n"); Y || (console.log("/* typework */ marker not found in %s", u("", X)), process.exit(1)); const sa = A(V).toString(), Z = /import\(['"](\..+?)['"]\)/g, xa = async() => { let a = {}; var b = new R({re:Z, async replacement(c, d) { let f = t(pa, d); var e = u(ra, f); if (d in a) { return a[d]; } e = `import('${e}')`; a[d] = e; console.log("Detected %s", d); const k = t(qa, d); let h; try { ({path:h} = await K(k)); } catch (g) { return console.log("Could not resolve %s from %s", d, X), c; } f.endsWith(".js") || (f = h.endsWith("index.js") ? t(f, "index.js") : f + ".js"); c = await M(h); const l = c.split(/\n/g), m = q(h); d = new R({re:Z, async replacement(g, n, r) { const ta = t(m, n); var p; try { ({path:p} = await K(ta)); } catch (ua) { this.brake(); for (p = g = 0; p < r;) { p += l[g].length, g++; } g = {line:g, g:p - r}; const {line:va, g:wa} = g; console.log("Could not resolve %s from %s:%s:%s", n, h, va, wa); throw ua; } r = u(q(f), V); if (p == X) { return r = r.replace(/(\/index)?\.js$/, ""), `import('${r}')`; } r = q(f); n = t(r, n); n.endsWith(".js") || (n = p.endsWith("index.js") ? t(n, "index.js") : n + ".js"); y(n) || (p = await M(p), await N(n, p)); return g; }}); c = await Q(d, c); await ma(f); await N(f, c); return e; }}); b = await Q(b, Y); b = sa.replace(/\/\* typework \*\/\n(?:([^\n][\s\S]+?\n))?$/, `/* typework */ ${b}`); await N(V, b); }; (async() => { try { await xa(); } catch (a) { process.env.DEBUG ? console.error(a.stack) : console.log(a.message); } })();