react 0.5.2 → 0.6.3

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.
Files changed (85) hide show
  1. package/.travis.yml +5 -0
  2. package/Jakefile.js +39 -0
  3. package/README.md +15 -23
  4. package/browser-test/dist.html +90 -0
  5. package/browser-test/index.html +86 -0
  6. package/browser-test/min.html +90 -0
  7. package/dist/react.js +3107 -0
  8. package/dist/react.min.js +22 -0
  9. package/doc/advanced.md +10 -2
  10. package/examples/using-events1.js +1 -1
  11. package/lib/base-task.js +116 -110
  12. package/lib/cb-task.js +71 -67
  13. package/lib/core.js +116 -117
  14. package/lib/dsl.js +120 -115
  15. package/lib/error.js +44 -36
  16. package/lib/event-collector.js +69 -56
  17. package/lib/event-manager.js +81 -67
  18. package/lib/eventemitter.js +20 -0
  19. package/lib/finalcb-first-task.js +56 -53
  20. package/lib/finalcb-task.js +55 -51
  21. package/lib/id.js +18 -7
  22. package/lib/input-parser.js +49 -41
  23. package/lib/log-events.js +88 -73
  24. package/lib/parse.js +34 -25
  25. package/lib/promise-resolve.js +42 -27
  26. package/lib/promise-task.js +78 -74
  27. package/lib/react.js +59 -0
  28. package/lib/ret-task.js +59 -55
  29. package/lib/sprintf.js +18 -0
  30. package/lib/status.js +11 -2
  31. package/lib/task.js +215 -217
  32. package/lib/track-tasks.js +72 -58
  33. package/lib/validate.js +136 -136
  34. package/lib/vcon.js +78 -69
  35. package/lib/when-task.js +69 -65
  36. package/package.json +10 -9
  37. package/src/dist.build.requirejs +20 -0
  38. package/test/ast.mocha.js +136 -0
  39. package/test/cb-task.mocha.js +220 -0
  40. package/test/core-deferred.mocha.js +143 -0
  41. package/test/core-when.mocha.js +96 -0
  42. package/test/core.mocha.js +589 -0
  43. package/test/dsl.mocha.js +350 -0
  44. package/test/event-manager.mocha.js +119 -0
  45. package/test/exec-options.mocha.js +48 -0
  46. package/test/finalcb-task.mocha.js +58 -0
  47. package/test/input-parser.mocha.js +86 -0
  48. package/test/log-events.mocha.js +88 -0
  49. package/test/mocha.opts +2 -0
  50. package/test/module-use.mocha.js +147 -0
  51. package/test/promise-auto-resolve.mocha.js +68 -0
  52. package/test/ret-task.mocha.js +220 -0
  53. package/test/task.mocha.js +42 -0
  54. package/test/validate-cb-task.mocha.js +100 -0
  55. package/test/validate-ret-task.mocha.js +110 -0
  56. package/test/validate.mocha.js +324 -0
  57. package/test/vcon.mocha.js +193 -0
  58. package/vendor/chai/chai.js +2038 -0
  59. package/vendor/jquery/jquery-1.7.1.js +9266 -0
  60. package/vendor/jquery/jquery-1.7.1.min.js +4 -0
  61. package/vendor/mocha/mocha.css +135 -0
  62. package/vendor/mocha/mocha.js +3589 -0
  63. package/vendor/node/util.js +531 -0
  64. package/vendor/requirejs/require.js +2053 -0
  65. package/vendor/requirejs/require.min.js +33 -0
  66. package/react.js +0 -40
  67. package/test/ast.test.js +0 -118
  68. package/test/cb-task.test.js +0 -197
  69. package/test/core-deferred.test.js +0 -134
  70. package/test/core-promised.test.js +0 -132
  71. package/test/core-when.test.js +0 -84
  72. package/test/core.test.js +0 -593
  73. package/test/dsl.test.js +0 -330
  74. package/test/event-manager.test.js +0 -102
  75. package/test/exec-options.test.js +0 -33
  76. package/test/finalcb-task.test.js +0 -38
  77. package/test/input-parser.test.js +0 -66
  78. package/test/module-use.test.js +0 -134
  79. package/test/promise-auto-resolve.test.js +0 -52
  80. package/test/ret-task.test.js +0 -199
  81. package/test/task.test.js +0 -21
  82. package/test/validate-cb-task.test.js +0 -74
  83. package/test/validate-ret-task.test.js +0 -83
  84. package/test/validate.test.js +0 -295
  85. package/test/vcon.test.js +0 -173
package/lib/react.js ADDED
@@ -0,0 +1,59 @@
1
+ 'use strict';
2
+ /*global define:true */
3
+
4
+ if (typeof define !== 'function') {
5
+ var define = require('amdefine')(module);
6
+ }
7
+
8
+ define(['./core', './dsl', './track-tasks', './log-events', './promise-resolve', './event-collector'],
9
+ function (core, dsl, trackTasksFn, logEventsMod, resolvePromisesFn, eventCollectorFactory) {
10
+
11
+ var react = dsl; // core + default dsl
12
+
13
+ /**
14
+ Enable detection of promises and resolution
15
+ */
16
+ function resolvePromises() {
17
+ resolvePromisesFn(react);
18
+ }
19
+
20
+ /**
21
+ Enable tracking of tasks and flow execution, emitting events and
22
+ tracking start, end, elapsed time
23
+ */
24
+ function trackTasks() {
25
+ trackTasksFn(react);
26
+ }
27
+
28
+ /**
29
+ If called, load the built-in plugin for log events and invoke
30
+
31
+ @param flowFn [function] if not provided uses global react
32
+ @param eventWildcard [string] pattern to log events for
33
+ */
34
+ function logEvents(flowFn, eventWildcard) {
35
+ if (typeof(flowFn) !== 'function') { // only wildcard provided
36
+ eventWildcard = flowFn;
37
+ flowFn = undefined;
38
+ }
39
+ if (!flowFn) flowFn = react; // use global
40
+ trackTasks();
41
+ return logEventsMod.logEvents(flowFn, eventWildcard);
42
+ }
43
+
44
+ /**
45
+ Instantiate an event collector
46
+ */
47
+ function createEventCollector() {
48
+ return eventCollectorFactory(react);
49
+ }
50
+
51
+ react.options = core.options; // global react options
52
+ react.events = core.events; // global react event emitter
53
+ react.logEvents = logEvents; // enable event logging
54
+ react.resolvePromises = resolvePromises; // enable promise resolution
55
+ react.trackTasks = trackTasks; // enable tracking of tasks
56
+ react.createEventCollector = createEventCollector; // create instance of EventCollector
57
+ return react;
58
+
59
+ });
package/lib/ret-task.js CHANGED
@@ -1,67 +1,71 @@
1
1
  'use strict';
2
+ /*global define:true */
2
3
 
3
- var util = require('util');
4
- var sprintf = require('sprintf').sprintf;
4
+ if (typeof define !== 'function') {
5
+ var define = require('amdefine')(module);
6
+ }
5
7
 
6
- var BaseTask = require('./base-task.js');
8
+ define(['util', './sprintf', './base-task'], function (util, sprintf, BaseTask) {
9
+
10
+ function format_error(errmsg, obj) {
11
+ return sprintf('%s - %s', errmsg, util.inspect(obj));
12
+ }
7
13
 
8
- function format_error(errmsg, obj) {
9
- return sprintf('%s - %s', errmsg, util.inspect(obj));
10
- }
14
+ var REQ = 'retTask requires f, a, out';
15
+ var FN_REQ = 'retTask requires f to be a function or string';
16
+ var A_REQ = 'retTask requires a to be an array of string param names';
17
+ var RET_REQ = 'retTask requires out to be an array with single string param name or []';
11
18
 
12
- var REQ = 'retTask requires f, a, out';
13
- var FN_REQ = 'retTask requires f to be a function or string';
14
- var A_REQ = 'retTask requires a to be an array of string param names';
15
- var RET_REQ = 'retTask requires out to be an array with single string param name or []';
19
+ function RetTask(taskDef) {
20
+ var self = this;
21
+ Object.keys(taskDef).forEach(function (k) { self[k] = taskDef[k]; });
22
+ }
16
23
 
17
- function RetTask(taskDef) {
18
- var self = this;
19
- Object.keys(taskDef).forEach(function (k) { self[k] = taskDef[k]; });
20
- }
24
+ RetTask.prototype = new BaseTask();
25
+ RetTask.prototype.constructor = RetTask;
21
26
 
22
- RetTask.prototype = new BaseTask();
23
- RetTask.prototype.constructor = RetTask;
27
+ RetTask.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
+ }
24
40
 
25
- RetTask.validate = function (taskDef) {
26
- var errors = [];
27
- if (!taskDef.f || !taskDef.a || !taskDef.out) {
28
- errors.push(format_error(REQ, taskDef));
29
- } else {
30
- var ftype = typeof(taskDef.f);
31
- if (! ((taskDef.f instanceof Function) || (ftype === 'string'))) {
32
- errors.push(format_error(FN_REQ, taskDef));
33
- }
34
- if (! (Array.isArray(taskDef.a) &&
35
- taskDef.a.every(function (x) { return (typeof(x) === 'string'); }))) {
36
- errors.push(format_error(A_REQ, taskDef));
41
+ if (! (Array.isArray(taskDef.out) &&
42
+ (taskDef.out.length === 0 ||
43
+ (taskDef.out.length === 1 && typeof(taskDef.out[0] === 'string'))))) {
44
+ errors.push(format_error(RET_REQ, taskDef));
45
+ }
37
46
  }
47
+ return errors;
48
+ };
38
49
 
39
- if (! (Array.isArray(taskDef.out) &&
40
- (taskDef.out.length === 0 ||
41
- (taskDef.out.length === 1 && typeof(taskDef.out[0] === 'string'))))) {
42
- errors.push(format_error(RET_REQ, taskDef));
43
- }
44
- }
45
- return errors;
46
- };
50
+ RetTask.prototype.exec = function exec(vCon, handleError, contExec) {
51
+ try {
52
+ var args = this.a.map(function (k) { return vCon.getVar(k); }); //get args from vCon
53
+ this.start(args); //note the start time, args
54
+ var func = this.f;
55
+ var bindObj = vCon.getVar('this'); //global space or the original this
56
+ if (this.isMethodCall()) { //if method call then reset func and bindObj
57
+ func = vCon.getVar(this.f);
58
+ bindObj = this.getMethodObj(vCon);
59
+ } else if (typeof(func) === 'string') {
60
+ func = vCon.getVar(func); // we want the actual fn from this string
61
+ }
62
+ var results = [func.apply(bindObj, args)];
63
+ vCon.saveResults(this.out, results); // save retval, takes arrays
64
+ this.complete(results);
65
+ contExec(); // continue since no callback to run this
66
+ } catch (err) { handleError(this, err); } // catch and handle the task error, calling final cb
67
+ };
47
68
 
48
- RetTask.prototype.exec = function exec(vCon, handleError, contExec) {
49
- try {
50
- var args = this.a.map(function (k) { return vCon.getVar(k); }); //get args from vCon
51
- this.start(args); //note the start time, args
52
- var func = this.f;
53
- var bindObj = vCon.getVar('this'); //global space or the original this
54
- if (this.isMethodCall()) { //if method call then reset func and bindObj
55
- func = vCon.getVar(this.f);
56
- bindObj = this.getMethodObj(vCon);
57
- } else if (typeof(func) === 'string') {
58
- func = vCon.getVar(func); // we want the actual fn from this string
59
- }
60
- var results = [func.apply(bindObj, args)];
61
- vCon.saveResults(this.out, results); // save retval, takes arrays
62
- this.complete(results);
63
- contExec(); // continue since no callback to run this
64
- } catch (err) { handleError(this, err); } // catch and handle the task error, calling final cb
65
- };
69
+ return RetTask;
66
70
 
67
- module.exports = RetTask;
71
+ });
package/lib/sprintf.js ADDED
@@ -0,0 +1,18 @@
1
+ 'use strict';
2
+ /*global define:true sprint:true */
3
+
4
+ if (typeof define !== 'function') {
5
+ var define = require('amdefine')(module);
6
+ }
7
+
8
+ define(['util'], function (util) {
9
+
10
+ /**
11
+ Abstract the details of getting a sprintf function.
12
+ Currently using the simple format capabilities of node's util.format
13
+ */
14
+
15
+ var sprintf = util.format;
16
+ return sprintf;
17
+
18
+ });
package/lib/status.js CHANGED
@@ -1,5 +1,14 @@
1
1
  'use strict';
2
+ /*global define:true */
2
3
 
3
- var STATUS = { READY: 'ready', RUNNING: 'running', ERRORED: 'errored', COMPLETE: 'complete' };
4
+ if (typeof define !== 'function') {
5
+ var define = require('amdefine')(module);
6
+ }
4
7
 
5
- module.exports = STATUS;
8
+ define([], function () {
9
+
10
+ var STATUS = { READY: 'ready', RUNNING: 'running', ERRORED: 'errored', COMPLETE: 'complete' };
11
+
12
+ return STATUS;
13
+
14
+ });
package/lib/task.js CHANGED
@@ -1,253 +1,251 @@
1
1
  'use strict';
2
+ /*global define:true */
2
3
 
3
- var util = require('util');
4
- var sprintf = require('sprintf').sprintf;
5
- var array = require('ensure-array');
6
- var CbTask = require('./cb-task.js');
7
- var PromiseTask = require('./promise-task.js');
8
- var RetTask = require('./ret-task.js');
9
- var WhenTask = require('./when-task.js');
10
- var FinalCbTask = require('./finalcb-task.js');
11
- var FinalCbFirstSuccTask = require('./finalcb-first-task.js');
12
- var STATUS = require('./status.js');
13
- var error = require('./error.js');
14
- var VContext = require('./vcon.js');
15
- var EventManager = require('./event-manager.js');
16
-
17
- var TASK_TYPES = {
18
- cb: CbTask,
19
- ret: RetTask,
20
- promise: PromiseTask,
21
- when: WhenTask
22
- };
23
-
24
- var DEFAULT_TASK_NAME = 'task_%s'; // for unnamed tasks use task_idx, like task_0
25
-
26
- function taskTypeKeys() { return Object.keys(TASK_TYPES); }
27
-
28
- var OUT_TASK_TYPES = {
29
- finalcb: FinalCbTask, //first task is the default if no type specified in taskDef
30
- finalcbFirst: FinalCbFirstSuccTask
31
- };
32
- function outTaskTypeKeys() { return Object.keys(OUT_TASK_TYPES); }
33
-
34
- var LOCAL_FN_MISSING = 'function: %s not found in locals or input params - task[%s]';
35
- var TASKDEF_IS_OBJECT = 'task must be an object';
36
- var NO_TASKS_RUNNING_WONT_COMPLETE = 'no tasks running, flow will not complete, remaining tasks: %s';
37
- var TASK_TYPE_SHOULD_MATCH = 'task.type should match one of ' +
38
- Object.keys(TASK_TYPES).join(', ');
39
-
40
- var validateTaskType, validateTask, create;
41
-
42
-
43
- function format_error(errmsg, obj) {
44
- return sprintf('%s - %s', errmsg, util.inspect(obj));
4
+ if (typeof define !== 'function') {
5
+ var define = require('amdefine')(module);
45
6
  }
46
7
 
47
- /**
48
- guess the missing types from params.
49
- Augments in place but also returns taskDef.
50
- If not specified then is 'cb'
8
+ define(['util', './sprintf', 'ensure-array', './cb-task', './promise-task',
9
+ './ret-task', './when-task', './finalcb-task', './finalcb-first-task',
10
+ './status', './error', './vcon', './event-manager'],
11
+ function (util, sprintf, array, CbTask, PromiseTask,
12
+ RetTask, WhenTask, FinalCbTask, FinalCbFirstSuccTask,
13
+ STATUS, error, VContext, EventManager) {
14
+
15
+ var TASK_TYPES = {
16
+ cb: CbTask,
17
+ ret: RetTask,
18
+ promise: PromiseTask,
19
+ when: WhenTask
20
+ };
21
+
22
+ var DEFAULT_TASK_NAME = 'task_%s'; // for unnamed tasks use task_idx, like task_0
23
+
24
+ function taskTypeKeys() { return Object.keys(TASK_TYPES); }
25
+
26
+ var OUT_TASK_TYPES = {
27
+ finalcb: FinalCbTask, //first task is the default if no type specified in taskDef
28
+ finalcbFirst: FinalCbFirstSuccTask
29
+ };
30
+ function outTaskTypeKeys() { return Object.keys(OUT_TASK_TYPES); }
31
+
32
+ var LOCAL_FN_MISSING = 'function: %s not found in locals or input params - task[%s]';
33
+ var TASKDEF_IS_OBJECT = 'task must be an object';
34
+ var NO_TASKS_RUNNING_WONT_COMPLETE = 'no tasks running, flow will not complete, remaining tasks: %s';
35
+ var TASK_TYPE_SHOULD_MATCH = 'task.type should match one of ' +
36
+ Object.keys(TASK_TYPES).join(', ');
37
+
38
+ function format_error(errmsg, obj) {
39
+ return sprintf('%s - %s', errmsg, util.inspect(obj));
40
+ }
41
+
42
+ /**
43
+ guess the missing types from params.
44
+ Augments in place but also returns taskDef.
45
+ If not specified then is 'cb'
51
46
  */
52
- function setMissingType(taskDef) {
53
- if (taskDef.type) return taskDef; //already set, return
54
- taskDef.type = 'cb';
55
- return taskDef;
56
- }
47
+ function setMissingType(taskDef) {
48
+ if (taskDef.type) return taskDef; //already set, return
49
+ taskDef.type = 'cb';
50
+ return taskDef;
51
+ }
57
52
 
58
- function setMissingOutTaskType(taskDef) {
59
- if (!taskDef.type) taskDef.type = Object.keys(OUT_TASK_TYPES)[0]; //use first outTask type as default
60
- }
53
+ function setMissingOutTaskType(taskDef) {
54
+ if (!taskDef.type) taskDef.type = Object.keys(OUT_TASK_TYPES)[0]; //use first outTask type as default
55
+ }
61
56
 
62
- function ensureAfterArrStrings(taskDef) { // convert any fn to str, and make sure is array
63
- if (!taskDef.after) return;
64
- var afterArr = array(taskDef.after); // ensure is array, null becomes []
65
- afterArr = afterArr.map(function (a) { return (typeof(a) === 'function') ? a.name : a; });
66
- taskDef.after = afterArr;
67
- }
57
+ function ensureAfterArrStrings(taskDef) { // convert any fn to str, and make sure is array
58
+ if (!taskDef.after) return;
59
+ var afterArr = array(taskDef.after); // ensure is array, null becomes []
60
+ afterArr = afterArr.map(function (a) { return (typeof(a) === 'function') ? a.name : a; });
61
+ taskDef.after = afterArr;
62
+ }
68
63
 
69
- /**
70
- @returns array of errors for taskDef, could be empty
64
+ /**
65
+ @returns array of errors for taskDef, could be empty
71
66
  */
72
- function validate(taskDef) {
73
- if (!taskDef || typeof(taskDef) !== 'object') {
74
- return [format_error(TASKDEF_IS_OBJECT, taskDef)];
75
- }
76
- setMissingType(taskDef);
77
- ensureAfterArrStrings(taskDef);
78
- var errors = [];
79
- errors = errors.concat(validateTaskType(taskDef));
80
- errors = errors.concat(validateTask(taskDef));
81
- return errors;
82
- }
67
+ function validate(taskDef) {
68
+ if (!taskDef || typeof(taskDef) !== 'object') {
69
+ return [format_error(TASKDEF_IS_OBJECT, taskDef)];
70
+ }
71
+ setMissingType(taskDef);
72
+ ensureAfterArrStrings(taskDef);
73
+ var errors = [];
74
+ errors = errors.concat(validateTaskType(taskDef));
75
+ errors = errors.concat(validateTask(taskDef));
76
+ return errors;
77
+ }
83
78
 
84
- function validateTaskType(taskDef) {
85
- var errors = [];
86
- if (!Object.keys(TASK_TYPES).some(
87
- function (type) { return (taskDef.type === type); })) {
88
- errors.push(format_error(TASK_TYPE_SHOULD_MATCH, taskDef));
79
+ function validateTaskType(taskDef) {
80
+ var errors = [];
81
+ if (!Object.keys(TASK_TYPES).some(
82
+ function (type) { return (taskDef.type === type); })) {
83
+ errors.push(format_error(TASK_TYPE_SHOULD_MATCH, taskDef));
84
+ }
85
+ return errors;
89
86
  }
90
- return errors;
91
- }
92
87
 
93
- function validateTask(taskDef) {
94
- var errors = [];
95
- var taskCons = TASK_TYPES[taskDef.type];
96
- if (taskCons) {
97
- errors = errors.concat(taskCons.validate(taskDef));
88
+ function validateTask(taskDef) {
89
+ var errors = [];
90
+ var taskCons = TASK_TYPES[taskDef.type];
91
+ if (taskCons) {
92
+ errors = errors.concat(taskCons.validate(taskDef));
93
+ }
94
+ return errors;
98
95
  }
99
- return errors;
100
- }
101
96
 
102
- function validateOutTask(taskDef) {
103
- var errors = [];
104
- setMissingOutTaskType(taskDef);
105
- var taskCons = OUT_TASK_TYPES[taskDef.type];
106
- errors = errors.concat(taskCons.validate(taskDef));
107
- return errors;
108
- }
97
+ function validateOutTask(taskDef) {
98
+ var errors = [];
99
+ setMissingOutTaskType(taskDef);
100
+ var taskCons = OUT_TASK_TYPES[taskDef.type];
101
+ errors = errors.concat(taskCons.validate(taskDef));
102
+ return errors;
103
+ }
109
104
 
110
105
 
111
- function validateLocalFunctions(inParams, taskDefs, locals) {
112
- var errors = [];
113
- function foo() { } //used to mock args as fns for validation check
114
- var mock_args = inParams.map(function (p) { return foo; }); //mock args with fns
115
- var vCon = VContext.create(mock_args, inParams, locals);
116
- var tasks = taskDefs.map(create);
117
- var tasksWFunctions = tasks.filter(function (t) { return (t.type !== 'when'); }); // non-when tasks need f
118
- tasksWFunctions.forEach(function (t, idx) {
119
- if (!t.functionExists(vCon)) { // error if function doesnt exist AND
120
- if (!t.isMethodCall()) errors.push(sprintf(LOCAL_FN_MISSING, t.f, idx)); // not method OR
121
- else {
122
- var obj = t.getMethodObj(vCon);
123
- if (obj && obj !== foo) { // (has parent but not our mock)
124
- errors.push(sprintf(LOCAL_FN_MISSING, t.f, idx));
106
+ function validateLocalFunctions(inParams, taskDefs, locals) {
107
+ var errors = [];
108
+ function foo() { } //used to mock args as fns for validation check
109
+ var mock_args = inParams.map(function (p) { return foo; }); //mock args with fns
110
+ var vCon = VContext.create(mock_args, inParams, locals);
111
+ var tasks = taskDefs.map(create);
112
+ var tasksWFunctions = tasks.filter(function (t) { return (t.type !== 'when'); }); // non-when tasks need f
113
+ tasksWFunctions.forEach(function (t, idx) {
114
+ if (!t.functionExists(vCon)) { // error if function doesnt exist AND
115
+ if (!t.isMethodCall()) errors.push(sprintf(LOCAL_FN_MISSING, t.f, idx)); // not method OR
116
+ else {
117
+ var obj = t.getMethodObj(vCon);
118
+ if (obj && obj !== foo) { // (has parent but not our mock)
119
+ errors.push(sprintf(LOCAL_FN_MISSING, t.f, idx));
120
+ }
125
121
  }
126
122
  }
127
- }
128
- });
129
- return errors;
130
- }
123
+ });
124
+ return errors;
125
+ }
131
126
 
132
- function fName(fn) {
133
- if (typeof(fn) === 'function') {
134
- return fn.name;
127
+ function fName(fn) {
128
+ if (typeof(fn) === 'function') {
129
+ return fn.name;
130
+ }
131
+ return (fn) ? fn : '';
135
132
  }
136
- return (fn) ? fn : '';
137
- }
138
133
 
139
- /**
140
- Name tasks that are not already named. Prenamed task uniquness validation
141
- will be done in validate.
134
+ /**
135
+ Name tasks that are not already named. Prenamed task uniquness validation
136
+ will be done in validate.
142
137
 
143
- This modifies the tasks with the new names.
138
+ This modifies the tasks with the new names.
144
139
 
145
- @returns map of names to tasks
140
+ @returns map of names to tasks
146
141
  */
147
- function nameTasks(tasks) { //name tasks that are not already named, validation done elsewhere, ret map
148
- var namesMap = tasks.reduce(function (map, t) {
149
- if (t.name) { map[t.name] = t; }
150
- return map;
151
- }, {});
152
- tasks.forEach(function (t, idx) {
153
- if (!t.name) { //not already named
154
- var name = fName(t.f);
155
- if (!name) name = sprintf(DEFAULT_TASK_NAME, idx);
156
- if (!name || namesMap[name]) {
157
- name = sprintf('%s_%s', name, idx); //if empty or already used, postfix with _idx
142
+ function nameTasks(tasks) { //name tasks that are not already named, validation done elsewhere, ret map
143
+ var namesMap = tasks.reduce(function (map, t) {
144
+ if (t.name) { map[t.name] = t; }
145
+ return map;
146
+ }, {});
147
+ tasks.forEach(function (t, idx) {
148
+ if (!t.name) { //not already named
149
+ var name = fName(t.f);
150
+ if (!name) name = sprintf(DEFAULT_TASK_NAME, idx);
151
+ if (!name || namesMap[name]) {
152
+ name = sprintf('%s_%s', name, idx); //if empty or already used, postfix with _idx
153
+ }
154
+ t.name = name;
155
+ namesMap[name] = t;
158
156
  }
159
- t.name = name;
160
- namesMap[name] = t;
161
- }
162
- });
163
- return namesMap;
164
- }
157
+ });
158
+ return namesMap;
159
+ }
165
160
 
166
- function create(taskDef) {
167
- var TaskConstructor = TASK_TYPES[taskDef.type];
168
- return new TaskConstructor(taskDef);
169
- }
161
+ function create(taskDef) {
162
+ var TaskConstructor = TASK_TYPES[taskDef.type];
163
+ return new TaskConstructor(taskDef);
164
+ }
170
165
 
171
- function createOutTask(taskDef, cbFunc, tasks, vCon, execOptions, env) {
172
- setMissingOutTaskType(taskDef);
173
- var outTaskOptions = {
174
- taskDef: taskDef,
175
- cbFunc: cbFunc,
176
- tasks: tasks,
177
- vCon: vCon,
178
- execOptions: execOptions,
179
- env: env,
180
- TaskConstructor: OUT_TASK_TYPES[taskDef.type]
181
- };
182
- EventManager.global.emit(EventManager.TYPES.EXEC_OUTTASK_CREATE, outTaskOptions); // hook
183
- var TaskConstructor = outTaskOptions.TaskConstructor; // hook could have changed
184
- return new TaskConstructor(outTaskOptions);
185
- }
166
+ function createOutTask(taskDef, cbFunc, tasks, vCon, execOptions, env) {
167
+ setMissingOutTaskType(taskDef);
168
+ var outTaskOptions = {
169
+ taskDef: taskDef,
170
+ cbFunc: cbFunc,
171
+ tasks: tasks,
172
+ vCon: vCon,
173
+ execOptions: execOptions,
174
+ env: env,
175
+ TaskConstructor: OUT_TASK_TYPES[taskDef.type]
176
+ };
177
+ EventManager.global.emit(EventManager.TYPES.EXEC_OUTTASK_CREATE, outTaskOptions); // hook
178
+ var TaskConstructor = outTaskOptions.TaskConstructor; // hook could have changed
179
+ return new TaskConstructor(outTaskOptions);
180
+ }
186
181
 
187
- function createErrorHandler(vCon, outTask) {
188
- return function handleError(task, err) {
189
- task.status = STATUS.ERRORED;
190
- task.error = err;
191
- outTask.env.currentTask = task;
192
- outTask.env.flowEmitter.emit(EventManager.TYPES.EXEC_TASK_ERRORED, task);
193
- var errWithMeta = error.augmentError(err, {task: task, vcon: vCon});
194
- outTask.exec(errWithMeta); //call the final callback with the first error hit
195
- };
196
- }
182
+ function createErrorHandler(vCon, outTask) {
183
+ return function handleError(task, err) {
184
+ task.status = STATUS.ERRORED;
185
+ task.error = err;
186
+ outTask.env.currentTask = task;
187
+ outTask.env.flowEmitter.emit(EventManager.TYPES.EXEC_TASK_ERRORED, task);
188
+ var errWithMeta = error.augmentError(err, {task: task, vcon: vCon});
189
+ outTask.exec(errWithMeta); //call the final callback with the first error hit
190
+ };
191
+ }
197
192
 
198
- function findTasksReady(vCon, tasks, tasksByName) {
199
- return tasks.filter(function (t) { return t.isReady(vCon, tasksByName); });
200
- }
193
+ function findTasksReady(vCon, tasks, tasksByName) {
194
+ return tasks.filter(function (t) { return t.isReady(vCon, tasksByName); });
195
+ }
201
196
 
202
- function execTasks(tasksReady, vCon, handleError, contExec) {
203
- tasksReady.forEach(function (t) { t.status = STATUS.READY; }); //set ready first, no double exec
204
- tasksReady.forEach(function (t) { t.exec(vCon, handleError, contExec); });
205
- }
197
+ function execTasks(tasksReady, vCon, handleError, contExec) {
198
+ tasksReady.forEach(function (t) { t.status = STATUS.READY; }); //set ready first, no double exec
199
+ tasksReady.forEach(function (t) { t.exec(vCon, handleError, contExec); });
200
+ }
206
201
 
207
- /**
208
- this will be called if there are no tasks found to run,
209
- and it will check if there are still tasks running or ready
210
- (which means they will be running shortly), in which
211
- case everything is fine. If no tasks are running then
212
- call handleError since this will never complete.
202
+ /**
203
+ this will be called if there are no tasks found to run,
204
+ and it will check if there are still tasks running or ready
205
+ (which means they will be running shortly), in which
206
+ case everything is fine. If no tasks are running then
207
+ call handleError since this will never complete.
213
208
  */
214
- function checkIfTasksRunning(vCon, tasks, handleError, env) {
215
- var tasksRunning = tasks.filter(function (t) {
216
- return (t.status === STATUS.RUNNING || t.status === STATUS.READY);
217
- });
218
- if (!tasksRunning.length) {
219
- var remainingTasks = tasks.filter(function (t) { return (!t.status); });
220
- var remainingTNames = remainingTasks.map(function (t) { return t.name; });
221
- var errMsg = sprintf(NO_TASKS_RUNNING_WONT_COMPLETE, remainingTNames.join(', '));
222
- var emptyTask = { env: env };
223
- handleError(emptyTask, new Error(errMsg));
209
+ function checkIfTasksRunning(vCon, tasks, handleError, env) {
210
+ var tasksRunning = tasks.filter(function (t) {
211
+ return (t.status === STATUS.RUNNING || t.status === STATUS.READY);
212
+ });
213
+ if (!tasksRunning.length) {
214
+ var remainingTasks = tasks.filter(function (t) { return (!t.status); });
215
+ var remainingTNames = remainingTasks.map(function (t) { return t.name; });
216
+ var errMsg = sprintf(NO_TASKS_RUNNING_WONT_COMPLETE, remainingTNames.join(', '));
217
+ var emptyTask = { env: env };
218
+ handleError(emptyTask, new Error(errMsg));
219
+ }
224
220
  }
225
- }
226
221
 
227
- function findReadyAndExec(vCon, tasks, tasksByName, handleError, contExec, env) {
228
- var tasksReady = findTasksReady(vCon, tasks, tasksByName);
229
- if (!tasksReady.length) checkIfTasksRunning(vCon, tasks, handleError, env); // no tasks to run, check if ok
230
- execTasks(tasksReady, vCon, handleError, contExec);
231
- }
222
+ function findReadyAndExec(vCon, tasks, tasksByName, handleError, contExec, env) {
223
+ var tasksReady = findTasksReady(vCon, tasks, tasksByName);
224
+ if (!tasksReady.length) checkIfTasksRunning(vCon, tasks, handleError, env); // no tasks to run, check if ok
225
+ execTasks(tasksReady, vCon, handleError, contExec);
226
+ }
232
227
 
233
- function serializeTasks(tasks) { // conveniently set after for each task idx > 0
234
- nameTasks(tasks);
235
- tasks.forEach(function (t, idx, arr) { if (idx !== 0) t.after = [arr[idx - 1].name]; });
236
- return tasks;
237
- }
228
+ function serializeTasks(tasks) { // conveniently set after for each task idx > 0
229
+ nameTasks(tasks);
230
+ tasks.forEach(function (t, idx, arr) { if (idx !== 0) t.after = [arr[idx - 1].name]; });
231
+ return tasks;
232
+ }
233
+
234
+ return {
235
+ serializeTasks: serializeTasks,
236
+ TASK_TYPES: TASK_TYPES,
237
+ taskTypeKeys: taskTypeKeys,
238
+ OUT_TASK_TYPES: OUT_TASK_TYPES,
239
+ outTaskTypeKeys: outTaskTypeKeys,
240
+ setMissingType: setMissingType,
241
+ validate: validate,
242
+ validateOutTask: validateOutTask,
243
+ validateLocalFunctions: validateLocalFunctions,
244
+ nameTasks: nameTasks,
245
+ create: create,
246
+ createOutTask: createOutTask,
247
+ createErrorHandler: createErrorHandler,
248
+ findReadyAndExec: findReadyAndExec
249
+ };
238
250
 
239
- exports.serializeTasks = serializeTasks;
240
-
241
- exports.TASK_TYPES = TASK_TYPES;
242
- exports.taskTypeKeys = taskTypeKeys;
243
- exports.OUT_TASK_TYPES = OUT_TASK_TYPES;
244
- exports.outTaskTypeKeys = outTaskTypeKeys;
245
- exports.setMissingType = setMissingType;
246
- exports.validate = validate;
247
- exports.validateOutTask = validateOutTask;
248
- exports.validateLocalFunctions = validateLocalFunctions;
249
- exports.nameTasks = nameTasks;
250
- exports.create = create;
251
- exports.createOutTask = createOutTask;
252
- exports.createErrorHandler = createErrorHandler;
253
- exports.findReadyAndExec = findReadyAndExec;
251
+ });