UNPKG

@eeaas/core

Version:

Easter eggs as a service

3 lines (2 loc) 6.14 kB
(function(c,l){typeof exports=="object"&&typeof module<"u"?l(exports):typeof define=="function"&&define.amd?define(["exports"],l):(c=typeof globalThis<"u"?globalThis:c||self,l(c._eeaas={}))})(this,function(c){"use strict";var M=Object.defineProperty;var O=(c,l,d)=>l in c?M(c,l,{enumerable:!0,configurable:!0,writable:!0,value:d}):c[l]=d;var g=(c,l,d)=>O(c,typeof l!="symbol"?l+"":l,d);class l{constructor(e){g(this,"patterns");g(this,"buffer",[]);g(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}}const d={info:"#2196f3",success:"#26c281",warn:"#ff9800",error:"#d32f2f"};class L{constructor(e=!1){g(this,"debug");this.debug=e}shouldLog(e){return typeof this.debug=="boolean"?this.debug:Array.isArray(this.debug)?this.debug.includes(e):typeof this.debug=="string"?this.debug===e:!1}log(e,r,...a){if(!this.shouldLog(e)&&e!=="error")return;const h=`color: white; background-color: ${d[e]}; padding: 2px 5px; border-radius: 2px`;(e==="error"?console.error:e==="warn"?console.warn:console.info)(`%c${r}`,h,...a)}info(e,...r){this.log("info",e,...r)}success(e,...r){this.log("success",e,...r)}warn(e,...r){this.log("warn",e,...r)}error(e,...r){this.log("error",e,...r)}}const k=({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=k({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)}),R=(n,e,r)=>({...e,id:`eeaas_${n.name}_${e.type}_${r}`}),T=n=>!!(n.url&&!n.content)||!!(!n.url&&n.content),E=n=>document.getElementById(n)!==null,S=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},I=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},v=async(n,e)=>{if(!e.length)return[];const r=e.filter(s=>T(s)?!0:(n.error("eeaas","Invalid resource! Must have either url or content."),!1)),a=r.filter(s=>s.type==="css"),i=r.filter(s=>s.type==="script"),h=[...a.map(s=>S(s)),...i.map(s=>I(s))];return(await Promise.all(h)).filter(s=>s!==null)},$=n=>{n.length&&n.forEach(e=>{const r=document.getElementById(e.id);r&&r.remove()})},A=({debug:n=!1}={})=>{const e=new L(n),r={},a={};return{register:s=>{r[s.name]&&(e.warn("eeaas",`Egg "${s.name}" is already registered, re-registering...`),a[s.name].disable());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,p)=>R(s,o,p)):[],loadedResources:[]};let f=null;const m=new Set,y=()=>{for(const o of m)try{o()}catch(p){e.error("eeaas",`Error in listener for egg "${s.name}":`,p)}},u={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:()=>u.start(),captureOnInputs:t.trigger.captureOnInputs??!0,onKeydown:t.trigger.onKeydown}),t.stopTrigger.type==="keys"&&o.push({keystrokes:t.stopTrigger.keystrokes,callback:()=>u.stop(),captureOnInputs:t.stopTrigger.captureOnInputs??!0,onKeydown:t.stopTrigger.onKeydown}),f=new l(o),f.start()}t.isEnabled=!0,y(),t.trigger.type==="auto"&&u.start()},disable(){f&&(f.stop(),f=null),t.isActivated&&u.stop(),t.isEnabled=!1,y()},async start(){if(!t.isEnabled){e.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 p=t.resourcesToLoad.filter(K=>!E(K.id));o=await v(e,p)}typeof t.onStart=="function"&&await t.onStart(o),t.loadedResources=o,t.isActivated=!0,y()}catch(o){e.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&&$(t.loadedResources),t.loadedResources=[],t.isActivated=!1,y()}catch(o){e.error("eeaas",`Error stopping egg "${t.name}":`,o)}},subscribe(o){return m.add(o),()=>m.delete(o)},unsubscribe(o){m.delete(o)}};r[s.name]=t,a[s.name]=u,t.isEnabled&&u.enable(),e.info("eeaas",`Registered egg "${s.name}"`)},get:s=>{const t=a[s];if(!t){e.warn("eeaas",`Egg "${s}" not found!`);return}return t},getAll:()=>Object.values(a)}};c.initializeEeaas=A,Object.defineProperty(c,Symbol.toStringTag,{value:"Module"})}); //# sourceMappingURL=eeaas.min.js.map