UNPKG

@eeaas/core

Version:

Easter eggs as a service

243 lines (242 loc) 8.12 kB
var k = Object.defineProperty; var E = (n, e, r) => e in n ? k(n, e, { enumerable: !0, configurable: !0, writable: !0, value: r }) : n[e] = r; var h = (n, e, r) => E(n, typeof e != "symbol" ? e + "" : e, r); class L { constructor(e) { h(this, "patterns"); h(this, "buffer", []); h(this, "isListening", !1); this.patterns = e, this.handleKeyDown = this.handleKeyDown.bind(this); } isInputElement(e) { return e instanceof HTMLInputElement || e instanceof HTMLTextAreaElement || e instanceof HTMLSelectElement || e instanceof HTMLElement && e.isContentEditable; } handleKeyDown(e) { this.buffer.push(e.key.toLowerCase()); const r = Math.max(...this.patterns.map((i) => i.keystrokes.length)); this.buffer.length > r && (this.buffer = this.buffer.slice(-r)); const a = this.isInputElement(e.target); for (const i of this.patterns) if (!(!i.captureOnInputs && a) && (typeof i.onKeydown == "function" && i.onKeydown(e), this.checkMatch(i.keystrokes))) { i.callback(), this.buffer = []; break; } } checkMatch(e) { return this.buffer.length < e.length ? !1 : e.every((r, a) => this.buffer[this.buffer.length - e.length + a] === r.toLowerCase()); } start() { this.isListening || (document.addEventListener("keydown", this.handleKeyDown), this.isListening = !0); } stop() { document.removeEventListener("keydown", this.handleKeyDown), this.buffer = [], this.isListening = !1; } } let y = !1; const l = { get DEBUG() { return y; }, set DEBUG(n) { y = n; } }, R = (n, e, ...r) => { const a = "#2196f3", i = "#26c281", m = "#ff9800", s = "#d32f2f"; let t; switch (n) { case "error": t = s; break; case "warn": t = m; break; case "success": t = i; break; default: t = a; } if (n === "error") return console.error( `%c${e}`, `color: white; background-color: ${t}; padding: 2px 5px; border-radius: 2px`, ...r ); console.info( `%c${e}`, `color: white; background-color: ${t}; padding: 2px 5px; border-radius: 2px`, ...r ); }, g = (n, e, ...r) => { typeof l.DEBUG == "boolean" && !l.DEBUG || Array.isArray(l.DEBUG) && !l.DEBUG.includes(n) || typeof l.DEBUG == "string" && l.DEBUG !== n || R(n, e, ...r); }, v = ({ url: n, resource: e }) => { if (e.type === "css") { const a = Object.assign(document.createElement("link"), { href: n, rel: "stylesheet", id: e.id }); return { ...e, element: a }; } const r = Object.assign(document.createElement("script"), { src: n, id: e.id }); return { ...e, element: r }; }, b = ({ url: n, resource: e }) => new Promise((r, a) => { const i = v({ url: n, resource: e }); i.element.onload = () => { r(i); }, i.element.onerror = () => { i.element.remove(), a(new Error(`[eeaas] Failed to load resource (${e.type}: ${e.url})`)); }, document.head.appendChild(i.element); }), T = (n, e, r) => ({ ...e, id: `eeaas_${n.name}_${e.type}_${r}` }), S = (n) => !!(n.url && !n.content) || !!(!n.url && n.content), I = (n) => document.getElementById(n) !== null, $ = async (n) => { if (n.url) return await b({ resource: n, url: n.url }); if (n.content) { const e = document.createElement("style"); return e.id = n.id, e.textContent = n.content, document.head.appendChild(e), { ...n, id: e.id, element: e }; } return null; }, D = async (n) => { if (n.url) return await b({ resource: n, url: n.url }); if (n.content) { const e = document.createElement("script"); return e.id = n.id, e.textContent = n.content, document.body.appendChild(e), { ...n, id: e.id, element: e }; } return null; }, A = async (n) => { if (!n.length) return []; const e = n.filter((s) => S(s) ? !0 : (console.error("[eeaas] Invalid resource! Must have either url or content."), !1)), r = e.filter((s) => s.type === "css"), a = e.filter((s) => s.type === "script"), i = [ ...r.map((s) => $(s)), ...a.map((s) => D(s)) ]; return (await Promise.all(i)).filter((s) => s !== null); }, x = (n) => { n.length && n.forEach((e) => { const r = document.getElementById(e.id); r && r.remove(); }); }, M = ({ debug: n = !1 } = {}) => { l.DEBUG = n; const e = {}, r = {}; return { register: (s) => { if (e[s.name]) { g("warn", "eeaas", `Skipping registration, egg "${s.name}" is already registered.`); return; } const t = { name: s.name, trigger: s.trigger || { type: "manual" }, stopTrigger: s.stopTrigger || { type: "manual" }, onStart: s.onStart, onStop: s.onStop, allowMultipleInstances: s.allowMultipleInstances ?? !1, isEnabled: s.enabled ?? !0, isActivated: !1, resourcesToLoad: s.resources ? s.resources.map((o, u) => T(s, o, u)) : [], loadedResources: [] }; let d = null; const f = /* @__PURE__ */ new Set(), p = () => { for (const o of f) try { o(); } catch (u) { console.error(`[eeaas] Error in listener for egg "${s.name}":`, u); } }, c = { name: t.name, get isEnabled() { return t.isEnabled; }, get isActivated() { return t.isActivated; }, get loadedResources() { return t.loadedResources; }, enable() { if (t.trigger.type === "keys" || t.stopTrigger.type === "keys") { const o = []; t.trigger.type === "keys" && o.push({ keystrokes: t.trigger.keystrokes, callback: () => c.start(), captureOnInputs: t.trigger.captureOnInputs ?? !0, onKeydown: t.trigger.onKeydown }), t.stopTrigger.type === "keys" && o.push({ keystrokes: t.stopTrigger.keystrokes, callback: () => c.stop(), captureOnInputs: t.stopTrigger.captureOnInputs ?? !0, onKeydown: t.stopTrigger.onKeydown }), d = new L(o), d.start(); } t.isEnabled = !0, p(), t.trigger.type === "auto" && c.start(); }, disable() { d && (d.stop(), d = null), t.isActivated && c.stop(), t.isEnabled = !1, p(); }, async start() { if (!t.isEnabled) { g("warn", "eeaas", `Failed to start! Egg "${t.name}" is not enabled.`); return; } if (t.isActivated) { typeof t.onStop == "function" && !t.allowMultipleInstances && await t.onStop(t.loadedResources), typeof t.onStart == "function" && await t.onStart(t.loadedResources); return; } try { let o = []; if (t.resourcesToLoad && t.resourcesToLoad.length) { const u = t.resourcesToLoad.filter((w) => !I(w.id)); o = await A(u); } typeof t.onStart == "function" && await t.onStart(o), t.loadedResources = o, t.isActivated = !0, p(); } catch (o) { console.error(`[eeaas] Error starting egg "${t.name}":`, o); } }, async stop() { if (t.isActivated) try { typeof t.onStop == "function" && await t.onStop(t.loadedResources), t.resourcesToLoad && t.resourcesToLoad.length && x(t.loadedResources), t.isActivated = !1, p(); } catch (o) { console.error(`[eeaas] Error stopping egg "${t.name}":`, o); } }, subscribe(o) { return f.add(o), () => f.delete(o); }, unsubscribe(o) { f.delete(o); } }; e[s.name] = t, r[s.name] = c, t.isEnabled && c.enable(), g("info", "eeaas", `Registered egg "${s.name}"`); }, get: (s) => { const t = r[s]; if (!t) { console.warn(`[eeaas] Egg "${s}" not found!`); return; } return t; }, getAll: () => Object.values(r) }; }; export { M as initializeEeaas }; //# sourceMappingURL=index.js.map