forked from josdejong/typed-function
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtyped-function.min.js
1 lines (1 loc) · 10.4 KB
/
typed-function.min.js
1
"use strict";!function(r){"function"==typeof define&&define.amd?define([],r):"object"==typeof exports?module.exports=r():window.typed=r()}(function(){function r(r){var n=m.types[r];if(!n){var t;for(var e in m.types)if(m.types.hasOwnProperty(e)&&e.toLowerCase()==r.toLowerCase()){t=e;break}throw new Error('Unknown type "'+r+'"'+(t?'. Did you mean "'+t+'"?':""))}return n}function n(r,n,t,e,s){var i,o=c(e),a=s?s.split(","):null,p=a&&g(a,"any"),h={fn:r,index:t,actual:e,expected:a};i=a?n>t&&!p?"Unexpected type of argument (expected: "+a.join(" or ")+", actual: "+o+", index: "+t+")":"Too few arguments (expected: "+a.join(" or ")+", index: "+t+")":"Too many arguments (expected: "+t+", actual: "+n+")";var u=new TypeError(i);return u.data=h,u}function t(r){this.name=r||"refs",this.categories={}}function e(r,n){if("string"==typeof r){var t=r.trim(),s="..."===t.substr(0,3);if(s&&(t=t.substr(3)),""===t)this.types=["any"];else{this.types=t.split("|");for(var i=0;i<this.types.length;i++)this.types[i]=this.types[i].trim()}}else{if(!Array.isArray(r)){if(r instanceof e)return r.clone();throw new Error("String or Array expected")}this.types=r}this.conversions=[],this.varArgs=s||n||!1,this.anyType=-1!==this.types.indexOf("any")}function s(r,n){var t;if("string"==typeof r)t=""!==r?r.split(","):[];else{if(!Array.isArray(r))throw new Error("string or Array expected");t=r}this.params=new Array(t.length);for(var s=0;s<t.length;s++){var i=new e(t[s]);if(this.params[s]=i,s===t.length-1)this.varArgs=i.varArgs;else if(i.varArgs)throw new SyntaxError('Unexpected variable arguments operator "..."')}this.fn=n}function i(r,n,t){this.path=r||[],this.param=r[r.length-1]||null,this.signature=n||null,this.childs=t||[]}function o(r){var n,t,e={},i=[];for(var o in r)if(r.hasOwnProperty(o)){var a=r[o];n=new s(o,a);var p=n.expand();for(t=0;t<p.length;t++){var h=p[t],u=h.toString(),f=e[u];if(f){var c=s.compare(h,f);if(0>c)e[u]=h;else if(0===c)throw new Error('Signature "'+u+'" is defined twice')}else e[u]=h}}for(u in e)e.hasOwnProperty(u)&&i.push(e[u]);for(t=0;t<i.length;t++)if(n=i[t],n.varArgs)for(var v=n.params.length-1,l=n.params[v],y=0;y<l.types.length;){if(l.conversions[y])for(var m=l.types[y],d=0;d<i.length;d++){var w=i[d],A=w.params[v];if(w!==n&&A&&g(A.types,m)&&!A.conversions[v]){l.types.splice(y,1),l.conversions.splice(y,1),y--;break}}y++}return i}function a(r){for(var n={},t=0;t<r.length;t++){var e=r[t];if(e.fn){var s=e.params.join(",");n[s]=e.fn}}return n}function p(r,n){var t,s,o,a=n.length,h=[];for(t=0;t<r.length;t++)s=r[t],s.params.length!==a||o||(o=s),void 0!=s.params[a]&&h.push(s);h.sort(function(r,n){return e.compare(r.params[a],n.params[a])});var u=[];for(t=0;t<h.length;t++){s=h[t];var f=s.params[a],c=u.filter(function(r){return r.param.overlapping(f)})[0];if(c){if(c.param.varArgs)throw new Error('Conflicting types "'+c.param+'" and "'+f+'"');c.signatures.push(s)}else u.push({param:f,signatures:[s]})}var g=new Array(u.length);for(t=0;t<u.length;t++){var v=u[t];g[t]=p(v.signatures,n.concat(v.param))}return new i(n,o,g)}function h(r){for(var n=[],t=0;r>t;t++)n[t]="arg"+t;return n}function u(r,e){var s=new t,i=o(e);if(0==i.length)throw new Error("No signatures provided");var u=p(i,[]),c=[],g=r||"",v=h(f(i));c.push("function "+g+"("+v.join(", ")+") {"),c.push(' "use strict";'),c.push(u.toCode(s," ")),c.push("}");var l=[s.toCode(),"return "+c.join("\n")].join("\n"),y=new Function(s.name,"createError",l),m=y(s,n);return m.signatures=a(i),m}function f(r){for(var n=0,t=0;t<r.length;t++){var e=r[t].params.length;e>n&&(n=e)}return n}function c(r){for(var n in v)if(v.hasOwnProperty(n)&&"Object"!==n&&v[n](r))return n;return v.Object(r)?n:"unknown"}function g(r,n){return-1!==r.indexOf(n)}t.prototype.add=function(r,n){var t=n||"fn";this.categories[t]||(this.categories[t]=[]);var e=this.categories[t].indexOf(r);return-1==e&&(e=this.categories[t].length,this.categories[t].push(r)),t+e},t.prototype.toCode=function(){var r=[],n=this.name+".categories",t=this.categories;for(var e in t)if(t.hasOwnProperty(e))for(var s=t[e],i=0;i<s.length;i++)r.push("var "+e+i+" = "+n+"['"+e+"']["+i+"];");return r.join("\n")},e.compare=function(r,n){if(r.anyType)return 1;if(n.anyType)return-1;if(g(r.types,"Object"))return 1;if(g(n.types,"Object"))return-1;if(r.hasConversions()){if(n.hasConversions()){var t,e,s;for(t=0;t<r.conversions.length;t++)if(void 0!==r.conversions[t]){e=r.conversions[t];break}for(t=0;t<n.conversions.length;t++)if(void 0!==n.conversions[t]){s=n.conversions[t];break}return m.conversions.indexOf(e)-m.conversions.indexOf(s)}return 1}return n.hasConversions()?-1:0},e.prototype.overlapping=function(r){for(var n=0;n<this.types.length;n++)if(g(r.types,this.types[n]))return!0;return!1},e.prototype.clone=function(){var r=new e(this.types.slice(),this.varArgs);return r.conversions=this.conversions.slice(),r},e.prototype.hasConversions=function(){return this.conversions.length>0},e.prototype.toString=function(r){for(var n=[],t={},e=0;e<this.types.length;e++){var s=this.conversions[e],i=r&&s?s.to:this.types[e];i in t||(t[i]=!0,n.push(i))}return(this.varArgs?"...":"")+n.join("|")},s.prototype.clone=function(){return new s(this.params.slice(),this.fn)},s.prototype.expand=function(){function r(t,i){if(i.length<t.params.length){var o,a,p,h=t.params[i.length];if(h.varArgs){for(a=h.clone(),o=0;o<m.conversions.length;o++)if(p=m.conversions[o],!g(h.types,p.from)&&g(h.types,p.to)){var u=a.types.length;a.types[u]=p.from,a.conversions[u]=p}r(t,i.concat(a))}else{for(o=0;o<h.types.length;o++)r(t,i.concat(new e(h.types[o])));for(o=0;o<m.conversions.length;o++)p=m.conversions[o],!g(h.types,p.from)&&g(h.types,p.to)&&(a=new e(p.from),a.conversions[0]=p,r(t,i.concat(a)))}}else n.push(new s(i,t.fn))}var n=[];return r(this,[]),n},s.compare=function(r,n){if(r.params.length>n.params.length)return 1;if(r.params.length<n.params.length)return-1;var t,s=r.params.length,i=0,o=0;for(t=0;s>t;t++)r.params[t].hasConversions()&&i++,n.params[t].hasConversions()&&o++;if(i>o)return 1;if(o>i)return-1;for(t=0;t<r.params.length;t++){var a=e.compare(r.params[t],n.params[t]);if(0!==a)return a}return 0},s.prototype.hasConversions=function(){for(var r=0;r<this.params.length;r++)if(this.params[r].hasConversions())return!0;return!1},s.prototype.toCode=function(r,n){for(var t=[],e=new Array(this.params.length),s=0;s<this.params.length;s++){var i=this.params[s],o=i.conversions[0];e[s]=i.varArgs?"varArgs":o?r.add(o.convert,"convert")+"(arg"+s+")":"arg"+s}var a=this.fn?r.add(this.fn,"signature"):void 0;return a?n+"return "+a+"("+e.join(", ")+"); // signature: "+this.params.join(", "):t.join("\n")},s.prototype.toString=function(){return this.params.join(", ")},i.prototype.toCode=function(n,t,e){var s=[];if(this.param){var i=this.path.length-1,o=this.param.conversions[0],a="// type: "+(o?o.from+" (convert to "+o.to+")":this.param);if(this.param.varArgs)if(this.param.anyType)s.push(t+"if (arguments.length > "+i+") {"),s.push(t+" var varArgs = [];"),s.push(t+" for (var i = "+i+"; i < arguments.length; i++) {"),s.push(t+" varArgs.push(arguments[i]);"),s.push(t+" }"),s.push(this.signature.toCode(n,t+" ")),s.push(t+"}");else{for(var p=function(t,e){for(var s=new Array(t.length),i=0;i<t.length;i++)s[i]=n.add(r(t[i]),"test")+"("+e+")";return s.join(" || ")}.bind(this),h=this.param.types,u=[],f=0;f<h.length;f++)void 0===this.param.conversions[f]&&u.push(h[f]);s.push(t+"if ("+p(h,"arg"+i)+") { "+a),s.push(t+" var varArgs = [arg"+i+"];"),s.push(t+" for (var i = "+(i+1)+"; i < arguments.length; i++) {"),s.push(t+" if ("+p(u,"arguments[i]")+") {"),s.push(t+" varArgs.push(arguments[i]);");for(var f=0;f<h.length;f++){var c=this.param.conversions[f];if(c){var g=n.add(r(h[f]),"test"),v=n.add(c.convert,"convert");s.push(t+" }"),s.push(t+" else if ("+g+"(arguments[i])) {"),s.push(t+" varArgs.push("+v+"(arguments[i]));")}}s.push(t+" } else {"),s.push(t+" throw createError('', arguments.length, i, arguments[i], '"+h.join(",")+"');"),s.push(t+" }"),s.push(t+" }"),s.push(this.signature.toCode(n,t+" ")),s.push(t+"}")}else if(this.param.anyType)s.push(t+"// type: any"),s.push(this._innerCode(n,t,e));else{var l=this.param.types[0],g="any"!==l?n.add(r(l),"test"):null;s.push(t+"if ("+g+"(arg"+i+")) { "+a),s.push(this._innerCode(n,t+" ",e)),s.push(t+"}")}}else s.push(this._innerCode(n,t,e));return s.join("\n")},i.prototype._innerCode=function(r,n,t){var e,s=[];this.signature&&(s.push(n+"if (arguments.length === "+this.path.length+") {"),s.push(this.signature.toCode(r,n+" ")),s.push(n+"}"));var i;for(e=0;e<this.childs.length;e++)if(this.childs[e].param.anyType){i=this.childs[e];break}for(e=0;e<this.childs.length;e++)s.push(this.childs[e].toCode(r,n,i));t&&!this.param.anyType&&s.push(t.toCode(r,n,i));var o=this._exceptions(r,n);return o&&s.push(o),s.join("\n")},i.prototype._exceptions=function(r,n){var t=this.path.length;if(0===this.childs.length)return[n+"if (arguments.length > "+t+") {",n+" throw createError('', arguments.length, "+t+", arguments["+t+"]);",n+"}"].join("\n");for(var e={},s=[],i=0;i<this.childs.length;i++){var o=this.childs[i];if(o.param)for(var a=0;a<o.param.types.length;a++){var p=o.param.types[a];p in e||(e[p]=!0,s.push(p))}}return n+"throw createError('', arguments.length, "+t+", arguments["+t+"], '"+s.join(",")+"');"};var v={"null":function(r){return null===r},undefined:function(r){return void 0===r},"boolean":function(r){return"boolean"==typeof r},number:function(r){return"number"==typeof r},string:function(r){return"string"==typeof r},"function":function(r){return"function"==typeof r},Array:function(r){return Array.isArray(r)},Date:function(r){return r instanceof Date},RegExp:function(r){return r instanceof RegExp},Object:function(r){return"object"==typeof r}},l={},y=[],m={config:l,types:v,conversions:y};return m=u("typed",{Object:function(r){return u(null,r)},"string, Object":u,"string, function":function(r,n){var t={};return t[r]=n,u(n.name||null,t)},"string, string, function":function(r,n,t){var e={};return e[n]=t,u(r,e)},"...function":function(r){for(var n,t="",e={},s=0;s<r.length;s++){var i=r[s];if("object"!=typeof i.signatures)throw n=new TypeError("Function is no typed-function (index: "+s+")"),n.data={index:s},n;for(var o in i.signatures)if(i.signatures.hasOwnProperty(o)){if(e.hasOwnProperty(o))throw n=new Error('Signature "'+o+'" is defined twice'),n.data={signature:o},n;e[o]=i.signatures[o]}if(""!=i.name)if(""==t)t=i.name;else if(t!=i.name)throw n=new Error("Function names do not match (expected: "+t+", actual: "+i.name+")"),n.data={actual:i.name,expected:t},n}return u(t,e)}}),m.config=l,m.types=v,m.conversions=y,m});