fun-hooks
Version:
A generalized and simple hooking API for adding extensibility to applications
7 lines • 3.37 kB
JavaScript
/*
* @license MIT
* Fun Hooks v1.1.0
* (c) @snapwich
*/
!function(n,t){"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?module.exports=t():n.funHooks=t()}(this,(function(){let n={};o.SYNC=1,o.ASYNC=2,o.QUEUE=4;var t=Object.freeze({ready:0}),e=new WeakMap;function r(n,t){return Array.prototype.slice.call(n,t)}function o(n){var i,c={},f=[];function u(n,t){return"function"==typeof n?l.call(null,"sync",n,t):"string"==typeof n&&"function"==typeof t?l.apply(null,arguments):"object"==typeof n?a.apply(null,arguments):void 0}function a(n,t,e){var r=!0;void 0===t&&(t=Object.getOwnPropertyNames(n).filter(n=>!n.match(/^_/)),r=!1);var o={},i=["constructor"];do{t.forEach((function(t){var r=t.match(/(?:(sync|async):)?(.+)/),c=r[1]||"sync",f=r[2];if(!o[f]&&"function"==typeof n[f]&&-1===i.indexOf(f)){var u=n[f];o[f]=n[f]=l(c,u,e?[e,f]:void 0)}})),n=Object.getPrototypeOf(n)}while(r&&n);return o}function p(n){var t=Array.isArray(n)?n:n.split(".");return t.reduce((function(e,r,o){var c=e[r],u=!1;return c||(o===t.length-1?(i||f.push((function(){u||console.warn("fun-hooks: referenced '"+n+"' but it was never created")})),e[r]=y((function(n){e[r]=n,u=!0}))):e[r]={})}),c)}function y(n){var t=[],r=[],o=function(){},i={before:function(n,e){return f.call(this,t,"before",n,e)},after:function(n,t){return f.call(this,r,"after",n,t)},getHooks:function(n){var e=t.concat(r);"object"==typeof n&&(e=e.filter((function(t){return Object.keys(n).every((function(e){return t[e]===n[e]}))})));try{Object.assign(e,{remove:function(){return e.forEach((function(n){n.remove()})),this}})}catch(n){console.error("error adding `remove` to array, did you modify Array.prototype?")}return e},removeAll:function(){return this.getHooks().remove()}},c={install:function(e,i,c){this.type=e,o=c,c(t,r),n&&n(i)}};return e.set(i.after,c),i;function f(n,e,i,c){var f={hook:i,type:e,priority:c||10,remove:function(){var e=n.indexOf(f);-1!==e&&(n.splice(e,1),o(t,r))}};return n.push(f),n.sort((function(n,t){return t.priority-n.priority})),o(t,r),this}}function l(t,c,u){var a=c.after&&e.get(c.after);if(a){if(a.type!==t)throw"fun-hooks: recreated hookable with different type";return c}var l,s=u?p(u):y(),h={get:function(n,t){return s[t]||Reflect.get.apply(Reflect,arguments)}};i||f.push(d);var v=new Proxy(c,h);return e.get(v.after).install(t,v,(function(n,e){var o,i=[];n.length||e.length?(n.forEach(c),o=i.push(void 0)-1,e.forEach(c),l=function(n,e,c){var f,u=i.slice(),a=0,p="async"===t&&"function"==typeof c[c.length-1]&&c.pop();function y(n){"sync"===t?f=n:p&&p.apply(null,arguments)}function l(n){if(u[a]){var o=r(arguments);return l.bail=y,o.unshift(l),u[a++].apply(e,o)}"sync"===t?f=n:p&&p.apply(null,arguments)}return u[o]=function(){var o=r(arguments,1);"async"===t&&p&&(delete l.bail,o.push(l));var i=n.apply(e,o);"sync"===t&&l(i)},l.apply(null,c),f}):l=void 0;function c(n){i.push(n.hook)}d()})),v;function d(){!i&&("sync"!==t||n.ready&o.SYNC)&&("async"!==t||n.ready&o.ASYNC)?"sync"!==t&&n.ready&o.QUEUE?h.apply=function(){var n=arguments;f.push((function(){v.apply(n[1],n[2])}))}:h.apply=function(){throw"fun-hooks: hooked function not ready"}:h.apply=l}}return(n=Object.assign({},t,n)).ready?u.ready=function(){i=!0,function(n){for(var t;t=n.shift();)t()}(f)}:i=!0,u.get=p,u}return n.exports=o,n.exports}));
//# sourceMappingURL=fun-hooks.min.no-eval.js.map