UNPKG

fun-hooks

Version:

A generalized and simple hooking API for adding extensibility to applications

7 lines 3.66 kB
/* * @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={};r.SYNC=1,r.ASYNC=2,r.QUEUE=4;var t=Object.freeze({ready:0}),e=new WeakMap;function r(n){var o,i={},a=[];function c(n,t){return"function"==typeof n?s.call(null,"sync",n,t):"string"==typeof n&&"function"==typeof t?s.apply(null,arguments):"object"==typeof n?f.apply(null,arguments):void 0}function f(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):)?(.+)/),a=r[1]||"sync",c=r[2];if(!o[c]&&"function"==typeof n[c]&&-1===i.indexOf(c)){var f=n[c];o[c]=n[c]=s(a,f,e?[e,c]:void 0)}})),n=Object.getPrototypeOf(n)}while(r&&n);return o}function u(n){var t=Array.isArray(n)?n:n.split(".");return t.reduce((function(e,r,i){var c=e[r],f=!1;return c||(i===t.length-1?(o||a.push((function(){f||console.warn("fun-hooks: referenced '"+n+"' but it was never created")})),e[r]=l((function(n){e[r]=n,f=!0}))):e[r]={})}),i)}function l(n){var t=[],r=[],o=function(){},i={before:function(n,e){return c.call(this,t,"before",n,e)},after:function(n,t){return c.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()}},a={install:function(e,i,a){this.type=e,o=a,a(t,r),n&&n(i)}};return e.set(i.after,a),i;function c(n,e,i,a){var c={hook:i,type:e,priority:a||10,remove:function(){var e=n.indexOf(c);-1!==e&&(n.splice(e,1),o(t,r))}};return n.push(c),n.sort((function(n,t){return t.priority-n.priority})),o(t,r),this}}function s(t,i,c){var f=i.after&&e.get(i.after);if(f){if(f.type!==t)throw"fun-hooks: recreated hookable with different type";return i}var s,y=c?u(c):l(),p={get:function(n,t){return y[t]||Reflect.get.apply(Reflect,arguments)}};o||a.push(v);var h=new Proxy(i,p);return e.get(h.after).install(t,h,(function(n,e){if(n.length||e.length){var r;if("sync"===t){var o,i="r=t.apply(h,"+(n.length?"arguments":"g")+")";e.length&&(o=a(e,"a","n(function extract(s){r=s},e)")),n.length&&(i=a(n,"b","n(function extract(){"+i+";"+o+"},e)"),o=""),r=["var r,e={bail:function(a){r=a}}",i,o,"return r"].join(";")}else"async"===t&&(r="t.apply(h,"+(n.length?"Array.prototype.slice.call(arguments)":"g")+".concat("+a(e,"a","z?n(z,e):[]")+"))",n.length&&(r="n(function partial(){"+r+"},e)"),r=["var z",'typeof g[g.length-1]==="function"&&(z=i.call(g.pop(),null))',"var e={bail:z}",a(n,"b",r)].join(";"));s=new Function("i,b,a,n,t,h,g",r).bind(null,Function.prototype.bind,n,e,Object.assign)}else s=void 0;function a(n,e,r){for(var o=n.length;o-- >0;)0!==o||"async"===t&&"a"===e?(r="i.call("+e+"["+o+"].hook, h,"+r+")","async"===t&&"a"===e&&0===o||(r="n("+r+",e)")):r=e+"["+o+"].hook.apply(h,["+r+("b"===e?"].concat(g))":",r])");return r}v()})),h;function v(){!o&&("sync"!==t||n.ready&r.SYNC)&&("async"!==t||n.ready&r.ASYNC)?"sync"!==t&&n.ready&r.QUEUE?p.apply=function(){var n=arguments;a.push((function(){h.apply(n[1],n[2])}))}:p.apply=function(){throw"fun-hooks: hooked function not ready"}:p.apply=s}}return(n=Object.assign({},t,n)).ready?c.ready=function(){o=!0,function(n){for(var t;t=n.shift();)t()}(a)}:o=!0,c.get=u,c}return n.exports=r,n.exports})); //# sourceMappingURL=fun-hooks.min.js.map