react 0.5.2 → 0.6.0

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 (84) hide show
  1. package/.travis.yml +4 -0
  2. package/Jakefile.js +39 -0
  3. package/README.md +9 -22
  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 +3291 -0
  8. package/dist/react.min.js +1 -0
  9. package/doc/advanced.md +2 -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 +118 -119
  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 +65 -58
  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 +79 -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 +218 -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 +11 -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/mocha.opts +2 -0
  49. package/test/module-use.mocha.js +147 -0
  50. package/test/promise-auto-resolve.mocha.js +68 -0
  51. package/test/ret-task.mocha.js +220 -0
  52. package/test/task.mocha.js +42 -0
  53. package/test/validate-cb-task.mocha.js +100 -0
  54. package/test/validate-ret-task.mocha.js +110 -0
  55. package/test/validate.mocha.js +324 -0
  56. package/test/vcon.mocha.js +193 -0
  57. package/vendor/chai/chai.js +2038 -0
  58. package/vendor/jquery/jquery-1.7.1.js +9266 -0
  59. package/vendor/jquery/jquery-1.7.1.min.js +4 -0
  60. package/vendor/mocha/mocha.css +135 -0
  61. package/vendor/mocha/mocha.js +3589 -0
  62. package/vendor/node/util.js +531 -0
  63. package/vendor/requirejs/require.js +2053 -0
  64. package/vendor/requirejs/require.min.js +33 -0
  65. package/react.js +0 -40
  66. package/test/ast.test.js +0 -118
  67. package/test/cb-task.test.js +0 -197
  68. package/test/core-deferred.test.js +0 -134
  69. package/test/core-promised.test.js +0 -132
  70. package/test/core-when.test.js +0 -84
  71. package/test/core.test.js +0 -593
  72. package/test/dsl.test.js +0 -330
  73. package/test/event-manager.test.js +0 -102
  74. package/test/exec-options.test.js +0 -33
  75. package/test/finalcb-task.test.js +0 -38
  76. package/test/input-parser.test.js +0 -66
  77. package/test/module-use.test.js +0 -134
  78. package/test/promise-auto-resolve.test.js +0 -52
  79. package/test/ret-task.test.js +0 -199
  80. package/test/task.test.js +0 -21
  81. package/test/validate-cb-task.test.js +0 -74
  82. package/test/validate-ret-task.test.js +0 -83
  83. package/test/validate.test.js +0 -295
  84. 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 (!eventWildcard && typeof(flowFn) === 'string') { // 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(['sprint'], function (sprintfMod) {
9
+
10
+ /**
11
+ Abstract the details of getting a sprintf function
12
+ */
13
+
14
+ // Sprint doesn't return itself in browser so need to get the global
15
+ var sprintf = (sprintfMod) ? sprintfMod : sprint;
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,254 @@
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
+ var validateTaskType, validateTask, create;
39
+
40
+
41
+ function format_error(errmsg, obj) {
42
+ return sprintf('%s - %s', errmsg, util.inspect(obj));
43
+ }
44
+
45
+ /**
46
+ guess the missing types from params.
47
+ Augments in place but also returns taskDef.
48
+ If not specified then is 'cb'
51
49
  */
52
- function setMissingType(taskDef) {
53
- if (taskDef.type) return taskDef; //already set, return
54
- taskDef.type = 'cb';
55
- return taskDef;
56
- }
50
+ function setMissingType(taskDef) {
51
+ if (taskDef.type) return taskDef; //already set, return
52
+ taskDef.type = 'cb';
53
+ return taskDef;
54
+ }
57
55
 
58
- function setMissingOutTaskType(taskDef) {
59
- if (!taskDef.type) taskDef.type = Object.keys(OUT_TASK_TYPES)[0]; //use first outTask type as default
60
- }
56
+ function setMissingOutTaskType(taskDef) {
57
+ if (!taskDef.type) taskDef.type = Object.keys(OUT_TASK_TYPES)[0]; //use first outTask type as default
58
+ }
61
59
 
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
- }
60
+ function ensureAfterArrStrings(taskDef) { // convert any fn to str, and make sure is array
61
+ if (!taskDef.after) return;
62
+ var afterArr = array(taskDef.after); // ensure is array, null becomes []
63
+ afterArr = afterArr.map(function (a) { return (typeof(a) === 'function') ? a.name : a; });
64
+ taskDef.after = afterArr;
65
+ }
68
66
 
69
- /**
70
- @returns array of errors for taskDef, could be empty
67
+ /**
68
+ @returns array of errors for taskDef, could be empty
71
69
  */
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
- }
70
+ function validate(taskDef) {
71
+ if (!taskDef || typeof(taskDef) !== 'object') {
72
+ return [format_error(TASKDEF_IS_OBJECT, taskDef)];
73
+ }
74
+ setMissingType(taskDef);
75
+ ensureAfterArrStrings(taskDef);
76
+ var errors = [];
77
+ errors = errors.concat(validateTaskType(taskDef));
78
+ errors = errors.concat(validateTask(taskDef));
79
+ return errors;
80
+ }
83
81
 
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));
82
+ function validateTaskType(taskDef) {
83
+ var errors = [];
84
+ if (!Object.keys(TASK_TYPES).some(
85
+ function (type) { return (taskDef.type === type); })) {
86
+ errors.push(format_error(TASK_TYPE_SHOULD_MATCH, taskDef));
87
+ }
88
+ return errors;
89
89
  }
90
- return errors;
91
- }
92
90
 
93
- function validateTask(taskDef) {
94
- var errors = [];
95
- var taskCons = TASK_TYPES[taskDef.type];
96
- if (taskCons) {
97
- errors = errors.concat(taskCons.validate(taskDef));
91
+ function validateTask(taskDef) {
92
+ var errors = [];
93
+ var taskCons = TASK_TYPES[taskDef.type];
94
+ if (taskCons) {
95
+ errors = errors.concat(taskCons.validate(taskDef));
96
+ }
97
+ return errors;
98
98
  }
99
- return errors;
100
- }
101
99
 
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
- }
100
+ function validateOutTask(taskDef) {
101
+ var errors = [];
102
+ setMissingOutTaskType(taskDef);
103
+ var taskCons = OUT_TASK_TYPES[taskDef.type];
104
+ errors = errors.concat(taskCons.validate(taskDef));
105
+ return errors;
106
+ }
109
107
 
110
108
 
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));
109
+ function validateLocalFunctions(inParams, taskDefs, locals) {
110
+ var errors = [];
111
+ function foo() { } //used to mock args as fns for validation check
112
+ var mock_args = inParams.map(function (p) { return foo; }); //mock args with fns
113
+ var vCon = VContext.create(mock_args, inParams, locals);
114
+ var tasks = taskDefs.map(create);
115
+ var tasksWFunctions = tasks.filter(function (t) { return (t.type !== 'when'); }); // non-when tasks need f
116
+ tasksWFunctions.forEach(function (t, idx) {
117
+ if (!t.functionExists(vCon)) { // error if function doesnt exist AND
118
+ if (!t.isMethodCall()) errors.push(sprintf(LOCAL_FN_MISSING, t.f, idx)); // not method OR
119
+ else {
120
+ var obj = t.getMethodObj(vCon);
121
+ if (obj && obj !== foo) { // (has parent but not our mock)
122
+ errors.push(sprintf(LOCAL_FN_MISSING, t.f, idx));
123
+ }
124
+ }
125
125
  }
126
- }
126
+ });
127
+ return errors;
127
128
  }
128
- });
129
- return errors;
130
- }
131
129
 
132
- function fName(fn) {
133
- if (typeof(fn) === 'function') {
134
- return fn.name;
130
+ function fName(fn) {
131
+ if (typeof(fn) === 'function') {
132
+ return fn.name;
133
+ }
134
+ return (fn) ? fn : '';
135
135
  }
136
- return (fn) ? fn : '';
137
- }
138
136
 
139
- /**
140
- Name tasks that are not already named. Prenamed task uniquness validation
141
- will be done in validate.
137
+ /**
138
+ Name tasks that are not already named. Prenamed task uniquness validation
139
+ will be done in validate.
142
140
 
143
- This modifies the tasks with the new names.
141
+ This modifies the tasks with the new names.
144
142
 
145
- @returns map of names to tasks
143
+ @returns map of names to tasks
146
144
  */
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
145
+ function nameTasks(tasks) { //name tasks that are not already named, validation done elsewhere, ret map
146
+ var namesMap = tasks.reduce(function (map, t) {
147
+ if (t.name) { map[t.name] = t; }
148
+ return map;
149
+ }, {});
150
+ tasks.forEach(function (t, idx) {
151
+ if (!t.name) { //not already named
152
+ var name = fName(t.f);
153
+ if (!name) name = sprintf(DEFAULT_TASK_NAME, idx);
154
+ if (!name || namesMap[name]) {
155
+ name = sprintf('%s_%s', name, idx); //if empty or already used, postfix with _idx
156
+ }
157
+ t.name = name;
158
+ namesMap[name] = t;
158
159
  }
159
- t.name = name;
160
- namesMap[name] = t;
161
- }
162
- });
163
- return namesMap;
164
- }
160
+ });
161
+ return namesMap;
162
+ }
165
163
 
166
- function create(taskDef) {
167
- var TaskConstructor = TASK_TYPES[taskDef.type];
168
- return new TaskConstructor(taskDef);
169
- }
164
+ function create(taskDef) {
165
+ var TaskConstructor = TASK_TYPES[taskDef.type];
166
+ return new TaskConstructor(taskDef);
167
+ }
170
168
 
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
- }
169
+ function createOutTask(taskDef, cbFunc, tasks, vCon, execOptions, env) {
170
+ setMissingOutTaskType(taskDef);
171
+ var outTaskOptions = {
172
+ taskDef: taskDef,
173
+ cbFunc: cbFunc,
174
+ tasks: tasks,
175
+ vCon: vCon,
176
+ execOptions: execOptions,
177
+ env: env,
178
+ TaskConstructor: OUT_TASK_TYPES[taskDef.type]
179
+ };
180
+ EventManager.global.emit(EventManager.TYPES.EXEC_OUTTASK_CREATE, outTaskOptions); // hook
181
+ var TaskConstructor = outTaskOptions.TaskConstructor; // hook could have changed
182
+ return new TaskConstructor(outTaskOptions);
183
+ }
186
184
 
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
- }
185
+ function createErrorHandler(vCon, outTask) {
186
+ return function handleError(task, err) {
187
+ task.status = STATUS.ERRORED;
188
+ task.error = err;
189
+ outTask.env.currentTask = task;
190
+ outTask.env.flowEmitter.emit(EventManager.TYPES.EXEC_TASK_ERRORED, task);
191
+ var errWithMeta = error.augmentError(err, {task: task, vcon: vCon});
192
+ outTask.exec(errWithMeta); //call the final callback with the first error hit
193
+ };
194
+ }
197
195
 
198
- function findTasksReady(vCon, tasks, tasksByName) {
199
- return tasks.filter(function (t) { return t.isReady(vCon, tasksByName); });
200
- }
196
+ function findTasksReady(vCon, tasks, tasksByName) {
197
+ return tasks.filter(function (t) { return t.isReady(vCon, tasksByName); });
198
+ }
201
199
 
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
- }
200
+ function execTasks(tasksReady, vCon, handleError, contExec) {
201
+ tasksReady.forEach(function (t) { t.status = STATUS.READY; }); //set ready first, no double exec
202
+ tasksReady.forEach(function (t) { t.exec(vCon, handleError, contExec); });
203
+ }
206
204
 
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.
205
+ /**
206
+ this will be called if there are no tasks found to run,
207
+ and it will check if there are still tasks running or ready
208
+ (which means they will be running shortly), in which
209
+ case everything is fine. If no tasks are running then
210
+ call handleError since this will never complete.
213
211
  */
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));
212
+ function checkIfTasksRunning(vCon, tasks, handleError, env) {
213
+ var tasksRunning = tasks.filter(function (t) {
214
+ return (t.status === STATUS.RUNNING || t.status === STATUS.READY);
215
+ });
216
+ if (!tasksRunning.length) {
217
+ var remainingTasks = tasks.filter(function (t) { return (!t.status); });
218
+ var remainingTNames = remainingTasks.map(function (t) { return t.name; });
219
+ var errMsg = sprintf(NO_TASKS_RUNNING_WONT_COMPLETE, remainingTNames.join(', '));
220
+ var emptyTask = { env: env };
221
+ handleError(emptyTask, new Error(errMsg));
222
+ }
224
223
  }
225
- }
226
224
 
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
- }
225
+ function findReadyAndExec(vCon, tasks, tasksByName, handleError, contExec, env) {
226
+ var tasksReady = findTasksReady(vCon, tasks, tasksByName);
227
+ if (!tasksReady.length) checkIfTasksRunning(vCon, tasks, handleError, env); // no tasks to run, check if ok
228
+ execTasks(tasksReady, vCon, handleError, contExec);
229
+ }
232
230
 
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
- }
231
+ function serializeTasks(tasks) { // conveniently set after for each task idx > 0
232
+ nameTasks(tasks);
233
+ tasks.forEach(function (t, idx, arr) { if (idx !== 0) t.after = [arr[idx - 1].name]; });
234
+ return tasks;
235
+ }
236
+
237
+ return {
238
+ serializeTasks: serializeTasks,
239
+ TASK_TYPES: TASK_TYPES,
240
+ taskTypeKeys: taskTypeKeys,
241
+ OUT_TASK_TYPES: OUT_TASK_TYPES,
242
+ outTaskTypeKeys: outTaskTypeKeys,
243
+ setMissingType: setMissingType,
244
+ validate: validate,
245
+ validateOutTask: validateOutTask,
246
+ validateLocalFunctions: validateLocalFunctions,
247
+ nameTasks: nameTasks,
248
+ create: create,
249
+ createOutTask: createOutTask,
250
+ createErrorHandler: createErrorHandler,
251
+ findReadyAndExec: findReadyAndExec
252
+ };
238
253
 
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;
254
+ });