react 0.5.0 → 0.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.travis.yml +4 -0
- package/Jakefile.js +39 -0
- package/README.md +18 -26
- package/browser-test/dist.html +89 -0
- package/browser-test/index.html +85 -0
- package/browser-test/min.html +89 -0
- package/dist/react.js +3093 -0
- package/dist/react.min.js +1 -0
- package/doc/advanced.md +7 -2
- package/doc/simple.dot +25 -0
- package/doc/simple.png +0 -0
- package/examples/{default1.js → longer-example.js} +0 -0
- package/examples/{default-simple.js → simple.js} +0 -0
- package/examples/{ast1.js → using-ast-directly.js} +4 -0
- package/examples/{default-events1.js → using-events1.js} +1 -1
- package/examples/{default-log-events.js → using-log-events.js} +0 -0
- package/lib/base-task.js +116 -110
- package/lib/cb-task.js +71 -67
- package/lib/core.js +118 -107
- package/lib/dsl.js +120 -115
- package/lib/error.js +44 -36
- package/lib/event-collector.js +69 -53
- package/lib/event-manager.js +69 -55
- package/lib/eventemitter.js +20 -0
- package/lib/finalcb-first-task.js +56 -53
- package/lib/finalcb-task.js +55 -51
- package/lib/id.js +18 -6
- package/lib/input-parser.js +49 -41
- package/lib/log-events.js +79 -73
- package/lib/parse.js +34 -25
- package/lib/promise-resolve.js +42 -27
- package/lib/promise-task.js +78 -74
- package/lib/react.js +59 -0
- package/lib/ret-task.js +59 -55
- package/lib/sprintf.js +18 -0
- package/lib/status.js +11 -2
- package/lib/task.js +216 -213
- package/lib/track-tasks.js +72 -58
- package/lib/validate.js +136 -136
- package/lib/vcon.js +78 -69
- package/lib/when-task.js +69 -65
- package/package.json +10 -9
- package/src/dist.build.requirejs +20 -0
- package/test/ast.mocha.js +136 -0
- package/test/cb-task.mocha.js +220 -0
- package/test/core-deferred.mocha.js +143 -0
- package/test/core-when.mocha.js +96 -0
- package/test/core.mocha.js +589 -0
- package/test/dsl.mocha.js +350 -0
- package/test/event-manager.mocha.js +119 -0
- package/test/exec-options.mocha.js +48 -0
- package/test/finalcb-task.mocha.js +58 -0
- package/test/input-parser.mocha.js +86 -0
- package/test/mocha.opts +2 -0
- package/test/module-use.mocha.js +147 -0
- package/test/promise-auto-resolve.mocha.js +68 -0
- package/test/ret-task.mocha.js +220 -0
- package/test/task.mocha.js +42 -0
- package/test/validate-cb-task.mocha.js +100 -0
- package/test/validate-ret-task.mocha.js +110 -0
- package/test/validate.mocha.js +324 -0
- package/test/vcon.mocha.js +193 -0
- package/vendor/chai/chai.js +2038 -0
- package/vendor/jquery/jquery-1.7.1.js +9266 -0
- package/vendor/jquery/jquery-1.7.1.min.js +4 -0
- package/vendor/mocha/mocha.css +135 -0
- package/vendor/mocha/mocha.js +3589 -0
- package/vendor/node/util.js +531 -0
- package/vendor/requirejs/require.js +2053 -0
- package/vendor/requirejs/require.min.js +33 -0
- package/doc/default-simple.dot +0 -19
- package/doc/default-simple.dot.png +0 -0
- package/react.js +0 -40
- package/test/ast.test.js +0 -69
- package/test/cb-task.test.js +0 -197
- package/test/core-deferred.test.js +0 -134
- package/test/core-promised.test.js +0 -132
- package/test/core-when.test.js +0 -84
- package/test/core.test.js +0 -568
- package/test/dsl.test.js +0 -330
- package/test/event-manager.test.js +0 -102
- package/test/exec-options.test.js +0 -33
- package/test/finalcb-task.test.js +0 -38
- package/test/input-parser.test.js +0 -66
- package/test/module-use.test.js +0 -134
- package/test/promise-auto-resolve.test.js +0 -52
- package/test/ret-task.test.js +0 -199
- package/test/task.test.js +0 -21
- package/test/validate-cb-task.test.js +0 -74
- package/test/validate-ret-task.test.js +0 -83
- package/test/validate.test.js +0 -295
- package/test/vcon.test.js +0 -173
|
@@ -0,0 +1 @@
|
|
|
1
|
+
!function(a,b){function e(){this._events=new Object}function f(a){a&&(a.delimiter&&(this.delimiter=a.delimiter),a.wildcard&&(this.wildcard=a.wildcard),this.wildcard&&(this.listenerTree=new Object))}function g(a){this._events=new Object,f.call(this,a)}function h(a,b,c,d){if(!c)return[];var e=[],f,g,i,j,k,l,m,n=b.length,o=b[d],p=b[d+1];if(d===n&&c._listeners){if(typeof c._listeners=="function")return a&&a.push(c._listeners),[c];for(f=0,g=c._listeners.length;f<g;f++)a&&a.push(c._listeners[f]);return[c]}if(o==="*"||o==="**"||c[o]){if(o==="*"){for(i in c)i!=="_listeners"&&c.hasOwnProperty(i)&&(e=e.concat(h(a,b,c[i],d+1)));return e}if(o==="**"){m=d+1===n||d+2===n&&p==="*",m&&c._listeners&&(e=e.concat(h(a,b,c,n)));for(i in c)i!=="_listeners"&&c.hasOwnProperty(i)&&(i==="*"||i==="**"?(c[i]._listeners&&!m&&(e=e.concat(h(a,b,c[i],n))),e=e.concat(h(a,b,c[i],d))):i===p?e=e.concat(h(a,b,c[i],d+2)):e=e.concat(h(a,b,c[i],d)));return e}e=e.concat(h(a,b,c[o],d+1))}j=c["*"],j&&h(a,b,j,d+1),k=c["**"];if(k)if(d<n){k._listeners&&h(a,b,k,n);for(i in k)i!=="_listeners"&&k.hasOwnProperty(i)&&(i===p?h(a,b,k[i],d+2):i===o?h(a,b,k[i],d+1):(l={},l[i]=k[i],h(a,b,{"**":l},d+1)))}else k._listeners?h(a,b,k,n):k["*"]&&k["*"]._listeners&&h(a,b,k["*"],n);return e}function i(a,b){a=typeof a=="string"?a.split(this.delimiter):a.slice();for(var e=0,f=a.length;e+1<f;e++)if(a[e]==="**"&&a[e+1]==="**")return;var g=this.listenerTree,h=a.shift();while(h){g[h]||(g[h]=new Object),g=g[h];if(a.length===0){if(!g._listeners)g._listeners=b;else if(typeof g._listeners=="function")g._listeners=[g._listeners,b];else if(c(g._listeners)){g._listeners.push(b);if(!g._listeners.warned){var i=d;typeof this._events.maxListeners!="undefined"&&(i=this._events.maxListeners),i>0&&g._listeners.length>i&&(g._listeners.warned=!0,console.error("(node) warning: possible EventEmitter memory leak detected. %d listeners added. Use emitter.setMaxListeners() to increase limit.",g._listeners.length),console.trace())}}return!0}h=a.shift()}return!0}var c=Array.isArray?Array.isArray:function(b){return Object.prototype.toString.call(b)==="[object Array]"},d=10;g.prototype.delimiter=".",g.prototype.setMaxListeners=function(a){this._events||e.call(this),this._events.maxListeners=a},g.prototype.event="",g.prototype.once=function(a,b){return this.many(a,1,b),this},g.prototype.many=function(a,b,c){function e(){--b===0&&d.off(a,e),c.apply(this,arguments)}var d=this;if(typeof c!="function")throw new Error("many only accepts instances of Function");return e._origin=c,this.on(a,e),d},g.prototype.emit=function(){this._events||e.call(this);var a=arguments[0];if(a==="newListener"&&!this._events.newListener)return!1;if(this._all){var b=arguments.length,c=new Array(b-1);for(var d=1;d<b;d++)c[d-1]=arguments[d];for(d=0,b=this._all.length;d<b;d++)this.event=a,this._all[d].apply(this,c)}if(a==="error"&&!this._all&&!this._events.error&&(!this.wildcard||!this.listenerTree.error))throw arguments[1]instanceof Error?arguments[1]:new Error("Uncaught, unspecified 'error' event.");var f;if(this.wildcard){f=[];var g=typeof a=="string"?a.split(this.delimiter):a.slice();h.call(this,f,g,this.listenerTree,0)}else f=this._events[a];if(typeof f=="function"){this.event=a;if(arguments.length===1)f.call(this);else if(arguments.length>1)switch(arguments.length){case 2:f.call(this,arguments[1]);break;case 3:f.call(this,arguments[1],arguments[2]);break;default:var b=arguments.length,c=new Array(b-1);for(var d=1;d<b;d++)c[d-1]=arguments[d];f.apply(this,c)}return!0}if(f){var b=arguments.length,c=new Array(b-1);for(var d=1;d<b;d++)c[d-1]=arguments[d];var i=f.slice();for(var d=0,b=i.length;d<b;d++)this.event=a,i[d].apply(this,c);return i.length>0||this._all}return this._all},g.prototype.on=function(a,b){if(typeof a=="function")return this.onAny(a),this;if(typeof b!="function")throw new Error("on only accepts instances of Function");this._events||e.call(this),this.emit("newListener",a,b);if(this.wildcard)return i.call(this,a,b),this;if(!this._events[a])this._events[a]=b;else if(typeof this._events[a]=="function")this._events[a]=[this._events[a],b];else if(c(this._events[a])){this._events[a].push(b);if(!this._events[a].warned){var f=d;typeof this._events.maxListeners!="undefined"&&(f=this._events.maxListeners),f>0&&this._events[a].length>f&&(this._events[a].warned=!0,console.error("(node) warning: possible EventEmitter memory leak detected. %d listeners added. Use emitter.setMaxListeners() to increase limit.",this._events[a].length),console.trace())}}return this},g.prototype.onAny=function(a){this._all||(this._all=[]);if(typeof a!="function")throw new Error("onAny only accepts instances of Function");return this._all.push(a),this},g.prototype.addListener=g.prototype.on,g.prototype.off=function(a,b){if(typeof b!="function")throw new Error("removeListener only takes instances of Function");var d,e=[];if(this.wildcard){var f=typeof a=="string"?a.split(this.delimiter):a.slice();e=h.call(this,null,f,this.listenerTree,0)}else{if(!this._events[a])return this;d=this._events[a],e.push({_listeners:d})}for(var g=0;g<e.length;g++){var i=e[g];d=i._listeners;if(c(d)){var j=-1;for(var k=0,l=d.length;k<l;k++)if(d[k]===b||d[k].listener&&d[k].listener===b||d[k]._origin&&d[k]._origin===b){j=k;break}if(j<0)return this;this.wildcard?i._listeners.splice(j,1):this._events[a].splice(j,1),d.length===0&&(this.wildcard?delete i._listeners:delete this._events[a])}else if(d===b||d.listener&&d.listener===b||d._origin&&d._origin===b)this.wildcard?delete i._listeners:delete this._events[a]}return this},g.prototype.offAny=function(a){var b=0,c=0,d;if(a&&this._all&&this._all.length>0){d=this._all;for(b=0,c=d.length;b<c;b++)if(a===d[b])return d.splice(b,1),this}else this._all=[];return this},g.prototype.removeListener=g.prototype.off,g.prototype.removeAllListeners=function(a){if(arguments.length===0)return!this._events||e.call(this),this;if(this.wildcard){var b=typeof a=="string"?a.split(this.delimiter):a.slice(),c=h.call(this,null,b,this.listenerTree,0);for(var d=0;d<c.length;d++){var f=c[d];f._listeners=null}}else{if(!this._events[a])return this;this._events[a]=null}return this},g.prototype.listeners=function(a){if(this.wildcard){var b=[],d=typeof a=="string"?a.split(this.delimiter):a.slice();return h.call(this,b,d,this.listenerTree,0),b}return this._events||e.call(this),this._events[a]||(this._events[a]=[]),c(this._events[a])||(this._events[a]=[this._events[a]]),this._events[a]},g.prototype.listenersAny=function(){return this._all?this._all:[]},typeof define=="function"&&define.amd?define("eventemitter2",[],function(){return g}):a.EventEmitter2=g}(typeof process!="undefined"&&typeof process.title!="undefined"&&typeof exports!="undefined"?exports:window),define("react/eventemitter",["eventemitter2"],function(a){var b=a?a.EventEmitter2?a.EventEmitter2:a:EventEmitter2;return b}),define("util",["require","exports","module"],function(a,b,c){function f(a,b,c,d){var e={showHidden:b,seen:[],stylize:d?i:j};return k(e,a,typeof c=="undefined"?2:c)}function i(a,b){var c=h[b];return c?"["+g[c][0]+"m"+a+"["+g[c][1]+"m":a}function j(a,b){return a}function k(a,c,d){if(c&&typeof c.inspect=="function"&&c.inspect!==b.inspect&&(!c.constructor||c.constructor.prototype!==c))return c.inspect(d);var e=l(a,c);if(e)return e;var f=Object.keys(c),g=a.showHidden?Object.getOwnPropertyNames(c):f;if(g.length===0){if(typeof c=="function"){var h=c.name?": "+c.name:"";return a.stylize("[Function"+h+"]","special")}if(r(c))return a.stylize(RegExp.prototype.toString.call(c),"regexp");if(s(c))return a.stylize(Date.prototype.toString.call(c),"date");if(t(c))return m(c)}var i="",j=!1,k=["{","}"];q(c)&&(j=!0,k=["[","]"]);if(typeof c=="function"){var u=c.name?": "+c.name:"";i=" [Function"+u+"]"}r(c)&&(i=" "+RegExp.prototype.toString.call(c)),s(c)&&(i=" "+Date.prototype.toUTCString.call(c)),t(c)&&(i=" "+m(c));if(g.length!==0||!!j&&c.length!==0){if(d<0)return r(c)?a.stylize(RegExp.prototype.toString.call(c),"regexp"):a.stylize("[Object]","special");a.seen.push(c);var v;return j?v=n(a,c,d,f,g):v=g.map(function(b){return o(a,c,d,f,b,j)}),a.seen.pop(),p(v,i,k)}return k[0]+i+k[1]}function l(a,b){switch(typeof b){case"undefined":return a.stylize("undefined","undefined");case"string":var c="'"+JSON.stringify(b).replace(/^"|"$/g,"").replace(/'/g,"\\'").replace(/\\"/g,'"')+"'";return a.stylize(c,"string");case"number":return a.stylize(""+b,"number");case"boolean":return a.stylize(""+b,"boolean")}if(b===null)return a.stylize("null","null")}function m(a){return"["+Error.prototype.toString.call(a)+"]"}function n(a,b,c,d,e){var f=[];for(var g=0,h=b.length;g<h;++g)Object.prototype.hasOwnProperty.call(b,String(g))?f.push(o(a,b,c,d,String(g),!0)):f.push("");return e.forEach(function(e){e.match(/^\d+$/)||f.push(o(a,b,c,d,e,!0))}),f}function o(a,b,c,d,e,f){var g,h,i;i=Object.getOwnPropertyDescriptor(b,e)||{value:b[e]},i.get?i.set?h=a.stylize("[Getter/Setter]","special"):h=a.stylize("[Getter]","special"):i.set&&(h=a.stylize("[Setter]","special")),d.indexOf(e)<0&&(g="["+e+"]"),h||(a.seen.indexOf(i.value)<0?(c===null?h=k(a,i.value,null):h=k(a,i.value,c-1),h.indexOf("\n")>-1&&(f?h=h.split("\n").map(function(a){return" "+a}).join("\n").substr(2):h="\n"+h.split("\n").map(function(a){return" "+a}).join("\n"))):h=a.stylize("[Circular]","special"));if(typeof g=="undefined"){if(f&&e.match(/^\d+$/))return h;g=JSON.stringify(""+e),g.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)?(g=g.substr(1,g.length-2),g=a.stylize(g,"name")):(g=g.replace(/'/g,"\\'").replace(/\\"/g,'"').replace(/(^"|"$)/g,"'"),g=a.stylize(g,"string"))}return g+": "+h}function p(a,b,c){var d=0,e=a.reduce(function(a,b){return d++,b.indexOf("\n")>=0&&d++,a+b.length+1},0);return e>60?c[0]+(b===""?"":b+"\n ")+" "+a.join(",\n ")+" "+c[1]:c[0]+b+" "+a.join(", ")+" "+c[1]}function q(a){return Array.isArray(a)||typeof a=="object"&&u(a)==="[object Array]"}function r(a){return typeof a=="object"&&u(a)==="[object RegExp]"}function s(a){return typeof a=="object"&&u(a)==="[object Date]"}function t(a){return typeof a=="object"&&u(a)==="[object Error]"}function u(a){return Object.prototype.toString.call(a)}function v(a){return a<10?"0"+a.toString(10):a.toString(10)}function x(){var a=new Date,b=[v(a.getHours()),v(a.getMinutes()),v(a.getSeconds())].join(":");return[a.getDate(),w[a.getMonth()],b].join(" ")}var d=/%[sdj%]/g;b.format=function(a){if(typeof a!="string"){var b=[];for(var c=0;c<arguments.length;c++)b.push(f(arguments[c]));return b.join(" ")}var e=1,g=arguments,h=g.length,i=String(a).replace(d,function(a){if(a==="%%")return"%";if(e>=h)return a;switch(a){case"%s":return String(g[e++]);case"%d":return Number(g[e++]);case"%j":return JSON.stringify(g[e++]);default:return a}});for(var j=g[e];e<h;j=g[++e])j===null||typeof j!="object"?i+=" "+j:i+=" "+f(j);return i},b.print=function(){for(var a=0,b=arguments.length;a<b;++a)process.stdout.write(String(arguments[a]))},b.puts=function(){for(var a=0,b=arguments.length;a<b;++a)process.stdout.write(arguments[a]+"\n")},b.debug=function(a){process.stderr.write("DEBUG: "+a+"\n")};var e=b.error=function(a){for(var b=0,c=arguments.length;b<c;++b)process.stderr.write(arguments[b]+"\n")};b.inspect=f;var g={bold:[1,22],italic:[3,23],underline:[4,24],inverse:[7,27],white:[37,39],grey:[90,39],black:[30,39],blue:[34,39],cyan:[36,39],green:[32,39],magenta:[35,39],red:[31,39],yellow:[33,39]},h={special:"cyan",number:"yellow","boolean":"yellow","undefined":"grey","null":"bold",string:"green",date:"magenta",regexp:"red"};b.isArray=q,b.isRegExp=r,b.isDate=s,b.isError=t;var w=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];b.log=function(a){b.puts(x()+" - "+a.toString())},b.pump=function(a,b,c){function e(a,b,e){c&&!d&&(c(a,b,e),d=!0)}var d=!1;a.addListener("data",function(c){b.write(c)===!1&&a.pause()}),b.addListener("drain",function(){a.resume()}),a.addListener("end",function(){b.end()}),a.addListener("close",function(){e()}),a.addListener("error",function(a){b.end(),e(a)}),b.addListener("error",function(b){a.destroy(),e(b)})},b.inherits=function(a,b){a.super_=b,a.prototype=Object.create(b.prototype,{constructor:{value:a,enumerable:!1,writable:!0,configurable:!0}})},b._extend=function(a,b){if(!b)return a;var c=Object.keys(b),d=c.length;while(d--)a[c[d]]=b[c[d]];return a}}),define("react/error",["util"],function(a){function b(a){if(!Error.stackTraceLimit||Error.stackTraceLimit<a)Error.stackTraceLimit=a}function c(a){return a?a&&a.name?a.name:a:"undefined"}function d(b){if(!b.meta)return;var d=b.meta.vcon,e=b.meta.task,f="\n\n";return e&&e.f&&e.a&&(f+="Error occurs in Task function: "+c(e.f)+"("+e.a.join(",")+")\n\n"),d&&(f+="Variable Context: \n",f+=a.inspect(d),f+="\n\n"),e&&e.f&&(f+="Task Source:\n\n",f+=e.f.toString(),f+="\n\n"),f}function e(a,b){typeof a=="string"&&(a=new Error(a));var c=a.toString();return a.meta=b,a.toString=function(){return c+d(a)},a}return{ensureStackTraceLimitSet:b,augmentError:e}}),function(a,b){typeof exports=="object"?module.exports=b():typeof define=="function"&&define.amd?define("ensure-array",[],b):a.ensureArray=b()}(this,function(){function a(a,b,c){if(arguments.length===0)return[];if(arguments.length===1){if(a===undefined||a===null)return[];if(Array.isArray(a))return a}return Array.prototype.slice.call(arguments)}return a}),define("react/status",[],function(){var a={READY:"ready",RUNNING:"running",ERRORED:"errored",COMPLETE:"complete"};return a}),define("react/vcon",[],function(){function b(){}var a=":LAST_RESULTS";return b.prototype.getLastResults=function(){return this.getVar(a)},b.prototype.setLastResults=function(b){this.setVar(a,b)},b.prototype.getVar=function(a){var b=this.values;if(typeof a!="string")return a;a=a.trim();if(a==="true")return!0;if(a==="false")return!1;if(a==="null")return null;if(/^-?[0-9]+$/.test(a))return parseInt(a,10);if(/^-?[0-9.]+$/.test(a))return parseFloat(a);var c=/^("|')([^\1]*)\1$/.exec(a);if(c)return c[2];var d=a.split(".");return d.reduce(function(a,b){return a===undefined||a===null?undefined:a[b]},b)},b.prototype.saveResults=function(a,b){var c=this;a.forEach(function(a,d){c.setVar(a,b[d]!==undefined?b[d]:null)}),this.setLastResults(b)},b.prototype.setVar=function(a,b){if(!a)return;var c=this.values,d=a.split("."),e=d.pop(),f=d.reduce(function(a,b){var c=a[b];if(c===undefined||c===null)c=a[b]={};return c},c);f[e]=b},b.create=function(a,c,d,e){var f={};e&&(f["this"]=e),d&&Object.keys(d).forEach(function(a){f[a]=d[a]});var g=new b;return g.values=a.reduce(function(a,b,d){var e=c[d];return e&&(a[e]=b!==undefined?b:null),a},f),g},b}),define("react/event-manager",["./eventemitter"],function(a){function e(){}var b={wildcard:!0,delimiter:".",maxListeners:30},c=/^ast.defined$/,d={AST_DEFINED:"ast.defined",FLOW_BEGIN:"flow.begin",TASK_BEGIN:"task.begin",TASK_COMPLETE:"task.complete",TASK_ERRORED:"task.errored",FLOW_COMPLETE:"flow.complete",FLOW_ERRORED:"flow.errored",EXEC_FLOW_START:"exec.flow.start",EXEC_INPUT_PREPROCESS:"exec.input.preprocess",EXEC_TASKS_PRECREATE:"exec.tasks.precreate",EXEC_OUTTASK_CREATE:"exec.outTask.create",EXEC_TASK_START:"exec.task.start",EXEC_TASK_COMPLETE:"exec.task.complete",EXEC_TASK_ERRORED:"exec.task.errored",EXEC_FLOW_COMPLETE:"exec.flow.complete",EXEC_FLOW_ERRORED:"exec.flow.errored"};return e.create=function(){return new e},e.TYPES=d,e.prototype.TYPES=d,e.prototype.isEnabled=function(){return!!(this.emitter||this.parent&&this.parent.isEnabled())},e.prototype.on=function(c,d){this.emitter||(this.emitter=new a(b)),c==="*"?this.emitter.onAny(d):this.emitter.on(c,d)},e.prototype.emit=function(a,b,d,e){if(a===undefined)throw new Error("event is undefined");this.emitter&&this.emitter.emit.apply(this.emitter,arguments),this.parent&&this.parent.isEnabled()&&this.parent.emit.apply(this.parent,arguments),c.test(a)&&typeof process!="undefined"&&process.emit&&process.emit.apply(process,arguments)},e.prototype.removeListener=function(a,b){this.emitter&&this.emitter.removeListener.apply(this.emitter,arguments)},e.global=e.create(),e}),define("react/base-task",["ensure-array","./status","./event-manager"],function(a,b,c){function d(){}function e(a){return a.indexOf(".")!==-1}return d.prototype.getOutParams=function(){return a(this.out)},d.prototype.isComplete=function(){return this.status===b.COMPLETE},d.prototype.start=function(a){this.args=a,this.env.currentTask=this,this.env.flowEmitter.emit(c.TYPES.EXEC_TASK_START,this)},d.prototype.complete=function(a){this.status=b.COMPLETE,this.results=a,this.env.currentTask=this,this.env.flowEmitter.emit(c.TYPES.EXEC_TASK_COMPLETE,this)},d.prototype.functionExists=function(a){var b=this.f;if(!b)return!1;if(b instanceof Function)return!0;if(typeof b=="string"){var c=a.getVar(b);if(c&&c instanceof Function)return!0}return!1},d.prototype.areAllDepArgsDefined=function(a){return this.a.every(function(b){return a.getVar(b)!==undefined})},d.prototype.depTasksAreDone=function(a){return!this.after||!this.after.length||this.after.every(function(b){return a[b].isComplete()})},d.prototype.parentExists=function(a,b){if(!e(a))return!0;var c=a.split(".");c.pop();var d=c.reduce(function(a,b){return a===undefined||a===null?undefined:a[b]},b.values);return d!==undefined&&d!==null},d.prototype.outParentsExist=function(a){var b=this;return this.getOutParams().every(function(c){return c===null?!0:b.parentExists(c,a)})},d.prototype.isReady=function(a,b){return!this.status&&this.functionExists(a)&&this.areAllDepArgsDefined(a)&&this.depTasksAreDone(b)&&(!this.outParentsExist||this.outParentsExist(a))},d.prototype.isMethodCall=function(){return typeof this.f=="string"&&/^.*\..*$/.test(this.f)},d.prototype.getMethodObj=function(a){var b=this.f;if(!b)return undefined;var c=b.split(".");c.pop();if(!c.length)return undefined;var d=c.reduce(function(a,b){return a===undefined||a===null?undefined:a[b]},a.values);return d},d}),define("react/input-parser",["./event-manager"],function(a){function d(a){return a&&a.reactExecOptions}function e(a){return d(a)}function f(a){return!d(a)}function g(a,b){return Object.keys(b).forEach(function(c){a[c]=b[c]}),a}function h(a,b,d){var e={};return e.args=b.map(function(b){return a.shift()}),d===c.CALLBACK&&a.length&&(e.cb=a.shift()),e.extra=a,e}function i(c,d){var i={},j=c.filter(e);j.unshift(b),i.options=j.reduce(g,{});var k=c.filter(f),l=h(k,d.inParams,i.options.outputStyle);return i.args=l.args,i.cb=l.cb,l.outputStyle&&(i.options.outputStyle=l.outputStyle),l.extra&&(i.extraArgs=l.extra),a.global.emit(a.TYPES.EXEC_INPUT_PREPROCESS,i),i}var b={reactExecOptions:!0,outputStyle:"cb"},c={CALLBACK:"cb",NONE:"none"};return i.defaultExecOptions=b,i}),define("react/id",[],function(){function b(){return a+=1,a===Number.MAX_VALUE&&(a=0),a}var a=0;return{createUniqueId:b}}),define("react/sprintf",["util"],function(a){var b=a.format;return b}),define("react/cb-task",["util","./sprintf","./base-task"],function(a,b,c){function d(c,d){return b("%s - %s",c,a.inspect(d))}function i(a){var b=this;Object.keys(a).forEach(function(c){b[c]=a[c]})}var e="cbTask requires f, a, out",f="cbTask requires f to be a function or string",g="cbTask requires a to be an array of string param names",h="cbTask requires out to be an array of string param names";return i.prototype=new c,i.prototype.constructor=i,i.validate=function(a){var b=[];if(!a.f||!a.a||!a.out)b.push(d(e,a));else{var c=typeof a.f;a.f instanceof Function||c==="string"||b.push(d(f,a)),(!Array.isArray(a.a)||!a.a.every(function(a){return typeof a=="string"}))&&b.push(d(g,a)),(!Array.isArray(a.out)||!a.out.every(function(a){return typeof a=="string"}))&&b.push(d(h,a))}return b},i.prototype.prepare=function(b,c,d){var e=this;this.cbFun=function(a,f,g,h){var i=Array.prototype.slice.call(arguments,1);if(a){b(e,a);return}c.saveResults(e.out,i),e.complete(i),d()}},i.prototype.exec=function(b,c,d){try{var e=this.a.map(function(a){return b.getVar(a)});this.start(e),e.push(this.cbFun);var f=this.f,g=b.getVar("this");this.isMethodCall()?(f=b.getVar(this.f),g=this.getMethodObj(b)):typeof f=="string"&&(f=b.getVar(f)),f.apply(g,e)}catch(h){c(this,h)}},i}),define("react/promise-task",["util","./sprintf","./base-task"],function(a,b,c){function d(c,d){return b("%s - %s",c,a.inspect(d))}function i(a){var b=this;Object.keys(a).forEach(function(c){b[c]=a[c]})}var e="promiseTask requires f, a, out",f="promiseTask requires f to be a function or string",g="promiseTask requires a to be an array of string param names",h="promiseTask requires out to be an array[1] of string param names";return i.prototype=new c,i.prototype.constructor=i,i.validate=function(a){var b=[];if(!a.f||!a.a||!a.out)b.push(d(e,a));else{var c=typeof a.f;a.f instanceof Function||c==="string"||b.push(d(f,a)),(!Array.isArray(a.a)||!a.a.every(function(a){return typeof a=="string"}))&&b.push(d(g,a)),Array.isArray(a.out)&&a.out.length<=1&&a.out.every(function(a){return typeof a=="string"})||b.push(d(h,a))}return b},i.prototype.prepare=function(b,c,d){var e=this;this.nextFn=function(a){var b=Array.prototype.slice.call(arguments);c.saveResults(e.out,b),e.complete(b),d()},this.failFn=function(a){b(e,a)}},i.prototype.exec=function(b,c,d){try{var e=this.a.map(function(a){return b.getVar(a)});this.start(e);var f=this.f,g=b.getVar("this");this.isMethodCall()?(f=b.getVar(this.f),g=this.getMethodObj(b)):typeof f=="string"&&(f=b.getVar(f));var h=f.apply(g,e);h&&typeof h.then=="function"?h.then(this.nextFn,this.failFn):this.nextFn(h)}catch(i){c(this,i)}},i}),define("react/ret-task",["util","./sprintf","./base-task"],function(a,b,c){function d(c,d){return b("%s - %s",c,a.inspect(d))}function i(a){var b=this;Object.keys(a).forEach(function(c){b[c]=a[c]})}var e="retTask requires f, a, out",f="retTask requires f to be a function or string",g="retTask requires a to be an array of string param names",h="retTask requires out to be an array with single string param name or []";return i.prototype=new c,i.prototype.constructor=i,i.validate=function(a){var b=[];if(!a.f||!a.a||!a.out)b.push(d(e,a));else{var c=typeof a.f;a.f instanceof Function||c==="string"||b.push(d(f,a)),(!Array.isArray(a.a)||!a.a.every(function(a){return typeof a=="string"}))&&b.push(d(g,a)),(!Array.isArray(a.out)||!(a.out.length===0||a.out.length===1&&typeof (a.out[0]==="string")))&&b.push(d(h,a))}return b},i.prototype.exec=function(b,c,d){try{var e=this.a.map(function(a){return b.getVar(a)});this.start(e);var f=this.f,g=b.getVar("this");this.isMethodCall()?(f=b.getVar(this.f),g=this.getMethodObj(b)):typeof f=="string"&&(f=b.getVar(f));var h=[f.apply(g,e)];b.saveResults(this.out,h),this.complete(h),d()}catch(i){c(this,i)}},i}),define("react/when-task",["util","./sprintf","./base-task"],function(a,b,c){function d(c,d){return b("%s - %s",c,a.inspect(d))}function h(a){var b=this;Object.keys(a).forEach(function(c){b[c]=a[c]})}var e="whenTask requires a, out",f="whenTask requires a to be an array[1] of string param names",g="whenTask requires out to be an array[1] of string param names";return h.prototype=new c,h.prototype.constructor=h,h.prototype.f=function(){},h.validate=function(a){var b=[];return!a.a||!a.out?b.push(d(e,a)):((!Array.isArray(a.a)||a.a.length!==1||!a.a.every(function(a){return typeof a=="string"}))&&b.push(d(f,a)),Array.isArray(a.out)&&a.out.length<=1&&a.out.every(function(a){return typeof a=="string"})||b.push(d(g,a))),b},h.prototype.prepare=function(b,c,d){var e=this;this.nextFn=function(a){var b=Array.prototype.slice.call(arguments);c.saveResults(e.out,b),e.complete(b),d()},this.failFn=function(a){b(e,a)}},h.prototype.exec=function(b,c,d){try{var e=this.a.map(function(a){return b.getVar(a)});this.start(e);var f=e[0];f&&typeof f.then=="function"?f.then(this.nextFn,this.failFn):this.nextFn(f)}catch(g){c(this,g)}},h}),define("react/finalcb-task",["./sprintf","util","./status","./event-manager"],function(a,b,c,d){function f(a){var b=a.taskDef;if(typeof a.cbFunc!="function")throw new Error("callback is not a function");var c=this;for(var d in b)c[d]=b[d];this.f=a.cbFunc,this.tasks=a.tasks,this.vCon=a.vCon,this.retValue=a.retValue,this.execOptions=a.execOptions,this.env=a.env}function g(c,d){return a("%s - %s",c,b.inspect(d))}var e="ast.outTask.a should be an array of string param names";return f.validate=function(a){var b=[];return(!Array.isArray(a.a)||!a.a.every(function(a){return typeof a=="string"}))&&b.push(g(e,a)),b},f.prototype.isReady=function(){return this.tasks.every(function(a){return a.status===c.COMPLETE})},f.prototype.exec=function(a){if(!this.f)return;if(a)this.env.error=a,this.env.flowEmitter.emit(d.TYPES.EXEC_FLOW_ERRORED,this.env),this.f.call(null,a);else{var b=this.vCon,c=this.a.map(function(a){return b.getVar(a)});c.unshift(null),this.env.results=c,this.env.flowEmitter.emit(d.TYPES.EXEC_FLOW_COMPLETE,this.env),this.f.apply(null,c)}this.f=null},f}),define("react/finalcb-first-task",["./sprintf","util","./status","./vcon","./event-manager"],function(a,b,c,d,e){function g(a){var b=a.taskDef;if(typeof a.cbFunc!="function")throw new Error("callback is not a function");var c=this;for(var d in b)c[d]=b[d];this.f=a.cbFunc,this.tasks=a.tasks,this.vCon=a.vCon,this.retValue=a.retValue,this.env=a.env}function h(c,d){return a("%s - %s",c,b.inspect(d))}var f="ast.outTask.a should be an array of string param names";return g.validate=function(a){var b=[];return(!Array.isArray(a.a)||!a.a.every(function(a){return typeof a=="string"}))&&b.push(h(f,a)),b},g.prototype.isReady=function(){var a=this.vCon.getLastResults();return a?a.some(function(a){return a!==undefined&&a!==null}):!1},g.prototype.exec=function(a){if(!this.f)return;if(a)this.env.error=a,this.env.flowEmitter.emit(e.TYPES.EXEC_FLOW_ERRORED,this.env),this.f.call(null,a);else{var b=this.vCon,c=this.a.map(function(a){return b.getVar(a)});c.unshift(null),this.env.results=c,this.env.flowEmitter.emit(e.TYPES.EXEC_FLOW_COMPLETE,this.env),this.f.apply(null,c)}this.f=null},g}),define("react/task",["util","./sprintf","ensure-array","./cb-task","./promise-task","./ret-task","./when-task","./finalcb-task","./finalcb-first-task","./status","./error","./vcon","./event-manager"],function(a,b,c,d,e,f,g,h,i,j,k,l,m){function p(){return Object.keys(n)}function r(){return Object.keys(q)}function w(c,d){return b("%s - %s",c,a.inspect(d))}function x(a){return a.type?a:(a.type="cb",a)}function y(a){a.type||(a.type=Object.keys(q)[0])}function z(a){if(!a.after)return;var b=c(a.after);b=b.map(function(a){return typeof a=="function"?a.name:a}),a.after=b}function A(a){if(!a||typeof a!="object")return[w(t,a)];x(a),z(a);var b=[];return b=b.concat(B(a)),b=b.concat(C(a)),b}function B(a){var b=[];return Object.keys(n).some(function(b){return a.type===b})||b.push(w(v,a)),b}function C(a){var b=[],c=n[a.type];return c&&(b=b.concat(c.validate(a))),b}function D(a){var b=[];y(a);var c=q[a.type];return b=b.concat(c.validate(a)),b}function E(a,c,d){function f(){}var e=[],g=a.map(function(a){return f}),h=l.create(g,a,d),i=c.map(H),j=i.filter(function(a){return a.type!=="when"});return j.forEach(function(a,c){if(!a.functionExists(h))if(!a.isMethodCall())e.push(b(s,a.f,c));else{var d=a.getMethodObj(h);d&&d!==f&&e.push(b(s,a.f,c))}}),e}function F(a){return typeof a=="function"?a.name:a?a:""}function G(a){var c=a.reduce(function(a,b){return b.name&&(a[b.name]=b),a},{});return a.forEach(function(a,d){if(!a.name){var e=F(a.f);e||(e=b(o,d));if(!e||c[e])e=b("%s_%s",e,d);a.name=e,c[e]=a}}),c}function H(a){var b=n[a.type];return new b(a)}function I(a,b,c,d,e,f){y(a);var g={taskDef:a,cbFunc:b,tasks:c,vCon:d,execOptions:e,env:f,TaskConstructor:q[a.type]};m.global.emit(m.TYPES.EXEC_OUTTASK_CREATE,g);var h=g.TaskConstructor;return new h(g)}function J(a,b){return function(d,e){d.status=j.ERRORED,d.error=e,b.env.currentTask=d,b.env.flowEmitter.emit(m.TYPES.EXEC_TASK_ERRORED,d);var f=k.augmentError(e,{task:d,vcon:a});b.exec(f)}}function K(a,b,c){return b.filter(function(b){return b.isReady(a,c)})}function L(a,b,c,d){a.forEach(function(a){a.status=j.READY}),a.forEach(function(a){a.exec(b,c,d)})}function M(a,c,d,e){var f=c.filter(function(a){return a.status===j.RUNNING||a.status===j.READY});if(!f.length){var g=c.filter(function(a){return!a.status}),h=g.map(function(a){return a.name}),i=b(u,h.join(", ")),k={env:e};d(k,new Error(i))}}function N(a,b,c,d,e,f){var g=K(a,b,c);g.length||M(a,b,d,f),L(g,a,d,e)}function O(a){return G(a),a.forEach(function(a,b,c){b!==0&&(a.after=[c[b-1].name])}),a}var n={cb:d,ret:f,promise:e,when:g},o="task_%s",q={finalcb:h,finalcbFirst:i},s="function: %s not found in locals or input params - task[%s]",t="task must be an object",u="no tasks running, flow will not complete, remaining tasks: %s",v="task.type should match one of "+Object.keys(n).join(", ");return{serializeTasks:O,TASK_TYPES:n,taskTypeKeys:p,OUT_TASK_TYPES:q,outTaskTypeKeys:r,setMissingType:x,validate:A,validateOutTask:D,validateLocalFunctions:E,nameTasks:G,create:H,createOutTask:I,createErrorHandler:J,findReadyAndExec:N}}),define("react/validate",["util","./sprintf","ensure-array","./task"],function(a,b,c,d){function m(c,d){return b("%s - %s",c,a.inspect(d))}function n(a){return l.test(a)}function o(a){if(!a||!a.inParams||!a.tasks||!a.outTask)return[e];var b=[];return b=b.concat(p(a.inParams)),b=b.concat(q(a.tasks)),b=b.concat(r(a.tasks)),b=b.concat(d.validateOutTask(a.outTask)),b=b.concat(s(a.locals)),b.length===0&&(a.outTask.type!=="finalcbFirst"&&(b=b.concat(u(a.tasks))),b=b.concat(d.validateLocalFunctions(a.inParams,a.tasks,a.locals)),b=b.concat(v(a))),b}function p(a){return!Array.isArray(a)||!a.every(function(a){return typeof a=="string"})?[f]:[]}function q(a){if(!Array.isArray(a))return[g];var b=[];return a.forEach(function(a){b=b.concat(d.validate(a))}),b}function r(a){if(!Array.isArray(a))return[];var c=[],d=a.filter(function(a){return a.name}),e=d.map(function(a){return a.name});return e.reduce(function(a,d){return a[d]?c.push(b("%s %s",h,d)):a[d]=!0,a},{}),c}function s(a){var b=[];return a===null&&b.push(i),b}function t(a){return c(a.out)}function u(a){var c=[];return a.reduce(function(a,d){return t(d).forEach(function(d){a[d]!==undefined?c.push(b("%s: %s",j,d)):a[d]=!0}),a},{}),c}function v(a){var c=[],d={};return a.locals&&(d=Object.keys(a.locals).reduce(function(a,b){return a[b]=!0,a},d)),a.inParams.reduce(function(a,b){return a[b]=!0,a},d),a.tasks.reduce(function(a,b){return b.out.reduce(function(a,b){return a[b]=!0,a},a)},d),a.tasks.reduce(function(a,c){return c.a.reduce(function(a,c){return!n(c)&&!d[c]&&a.push(b(k,c)),a},a)},c),a.outTask.a.reduce(function(a,c){return!n(c)&&!d[c]&&a.push(b(k,c)),a},c),c}var e="ast must be an object with inParams, tasks, and outTask",f="ast.inParams must be an array of strings",g="ast.tasks must be an array of tasks",h="ast.tasks that specify name need to be unique, duplicate:",i="ast.locals should not be null",j="multiple tasks output the same param, must be unique. param",k="missing or mispelled variable referenced in flow definition: %s",l=/^(true|false|this|null|\-?[0-9\.]+)$|'|"|\./i;return o}),define("react/core",["./eventemitter","./error","./validate","./task","./status","./vcon","./event-manager","./input-parser","./id","./sprintf"],function(a,b,c,d,e,f,g,h,i,j){function m(a){return Object.keys(k).reduce(function(a,b){return a[b]||(a[b]=k[b]),a},a)}function n(){return j("flow_%s",i.createUniqueId())}function o(){function j(b){Object.keys(b).forEach(function(a){e[a]=b[a]});var f=c(e);return f.length||(e.name||(e.name=n()),d.nameTasks(e.tasks)),Object.freeze&&(Object.keys(b).forEach(function(a){typeof b[a]=="object"&&Object.freeze(b[a])}),Object.freeze(b)),a.emit(g.TYPES.AST_DEFINED,e),f}function o(b,c,j,k){function v(){if(!t.f)return;if(t.isReady())return t.exec();d.findReadyAndExec(q,r,s,u,v,o)}var n=Array.prototype.slice.call(arguments),o={execId:i.createUniqueId(),args:n,ast:e,flowEmitter:a};o.name=e.name||o.execId,a.emit(g.TYPES.EXEC_FLOW_START,o);var p=h(n,e),q=f.create(p.args,e.inParams,e.locals,this);o.parsedInput=p,o.options=m(p.options),o.vCon=q,o.taskDefs=e.tasks.slice(),o.outTaskDef=Object.create(e.outTask),l.emit(g.TYPES.EXEC_TASKS_PRECREATE,o);var r=o.taskDefs.map(d.create),s=d.nameTasks(r),t=d.createOutTask(o.outTaskDef,p.cb,r,q,o.options,o),u=d.createErrorHandler(q,t);return r.forEach(function(b){b.id=i.createUniqueId(),b.env=o,b.prepare&&b.prepare(u,q,v,a)}),v(),t.retValue}if(arguments.length)throw new Error("react() takes no args, check API");b.ensureStackTraceLimitSet(k.stackTraceLimitMin);var a=g.create();a.parent=l;var e={name:undefined,inParams:[],tasks:[],outTask:{},locals:{}},p=o;return p.ast=e,p.setAndValidateAST=j,p.events=a,p}var k={stackTraceLimitMin:30},l=g.global;return o.options=k,o.events=l,o}),define("react/parse",["./sprintf"],function(a){function b(a){return a?a.split(",").map(function(a){return a.trim()}).filter(function(a){return a}):[]}function c(a,b){if(typeof a!="string")return a;var c=b.regex?b.regex.exec(a):a.split(b.splitStr);return c?b.fn(c,a):a}function d(b,d,e){var f=d.reduce(c,b);if(typeof f!="string")return f;throw new Error(a(e,b))}return{splitTrimFilterArgs:b,parseStr:d}}),define("react/dsl",["./sprintf","./core","./parse","./task"],function(a,b,c,d){function m(a){return a.length&&a[a.length-1].match(k)&&a.pop(),a}function n(a){return a.length&&a[0].match(l)&&a.shift(),a}function p(a){var b=c.parseStr(a,[o],f);return b.inDef=m(b.inDef),b}function q(b){var c=[],d,e,f;while(b.length>=2){e={},d=b.shift(),f=p(b.shift()),typeof b[0]=="object"&&(e=b.shift()),e.f=d,e.a=f.inDef;var g=f.type;e.out=f.outDef,e.type=g,c.push(e)}if(b.length)throw new Error(a(i,b[0]));return c}function r(a){var b=a.shift()||"",c=a.length&&typeof a[0]=="object"?a.shift():{},d=a,e={inOutParamStr:b,taskDefArr:d,options:c};return e}function s(c,d,f,g){var h=b();if(c&&j.test(c))throw new Error(a(e,c));var i=r(Array.prototype.slice.call(arguments,1)),k=p(i.inOutParamStr),l={name:c,inParams:k.inDef,tasks:q(i.taskDefArr),outTask:{a:k.outDef}};i.options&&Object.keys(i.options).forEach(function(a){l[a]=i.options[a]});var m=h.setAndValidateAST(l);if(m.length){var n=m.join("\n");throw new Error(n)}return h}function t(a,c,e,f){var g=b(),h=r(Array.prototype.slice.call(arguments,1)),i=p(h.inOutParamStr),j=d.serializeTasks(q(h.taskDefArr)),k={name:a,inParams:i.inDef,tasks:j,outTask:{type:"finalcbFirst",a:i.outDef}};h.options&&Object.keys(h.options).forEach(function(a){k[a]=h.options[a]});var l=g.setAndValidateAST(k);if(l.length){var m=l.join("\n");throw new Error(m)}return g}var e="first flow parameter should be the flow name, but found in/out def: %s",f='params in wrong format, wanted "foo, bar, cb -> err, baz" - found: %s',g='callback specified, but first out param was not "err", use for clarity. Found in/out def: %s',h="found err param, but cb/callback is not specified, is this cb-style async or sync function? Found in/out def: %s",i="extra unmatched task arg: %s",j=/\->/,k=/^cb|callback$/i,l=/^err$/i,o={splitStr:"->",fn:function(b,d){var e=c.splitTrimFilterArgs(b[0]),f=e[e.length-1],i=f&&k.test(f)?"cb":"ret",j=c.splitTrimFilterArgs(b[1]),o=j[0];if(i==="cb"&&(!o||!l.test(o)))throw new Error(a(g,d));if(i==="ret"&&o&&l.test(o))throw new Error(a(h,d));return{type:i,inDef:m(e),outDef:n(j)}}};return s.selectFirst=t,s}),define("react/track-tasks",[],function(){function b(b){if(a)return;a=!0,b.events.on(b.events.TYPES.EXEC_FLOW_START,function(a){a.startTime=Date.now(),a.flowEmitter.emit(b.events.TYPES.FLOW_BEGIN,a)}),b.events.on(b.events.TYPES.EXEC_TASK_START,function(a){a.startTime=Date.now(),a.env.flowEmitter.emit(b.events.TYPES.TASK_BEGIN,a)}),b.events.on(b.events.TYPES.EXEC_TASK_COMPLETE,function(a){a.endTime=Date.now(),a.elapsedTime=a.endTime-a.startTime,a.env.flowEmitter.emit(b.events.TYPES.TASK_COMPLETE,a)}),b.events.on(b.events.TYPES.EXEC_TASK_ERRORED,function(a){a.endTime=Date.now(),a.elapsedTime=a.endTime-a.startTime,a.env.flowEmitter.emit(b.events.TYPES.TASK_ERRORED,a)}),b.events.on(b.events.TYPES.EXEC_FLOW_COMPLETE,function(a){a.endTime=Date.now(),a.elapsedTime=a.endTime-a.startTime,a.flowEmitter.emit(b.events.TYPES.FLOW_COMPLETE,a)}),b.events.on(b.events.TYPES.EXEC_FLOW_ERRORED,function(a){a.endTime=Date.now(),a.elapsedTime=a.endTime-a.startTime,a.flowEmitter.emit(b.events.TYPES.FLOW_ERRORED,a)})}var a=!1;return b}),define("react/log-events",["util"],function(a){function f(b){var c=new Date;c.setTime(b.time);var d=b.args.filter(function(a){return typeof a!="function"}),e=c.toISOString();if(this.event==="flow.complete"){var f=b;console.error("%s: %s \tmsecs: %s \n\targs: %s \n\tresults: %s\n",this.event,f.name,f.elapsedTime,a.inspect(d),a.inspect(f.results))}else{var g=b.name,h=b.args;console.error("%s: %s \n\targs: %s\n",this.event,g,a.inspect(d))}}function g(b){var c=new Date;c.setTime(b.time);var d=b.args.filter(function(a){return typeof a!="function"}),e=c.toISOString();if(this.event==="task.complete"){var f=b;console.error("%s: %s:%s \tmsecs: %s \n\targs: %s \n\tresults: %s\n",this.event,f.env.name,f.name,f.elapsedTime,a.inspect(d),a.inspect(f.results))}else{var g=b.name,h=b.args;console.error("%s: %s:%s \n\targs: %s\n",this.event,b.env.name,b.name,a.inspect(d))}}function h(a,b){if(!a)throw new Error("flowFn is required");if(b&&b!=="*"){var h=e.test(b)?f:g;a.events.removeListener(b,h),a.events.on(b,h)}else a.events.removeListener(c,f),a.events.on(c,f),a.events.removeListener(d,g),a.events.on(d,g)}var b={},c="flow.*",d="task.*",e=/^flow\./;return b.logEvents=h,b}),define("react/promise-resolve",[],function(){function c(c){if(b)return;b=!0,c.events.on(c.events.TYPES.EXEC_TASKS_PRECREATE,function(b){var c=b.vCon.values,d=b.ast.inParams.filter(function(a){var b=c[a];return b&&typeof b.then=="function"});d.forEach(function(d){var e=d+a;c[e]=c[d],c[d]=undefined,b.taskDefs.push({type:"when",a:[e],out:[d]})})})}var a="__promise",b=!1;return c}),define("react/event-collector",[],function(){function a(a){function e(){this.events=[]}a.trackTasks();var b=/^ast\./,c=/^task\./,d=/^flow\./;return e.prototype.capture=function(e,f){function i(a){var e={event:this.event,time:Date.now()};d.test(this.event)?e.env=a:c.test(this.event)?e.task=a:b.test(this.event)&&(e.ast=a),h.events.push(e)}!f&&typeof e=="string"?(f=e,e=a):e||(e=a),f||(f="*");var g=e.events,h=this;g.on(f,i)},e.prototype.list=function(){return this.events},e.prototype.clear=function(){this.events=[]},new e}return a}),define("react",["./core","./dsl","./track-tasks","./log-events","./promise-resolve","./event-collector"],function(a,b,c,d,e,f){function h(){e(g)}function i(){c(g)}function j(a,b){return!b&&typeof a=="string"&&(b=a,a=undefined),a||(a=g),i(),d.logEvents(a,b)}function k(){return f(g)}var g=b;return g.options=a.options,g.events=a.events,g.logEvents=j,g.resolvePromises=h,g.trackTasks=i,g.createEventCollector=k,g})
|
package/doc/advanced.md
CHANGED
|
@@ -133,6 +133,7 @@ react.trackTasks(); // turn on flow and task tracking events
|
|
|
133
133
|
|
|
134
134
|
Available Events that can be consumed
|
|
135
135
|
|
|
136
|
+
- ast.defined - ast was defined (receives the ast)
|
|
136
137
|
- flow.begin - flow execution has started (receives a flow env)
|
|
137
138
|
- flow.complete - flow execution has successfully completed (receives a flow env)
|
|
138
139
|
- flow.errored - flow execution has errored (receives a flow env)
|
|
@@ -148,8 +149,8 @@ When developing or debugging it is often useful to accumulate events and then in
|
|
|
148
149
|
To make this easier to accomplish, this plugin provides a simple event accumulator for development use. Note that this accumulator is designed for short term debug use, as it will continue to accumulate events and does not have any size restrictions, it should not be used in production since it will just continue to grow in size unless manually cleared.
|
|
149
150
|
|
|
150
151
|
```javascript
|
|
151
|
-
var
|
|
152
|
-
var collector =
|
|
152
|
+
var react = require('react');
|
|
153
|
+
var collector = react.createEventCollector();
|
|
153
154
|
|
|
154
155
|
collector.capture(); // capture all flow and task events for all react flows
|
|
155
156
|
collector.capture('flow.*'); // capture all flow events for all react flows
|
|
@@ -159,3 +160,7 @@ collector.capture(flowFn, 'flow.*'); // add capture flow events on a flow
|
|
|
159
160
|
var events = collector.list(); // retrieve the list of events
|
|
160
161
|
collector.clear(); // clear the list of events;
|
|
161
162
|
```
|
|
163
|
+
|
|
164
|
+
### External Plugins
|
|
165
|
+
|
|
166
|
+
- https://github.com/jeffbski/react-deferred - integrates jQuery style Deferred/Promises with react, providing automatic promise resolution and optional usage for react functions where by calling without a callback returns a promise.
|
package/doc/simple.dot
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
digraph loadRender {
|
|
2
|
+
loadRender_input [ shape = box, style = filled, fillcolor = aquamarine ];
|
|
3
|
+
fooPath [ style = filled, fillcolor = gainsboro ];
|
|
4
|
+
barPath [ style = filled, fillcolor = gainsboro ];
|
|
5
|
+
barP2 [ style = filled, fillcolor = gainsboro ];
|
|
6
|
+
loadFoo [ shape = box, color = blue, fillcolor = beige, style = filled ];
|
|
7
|
+
foo [ style = filled, fillcolor = gainsboro ];
|
|
8
|
+
loadBar [ shape = box, color = blue, fillcolor = beige, style = filled ];
|
|
9
|
+
bar [ style = filled, fillcolor = gainsboro ];
|
|
10
|
+
render [ shape = box, color = blue, fillcolor = beige, style = filled ];
|
|
11
|
+
renderedOut [ style = filled, fillcolor = gainsboro ];
|
|
12
|
+
loadRender_output [ shape = box, style = filled, fillcolor = aquamarine ];
|
|
13
|
+
loadRender_input -> fooPath;
|
|
14
|
+
loadRender_input -> barPath;
|
|
15
|
+
loadRender_input -> barP2;
|
|
16
|
+
fooPath -> loadFoo;
|
|
17
|
+
loadFoo -> foo;
|
|
18
|
+
barPath -> loadBar;
|
|
19
|
+
barP2 -> loadBar;
|
|
20
|
+
loadBar -> bar;
|
|
21
|
+
foo -> render;
|
|
22
|
+
bar -> render;
|
|
23
|
+
render -> renderedOut;
|
|
24
|
+
renderedOut -> loadRender_output;
|
|
25
|
+
}
|
package/doc/simple.png
ADDED
|
Binary file
|
|
File without changes
|
|
File without changes
|
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
+
/**
|
|
4
|
+
Advanced example using the AST directly which most users will not do.
|
|
5
|
+
For general use, see other examples like simple.js
|
|
6
|
+
*/
|
|
3
7
|
var react = require('../'); // require('react');
|
|
4
8
|
|
|
5
9
|
function load(res, cb) { setTimeout(cb, 100, null, res + '-loaded'); }
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
8
|
var react = require('../'); // require('react');
|
|
9
|
-
|
|
9
|
+
react.trackTasks(); // turn on flow and task tracking events
|
|
10
10
|
|
|
11
11
|
//output events as tasks start and complete
|
|
12
12
|
react.events.on('flow.*', function (obj) {
|
|
File without changes
|
package/lib/base-task.js
CHANGED
|
@@ -1,117 +1,123 @@
|
|
|
1
1
|
'use strict';
|
|
2
|
+
/*global define:true */
|
|
2
3
|
|
|
3
|
-
|
|
4
|
-
var
|
|
5
|
-
var EventManager = require('./event-manager.js');
|
|
6
|
-
|
|
7
|
-
function BaseTask() {
|
|
4
|
+
if (typeof define !== 'function') {
|
|
5
|
+
var define = require('amdefine')(module);
|
|
8
6
|
}
|
|
9
7
|
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
return array(this.out); // ensure array
|
|
15
|
-
};
|
|
16
|
-
|
|
17
|
-
BaseTask.prototype.isComplete = function () {
|
|
18
|
-
return (this.status === STATUS.COMPLETE);
|
|
19
|
-
};
|
|
20
|
-
|
|
21
|
-
BaseTask.prototype.start = function (args) { // mark task as started with args and note time
|
|
22
|
-
/*jshint validthis: true */
|
|
23
|
-
this.args = args;
|
|
24
|
-
this.env.currentTask = this;
|
|
25
|
-
this.env.flowEmitter.emit(EventManager.TYPES.EXEC_TASK_START, this);
|
|
26
|
-
};
|
|
27
|
-
|
|
28
|
-
BaseTask.prototype.complete = function (args) { //args that were used are available
|
|
29
|
-
/*jshint validthis: true */
|
|
30
|
-
this.status = STATUS.COMPLETE;
|
|
31
|
-
this.results = args;
|
|
32
|
-
this.env.currentTask = this;
|
|
33
|
-
this.env.flowEmitter.emit(EventManager.TYPES.EXEC_TASK_COMPLETE, this);
|
|
34
|
-
};
|
|
35
|
-
|
|
36
|
-
BaseTask.prototype.functionExists = function (vCon) {
|
|
37
|
-
var fn = this.f;
|
|
38
|
-
if (!fn) return false;
|
|
39
|
-
if (fn instanceof Function) return true;
|
|
40
|
-
if (typeof(fn) === 'string') {
|
|
41
|
-
var f = vCon.getVar(fn); // fn/method by string
|
|
42
|
-
if (f && f instanceof Function) return true;
|
|
8
|
+
define(['ensure-array', './status', './event-manager'],
|
|
9
|
+
function (array, STATUS, EventManager) {
|
|
10
|
+
|
|
11
|
+
function BaseTask() {
|
|
43
12
|
}
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
};
|
|
55
|
-
|
|
56
|
-
function
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
Getter Fn to retrieveAn array of the output param names for this task.
|
|
16
|
+
*/
|
|
17
|
+
BaseTask.prototype.getOutParams = function () {
|
|
18
|
+
return array(this.out); // ensure array
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
BaseTask.prototype.isComplete = function () {
|
|
22
|
+
return (this.status === STATUS.COMPLETE);
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
BaseTask.prototype.start = function (args) { // mark task as started with args and note time
|
|
26
|
+
/*jshint validthis: true */
|
|
27
|
+
this.args = args;
|
|
28
|
+
this.env.currentTask = this;
|
|
29
|
+
this.env.flowEmitter.emit(EventManager.TYPES.EXEC_TASK_START, this);
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
BaseTask.prototype.complete = function (args) { //args that were used are available
|
|
33
|
+
/*jshint validthis: true */
|
|
34
|
+
this.status = STATUS.COMPLETE;
|
|
35
|
+
this.results = args;
|
|
36
|
+
this.env.currentTask = this;
|
|
37
|
+
this.env.flowEmitter.emit(EventManager.TYPES.EXEC_TASK_COMPLETE, this);
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
BaseTask.prototype.functionExists = function (vCon) {
|
|
41
|
+
var fn = this.f;
|
|
42
|
+
if (!fn) return false;
|
|
43
|
+
if (fn instanceof Function) return true;
|
|
44
|
+
if (typeof(fn) === 'string') {
|
|
45
|
+
var f = vCon.getVar(fn); // fn/method by string
|
|
46
|
+
if (f && f instanceof Function) return true;
|
|
47
|
+
}
|
|
48
|
+
return false;
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
BaseTask.prototype.areAllDepArgsDefined = function (vCon) {
|
|
52
|
+
return this.a.every(function (k) { return (vCon.getVar(k) !== undefined); });
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
BaseTask.prototype.depTasksAreDone = function (tasksByName) {
|
|
56
|
+
return (!this.after || !this.after.length || // no dep tasks OR
|
|
57
|
+
this.after.every(function (n) { return tasksByName[n].isComplete(); })); //all done
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
function isObjProperty(str) { return (str.indexOf('.') !== -1); }
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
check that obj parent is def and not null so writing to obj.prop
|
|
64
|
+
will not fail. ex: 'b.c' checks that b is def and not null.
|
|
65
|
+
Also returns true if not obj.prop but simple var ex: 'b'.
|
|
66
|
+
Tasks will implement outParentsExist() passing each out str
|
|
67
|
+
to this if they want to do this check.
|
|
64
68
|
*/
|
|
65
|
-
BaseTask.prototype.parentExists = function (objPropStr, vCon) {
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
};
|
|
75
|
-
|
|
76
|
-
/**
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
69
|
+
BaseTask.prototype.parentExists = function (objPropStr, vCon) {
|
|
70
|
+
if (!isObjProperty(objPropStr)) return true; // NOT obj prop, just simple arg, ret true
|
|
71
|
+
var nameAndProps = objPropStr.split('.');
|
|
72
|
+
nameAndProps.pop(); // pop off final prop
|
|
73
|
+
var parent = nameAndProps.reduce(function (accObj, prop) {
|
|
74
|
+
if (accObj === undefined || accObj === null) return undefined; // prevent exception
|
|
75
|
+
return accObj[prop];
|
|
76
|
+
}, vCon.values); // vCon['foo']['bar']
|
|
77
|
+
return (parent !== undefined && parent !== null);
|
|
78
|
+
};
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
If params are obj property writes make sure the dst objects
|
|
82
|
+
are defined and not null. cb: ['b.c'] -> b is def and not null.
|
|
83
|
+
If null is specified then param is valid and will be ignored.
|
|
84
|
+
@returns true if all obj prop parents are def and non null
|
|
81
85
|
*/
|
|
82
|
-
BaseTask.prototype.outParentsExist = function (vCon) {
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
};
|
|
89
|
-
|
|
90
|
-
BaseTask.prototype.isReady = function (vCon, tasksByName) {
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
};
|
|
98
|
-
|
|
99
|
-
BaseTask.prototype.isMethodCall = function () {
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
};
|
|
103
|
-
|
|
104
|
-
BaseTask.prototype.getMethodObj = function (vCon) { //obj.prop.prop2, returns obj.prop or undefined
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
};
|
|
116
|
-
|
|
117
|
-
|
|
86
|
+
BaseTask.prototype.outParentsExist = function (vCon) {
|
|
87
|
+
var self = this;
|
|
88
|
+
return this.getOutParams().every(function (x) {
|
|
89
|
+
if (x === null) return true;
|
|
90
|
+
return self.parentExists(x, vCon);
|
|
91
|
+
});
|
|
92
|
+
};
|
|
93
|
+
|
|
94
|
+
BaseTask.prototype.isReady = function (vCon, tasksByName) {
|
|
95
|
+
return !this.status && // not started AND
|
|
96
|
+
this.functionExists(vCon) && // function/method exists AND
|
|
97
|
+
this.areAllDepArgsDefined(vCon) && // all dep vars defined AND
|
|
98
|
+
this.depTasksAreDone(tasksByName) && // all dep tasks are done AND
|
|
99
|
+
(!this.outParentsExist || // (task does not implement outParentsExist method OR
|
|
100
|
+
this.outParentsExist(vCon)); // output parents exists (for obj property writes)
|
|
101
|
+
};
|
|
102
|
+
|
|
103
|
+
BaseTask.prototype.isMethodCall = function () {
|
|
104
|
+
/*jshint regexp: false */
|
|
105
|
+
return (typeof(this.f) === 'string' && /^.*\..*$/.test(this.f)); //str contains .
|
|
106
|
+
};
|
|
107
|
+
|
|
108
|
+
BaseTask.prototype.getMethodObj = function (vCon) { //obj.prop.prop2, returns obj.prop or undefined
|
|
109
|
+
var name = this.f;
|
|
110
|
+
if (!name) return undefined;
|
|
111
|
+
var nameAndProps = name.split('.');
|
|
112
|
+
nameAndProps.pop(); // pop off last one
|
|
113
|
+
if (!nameAndProps.length) return undefined;
|
|
114
|
+
var result = nameAndProps.reduce(function (accObj, prop) {
|
|
115
|
+
if (accObj === undefined || accObj === null) return undefined; // prevent exception
|
|
116
|
+
return accObj[prop];
|
|
117
|
+
}, vCon.values); // vCon['foo']['bar']
|
|
118
|
+
return result;
|
|
119
|
+
};
|
|
120
|
+
|
|
121
|
+
return BaseTask;
|
|
122
|
+
|
|
123
|
+
});
|
package/lib/cb-task.js
CHANGED
|
@@ -1,80 +1,84 @@
|
|
|
1
1
|
'use strict';
|
|
2
|
+
/*global define:true */
|
|
2
3
|
|
|
3
|
-
|
|
4
|
-
var
|
|
4
|
+
if (typeof define !== 'function') {
|
|
5
|
+
var define = require('amdefine')(module);
|
|
6
|
+
}
|
|
5
7
|
|
|
6
|
-
|
|
8
|
+
define(['util', './sprintf', './base-task'], function (util, sprintf, BaseTask) {
|
|
7
9
|
|
|
8
|
-
function format_error(errmsg, obj) {
|
|
9
|
-
|
|
10
|
-
}
|
|
10
|
+
function format_error(errmsg, obj) {
|
|
11
|
+
return sprintf('%s - %s', errmsg, util.inspect(obj));
|
|
12
|
+
}
|
|
11
13
|
|
|
12
|
-
var REQ = 'cbTask requires f, a, out';
|
|
13
|
-
var FN_REQ = 'cbTask requires f to be a function or string';
|
|
14
|
-
var A_REQ = 'cbTask requires a to be an array of string param names';
|
|
15
|
-
var CB_REQ = 'cbTask requires out to be an array of string param names';
|
|
14
|
+
var REQ = 'cbTask requires f, a, out';
|
|
15
|
+
var FN_REQ = 'cbTask requires f to be a function or string';
|
|
16
|
+
var A_REQ = 'cbTask requires a to be an array of string param names';
|
|
17
|
+
var CB_REQ = 'cbTask requires out to be an array of string param names';
|
|
16
18
|
|
|
17
|
-
function CbTask(taskDef) {
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
}
|
|
19
|
+
function CbTask(taskDef) {
|
|
20
|
+
var self = this;
|
|
21
|
+
Object.keys(taskDef).forEach(function (k) { self[k] = taskDef[k]; });
|
|
22
|
+
}
|
|
21
23
|
|
|
22
|
-
CbTask.prototype = new BaseTask();
|
|
23
|
-
CbTask.prototype.constructor = CbTask;
|
|
24
|
+
CbTask.prototype = new BaseTask();
|
|
25
|
+
CbTask.prototype.constructor = CbTask;
|
|
24
26
|
|
|
25
|
-
CbTask.validate = function (taskDef) {
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
27
|
+
CbTask.validate = function (taskDef) {
|
|
28
|
+
var errors = [];
|
|
29
|
+
if (!taskDef.f || !taskDef.a || !taskDef.out) {
|
|
30
|
+
errors.push(format_error(REQ, taskDef));
|
|
31
|
+
} else {
|
|
32
|
+
var ftype = typeof(taskDef.f);
|
|
33
|
+
if (! ((taskDef.f instanceof Function) || (ftype === 'string'))) {
|
|
34
|
+
errors.push(format_error(FN_REQ, taskDef));
|
|
35
|
+
}
|
|
36
|
+
if (! (Array.isArray(taskDef.a) &&
|
|
37
|
+
taskDef.a.every(function (x) { return (typeof(x) === 'string'); }))) {
|
|
38
|
+
errors.push(format_error(A_REQ, taskDef));
|
|
39
|
+
}
|
|
40
|
+
if (! (Array.isArray(taskDef.out) &&
|
|
41
|
+
taskDef.out.every(function (x) { return (typeof(x) === 'string'); }))) {
|
|
42
|
+
errors.push(format_error(CB_REQ, taskDef));
|
|
43
|
+
}
|
|
33
44
|
}
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
errors.push(format_error(A_REQ, taskDef));
|
|
37
|
-
}
|
|
38
|
-
if (! (Array.isArray(taskDef.out) &&
|
|
39
|
-
taskDef.out.every(function (x) { return (typeof(x) === 'string'); }))) {
|
|
40
|
-
errors.push(format_error(CB_REQ, taskDef));
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
return errors;
|
|
44
|
-
};
|
|
45
|
+
return errors;
|
|
46
|
+
};
|
|
45
47
|
|
|
46
|
-
CbTask.prototype.prepare = function prepare(handleTaskError, vCon, contExec) {
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
48
|
+
CbTask.prototype.prepare = function prepare(handleTaskError, vCon, contExec) {
|
|
49
|
+
var self = this;
|
|
50
|
+
this.cbFun = function (err, arg0, arg1, argn) {
|
|
51
|
+
var args = Array.prototype.slice.call(arguments, 1);
|
|
52
|
+
if (err) { handleTaskError(self, err); return; } //handle error and return, we are done
|
|
51
53
|
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
};
|
|
54
|
+
//no error, save callback args to vCon context, then continue execution
|
|
55
|
+
vCon.saveResults(self.out, args);
|
|
56
|
+
self.complete(args);
|
|
57
|
+
contExec();
|
|
58
|
+
};
|
|
59
|
+
};
|
|
58
60
|
|
|
59
|
-
CbTask.prototype.exec = function exec(vCon, handleError, contExec) {
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
};
|
|
61
|
+
CbTask.prototype.exec = function exec(vCon, handleError, contExec) {
|
|
62
|
+
try {
|
|
63
|
+
var args = this.a.map(function (k) { return vCon.getVar(k); }); //get args from vCon
|
|
64
|
+
//console.error('CbTask.exec.args=', args);
|
|
65
|
+
//console.error('CbTask.exec.vCon=', vCon);
|
|
66
|
+
this.start(args); //note the start time, args
|
|
67
|
+
args.push(this.cbFun); // push callback fn on end
|
|
68
|
+
var func = this.f;
|
|
69
|
+
var bindObj = vCon.getVar('this'); //global space or the original this
|
|
70
|
+
if (this.isMethodCall()) { //if method call then reset func and bindObj
|
|
71
|
+
func = vCon.getVar(this.f);
|
|
72
|
+
bindObj = this.getMethodObj(vCon);
|
|
73
|
+
} else if (typeof(func) === 'string') {
|
|
74
|
+
func = vCon.getVar(func); // we want the actual fn from this string
|
|
75
|
+
}
|
|
76
|
+
func.apply(bindObj, args);
|
|
77
|
+
} catch (err) { //catch and handle the task error, calling final cb
|
|
78
|
+
handleError(this, err);
|
|
79
|
+
}
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
return CbTask;
|
|
79
83
|
|
|
80
|
-
|
|
84
|
+
});
|