@eeaas/core
Version:
Easter eggs as a service
243 lines (242 loc) • 8.12 kB
JavaScript
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