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