forked from kentcdodds/genie
/
genie.min.js
8 lines (8 loc) · 8.94 KB
/
genie.min.js
1
2
3
4
5
6
7
8
/**
* genie - v0.3.1 @license
* (c) 2014-02-06 - Kent C. Dodds <kent@doddsfamily.us>
* A JavaScript library committed to improving user experience by empowering users to interact with web apps using the keyboard (better than cryptic shortcuts).
* Freely distributed under the MIT license
* https://github.com/kentcdodds/genie
*/
!function(a,b){"use strict";"function"==typeof define&&define.amd?define(b):a.genie=b()}(this,function(){"use strict";function a(c){if(Z(c)){var d=[];return U(c,function(b){d.push(a(b))}),d}var e=b(c),f=m(e.id);return 0>f?vb.push(e):vb[f]=e,e}function b(a){var b=a.id||"g-"+wb++,d={id:b,context:c(a.context),data:a.data||{},magicWords:M(a.magicWords),action:e(a.action)};return d.data.timesMade={total:0,magicWords:{}},d}function c(a){var b=a||yb;return b=$(b)||Z(b)?{any:M(b)}:d(a)}function d(a){function b(b){a[b]&&(a[b]=M(a[b]))}return b("all"),b("any"),b("none"),a}function e(a){return $(a)&&(a={destination:a}),_(a)&&(a=function(){var b=a.openNewTab,c=a.destination;return function(){b?window.open(c,"_blank"):window.location.href=c}}()),a}function f(a){var b=vb.indexOf(a);return b||U(vb,function(c,d){return a===c.id||a.id===c.id?(b=d,a=c,!1):void 0}),vb.splice(b,1),g(a.id),a}function g(a){function b(c,d,e){U(c,function(d,e){if("wishes"===e){var f=d.indexOf(a);-1!==f&&d.splice(f,1),d.length||delete c[e]}else b(d,c,e)});var f=s(c,"wishes").length>0;!f&&d&&e&&delete d[e]}b(xb)}function h(a,b,c){var d=j(a,b,c);return U(d,function(a,b){d[b]=f(a)}),d}function i(a){a=a||yb;var b=[];return U(vb,function(c){(E(a)||E(c.context)||G(c,a))&&b.push(c)}),b}function j(a,b,c){var d=[];return b=b||"any",U(vb,function(e){var f=k(e,c);!T(f)&&("all"===b&&R(f,a)||"none"===b&&Q(f,a)||"any"===b&&P(f,a))&&d.push(e)}),d}function k(a,b){var c=[];return b=b||["all","any","none"],b=M(b),U(b,function(b){a.context[b]&&(c=c.concat(a.context[b]))}),c}function l(a){if(Z(a)){var b=[];return U(m(a),function(a){b.push(vb[a])}),b}var c=m(a);return c>-1?vb[c]:null}function m(a){var b=-1;if(Z(a)){var c=[];return U(a,function(a){c.push(m(a))}),c}return U(vb,function(c,d){return c.id===a?(b=d,!1):void 0}),b}function n(){var a=eb();return eb({wishes:[],noWishMerge:!0,previousId:0,enteredMagicWords:{},context:yb,previousContext:yb,enabled:!0}),a}function o(a){a=(db(a)?"":""+a).toLowerCase();var b=p(a),c=l(b),d=q(c),e=t(vb,b,a),f=l(e);return d.concat(f)}function p(a){var b=r(xb,a.split(""));return b?s(b,"wishes",!0):[]}function q(a){var b=[];return U(a,function(a){a&&F(a)&&b.push(a)}),b}function r(a,b){var c=a;b=M(b);var d=U(b,function(a){return c.hasOwnProperty(a)?(c=c[a],!0):!1});return d?c:null}function s(a,b,c){function d(a){if(a[b]){var f=M(a[b]);U(f,function(a){c&&S(e,a)||e.push(a)})}U(a,function(a,c){c===b||ab(a)||(e=e.concat(d(a)))})}var e=[];return d(a),e}function t(a,b,c){var d=[],e=[];return U(a,function(a){if(F(a)){var e=u(a.magicWords,c);y(a,e,d,b)}},!0),U(d,function(a){a&&U(a,function(a){a&&(e=e.concat(a))})},!0),e}function u(a,b){var c={matchType:Gb.noMatch,magicWordIndex:-1};return U(a,function(a,d){var e=v(a,b);return e>c.matchType&&(c.matchType=e,c.magicWordIndex=d),c.matchType!==Gb.equals}),c}function v(a,b){return a=(""+a).toLowerCase(),b.length>a.length?Gb.noMatch:a===b?Gb.equals:0===a.indexOf(b)?Gb.startsWith:-1!==a.indexOf(" "+b)?Gb.wordStartsWith:-1!==a.indexOf(b)?Gb.contains:1===b.length?Gb.noMatch:-1!==w(a).indexOf(b)?Gb.acronym:x(a,b)}function w(a){var b="",c=a.split(" ");return U(c,function(a){var c=a.split("-");U(c,function(a){b+=a.substr(0,1)})}),b}function x(a,b){function c(a,b){for(var c=!1,e=d;e<b.length;e++){var f=b[e];if(f===a){c=!0,d=e+1;break}}return c}for(var d=0,e=0;e<b.length;e++){var f=b[e],g=c(f,a);if(!g)return Gb.noMatch}return Gb.matches}function y(a,b,c,d){var e=d.indexOf(a.id);b.matchType!==Gb.noMatch?-1===e&&z(c,b).push(a.id):-1!==e&&d.splice(e,1)}function z(a,b){a[b.matchType]=a[b.matchType]||[];var c=a[b.matchType],d=c[b.magicWordIndex]=c[b.magicWordIndex]||[];return d}function A(a,b){return b=(b?""+b:"").toLowerCase(),a=B(a,b),C(a)?(D(a,b),db(b)||H(a,b),a):null}function B(a,b){var c=a;if(_(c)||(c=l(a)),db(c)){var d=o(b);d.length>0&&(c=d[0])}return c}function C(a){return!!a&&!db(a.action)&&F(a)}function D(a,b){a.action(a,b);var c=a.data.timesMade;c.total++,c.magicWords[b]=c.magicWords[b]||0,c.magicWords[b]++}function E(a){return _(a)||(a=M(a)),Z(a)&&1===a.length?a[0]===yb[0]:a.any&&1===a.any.length?a.any[0]===yb[0]:!1}function F(a){return E(Ab)||E(a.context)||a.context===Ab||G(a,Ab)}function G(a,b){var c,d=a.context.any||[],e=a.context.all||[],f=a.context.none||[],g=T(d)||P(b,d),h=b.length>=e.length&&R(b,e),i=Q(b,f);return c=g&&h&&i}function H(a,b){var c=I(xb,b);c.wishes=c.wishes||[];var d=c.wishes.indexOf(a.id);0!==d&&J(a.id,c.wishes,d)}function I(a,b){var c=b.substring(0,1),d=b.substring(1),e=a[c]=a[c]||{};return d?I(e,d):e}function J(a,b,c){if(-1!==c&&b.splice(c,1),1!==c&&b.length>0){var d=b[0];b[0]=a,a=d}b.unshift(a)}function K(a){var b={add:[],remove:[]};return U(Bb,function(c){var d=!1,e=c.contexts,f=c.regexes,g=c.paths;U(f,function(c){c.lastIndex=0;var f=c.exec(a);if(f&&f.length>0){var g=[];U(e,function(a){var b=a.replace(Fb,function(a,b){return f[b]});g.push(b)}),b.add=b.add.concat(g),d=!0}return!d}),d||(U(g,function(c){return a===c&&(b.add=b.add.concat(e),d=!0),!d}),d||(b.remove=b.remove.concat(e)))}),b}function L(){var a=[];return U(Bb,function(b){var c=b.contexts;U(c,function(b){if(Fb.test(b)){var c=b.replace(Fb,".+?");U(Ab,function(b){new RegExp(c).test(b)&&a.push(b)})}})}),a}function M(a){return a?Z(a)?a:[a]:[]}function N(a,b){return b=M(b),a=M(a),U(b,function(b){a.indexOf(b)<0&&a.push(b)}),a}function O(a,b){a=M(a),b=M(b);for(var c=0;c<a.length;)S(b,a[c])?a.splice(c,1):c++;return a}function P(a,b){a=M(a),b=M(b);for(var c=0;c<b.length;c++)if(S(a,b[c]))return!0;return!1}function Q(a,b){a=M(a),b=M(b);for(var c=0;c<b.length;c++)if(S(a,b[c]))return!1;return!0}function R(a,b){a=M(a),b=M(b);for(var c=0;c<b.length;c++)if(!S(a,b[c]))return!1;return!0}function S(a,b){return a.indexOf(b)>-1}function T(a){return db(a)?!0:Z(a)?0===a.length:$(a)?""===a:ab(a)?!1:_(a)?Object.keys(a).length<1:!1}function U(a,b,c){return ab(a)&&(a=M(a)),Z(a)?V(a,b,c):Y(a,b)}function V(a,b,c){return c===!0?W(a,b):X(a,b)}function W(a,b){for(var c=!0,d=a.length-1;d>=0&&(c=b(a[d],d,a),c!==!1);d--);return c}function X(a,b){for(var c=!0,d=0;d<a.length&&(c=b(a[d],d,a),c!==!1);d++);return c}function Y(a,b){var c=!0;for(var d in a)if(a.hasOwnProperty(d)&&(c=b(a[d],d,a),c===!1))break;return c}function Z(a){return a instanceof Array}function $(a){return"string"==typeof a}function _(a){return"object"==typeof a}function ab(a){switch(typeof a){case"string":case"number":case"boolean":case"undefined":return!0;default:return!1}}function bb(a){return Z(a)?!U(a,function(a){return!bb(a)}):"undefined"==typeof a}function cb(a){return Z(a)?!U(a,function(a){return!cb(a)}):null===a}function db(a){return cb(a)||bb(a)}function eb(a){return a&&(hb(a),wb=a.previousId||wb,xb=a.enteredMagicWords||xb,Ab=a.context||Ab,Cb=a.previousContext||Cb,Db=a.enabled||Db,Eb=a.returnOnDisabled||Eb),{wishes:vb,previousId:wb,enteredMagicWords:xb,context:Ab,previousContext:Cb,enabled:Db,returnOnDisabled:Eb}}function fb(a){ub.getMatchingWishes=tb(function(b){return a(vb,b,Ab,xb)},[])}function gb(){var a=ub.getMatchingWishes;return ub.getMatchingWishes=zb,a}function hb(a){a.wishes&&(a.noWishMerge?vb=a.wishes:ib(a.wishes))}function ib(a){return U(a,function(a){var b=-1,c=null;U(vb,function(d,e){return d.id===a.id?(c=d,b=e,!1):void 0}),!a.action&&c&&(a.action=c.action),a.action&&(vb[b]=a)}),vb}function jb(a){return bb(a)||(Cb=Ab,Z(a)||(a=[a]),Ab=a),Ab}function kb(a){return a&&a.length&&(Cb=Ab,N(Ab,a)),Ab}function lb(a){return a&&a.length&&(Cb=Ab,O(Ab,a),T(jb)&&(Ab=yb)),Ab}function mb(){return jb(Cb)}function nb(){return jb(yb)}function ob(a,b){if(a){var c=K(a),d=c.add,e=L();e=e.concat(c.remove),lb(e),b||h(e),kb(d)}return Ab}function pb(a){return U(a,function(a){a.paths&&(a.paths=M(a.paths)),a.regexes&&(a.regexes=M(a.regexes)),a.contexts&&(a.contexts=M(a.contexts))}),N(Bb,a),Bb}function qb(a){return O(Bb,a),Bb}function rb(a){return void 0!==a&&(Db=a),Db}function sb(a){return void 0!==a&&(Eb=a),Eb}function tb(a,b){return function(){return Db||a===rb?a.apply(this,arguments):Eb?b:null}}var ub=null,vb=[],wb=0,xb={},yb=["universe"],zb=function(){},Ab=yb,Bb=[],Cb=yb,Db=!0,Eb=!0,Fb=/\{\{(\d+)\}\}/g,Gb={equals:5,startsWith:4,wordStartsWith:3,contains:2,acronym:1,matches:0,noMatch:-1};return ub=tb(a,{}),ub.deregisterWish=tb(f,{}),ub.deregisterWishesWithContext=tb(h,[]),ub.getMatchingWishes=tb(o,[]),ub.overrideMatchingAlgorithm=tb(fb,{}),ub.restoreMatchingAlgorithm=tb(gb,{}),ub.getWishesInContext=tb(i,[]),ub.getWishesWithContext=tb(j,[]),ub.getWish=tb(l,{}),ub.makeWish=tb(A,{}),ub.reset=tb(n,{}),ub.options=tb(eb,{}),ub.mergeWishes=tb(ib,{}),ub.context=tb(jb,[]),ub.addContext=tb(kb,[]),ub.removeContext=tb(lb,[]),ub.revertContext=tb(mb,[]),ub.restoreContext=tb(nb,[]),ub.updatePathContext=tb(ob,[]),ub.addPathContext=tb(pb,[]),ub.removePathContext=tb(qb,[]),ub.enabled=tb(rb,!1),ub.returnOnDisabled=tb(sb,!0),zb=ub.getMatchingWishes,ub});