react 0.0.3 → 0.1.2

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 (66) hide show
  1. package/.npmignore +5 -0
  2. package/Jakefile.js +8 -0
  3. package/README.md +183 -83
  4. package/examples/ast1.js +26 -0
  5. package/examples/chain-events1.js +34 -0
  6. package/examples/chain1.js +19 -0
  7. package/examples/fstr-events1.js +51 -0
  8. package/examples/fstr1.js +36 -0
  9. package/examples/pcode1.js +22 -0
  10. package/jake-tasks/jake-test.js +64 -0
  11. package/lib/base-task.js +115 -0
  12. package/lib/cb-task.js +67 -0
  13. package/lib/chain.js +148 -0
  14. package/lib/core.js +95 -0
  15. package/lib/error.js +37 -0
  16. package/lib/event-manager.js +57 -0
  17. package/lib/finalcb-first-task.js +59 -0
  18. package/lib/finalcb-task.js +54 -0
  19. package/lib/fstr.js +110 -0
  20. package/lib/id.js +10 -0
  21. package/lib/input-parser.js +44 -0
  22. package/lib/parse.js +28 -0
  23. package/lib/pcode.js +164 -0
  24. package/lib/ret-task.js +67 -0
  25. package/lib/status.js +5 -0
  26. package/lib/task.js +234 -0
  27. package/lib/validate.js +102 -0
  28. package/lib/vcon.js +76 -0
  29. package/oldExamples/analyze.js +29 -0
  30. package/oldExamples/analyze2.js +29 -0
  31. package/oldExamples/example10-dsl.js +63 -0
  32. package/oldExamples/example11.js +62 -0
  33. package/oldExamples/example12.js +63 -0
  34. package/oldExamples/example13.js +63 -0
  35. package/oldExamples/example14.js +63 -0
  36. package/oldExamples/example15.js +75 -0
  37. package/{test → oldExamples}/example6-ast.js +0 -0
  38. package/{test → oldExamples}/example6-dsl.js +0 -0
  39. package/{test → oldExamples}/example8-ast.js +0 -0
  40. package/{test → oldExamples}/example8-dsl.js +0 -0
  41. package/{test → oldExamples}/example9-ast.js +0 -0
  42. package/{test → oldExamples}/example9-dsl.js +0 -0
  43. package/oldExamples/function-str-ex1.js +33 -0
  44. package/oldExamples/function-str-ex2.js +67 -0
  45. package/oldExamples/trait1.js +41 -0
  46. package/oldExamples/trait2.js +44 -0
  47. package/package.json +16 -6
  48. package/react.js +11 -1
  49. package/test/ast.test.js +69 -0
  50. package/test/cb-task.test.js +197 -0
  51. package/test/chain.test.js +239 -0
  52. package/test/core.test.js +519 -0
  53. package/test/event-manager.test.js +102 -0
  54. package/test/exec-options.test.js +32 -0
  55. package/test/finalcb-task.test.js +37 -0
  56. package/test/fstr.test.js +288 -0
  57. package/test/input-parser.test.js +62 -0
  58. package/test/module-use.test.js +271 -0
  59. package/test/pcode.test.js +321 -0
  60. package/test/ret-task.test.js +199 -0
  61. package/test/task.test.js +21 -0
  62. package/test/validate-cb-task.test.js +74 -0
  63. package/test/validate-ret-task.test.js +83 -0
  64. package/test/validate.test.js +218 -0
  65. package/test/vcon.test.js +160 -0
  66. package/lib/react.js +0 -254
package/lib/parse.js ADDED
@@ -0,0 +1,28 @@
1
+ 'use strict';
2
+
3
+ var sprintf = require('sprintf').sprintf;
4
+
5
+ function splitTrimFilterArgs(commaSepArgs) { //parse 'one, two' into ['one', 'two']
6
+ return commaSepArgs.split(',') //split on commas
7
+ .map(function (s) { return s.trim(); }) //trim
8
+ .filter(function (s) { return (s); }); //filter out empty strings
9
+ }
10
+
11
+ function parseReduce(accum, regexFn) {
12
+ if (typeof(accum) !== 'string') return accum; // already matched
13
+ var m = regexFn.regex.exec(accum);
14
+ if (m) return regexFn.fn(m); // return result obj
15
+ return accum; // no match, return str, will try next matcher
16
+ }
17
+
18
+ function parseStr(str, parseMatchers, errStr) {
19
+ var result = parseMatchers.reduce(parseReduce, str);
20
+ if (typeof(result) !== 'string') { // matched
21
+ return result;
22
+ } else { // no match
23
+ throw new Error(sprintf(errStr, str));
24
+ }
25
+ }
26
+
27
+ exports.splitTrimFilterArgs = splitTrimFilterArgs;
28
+ exports.parseStr = parseStr;
package/lib/pcode.js ADDED
@@ -0,0 +1,164 @@
1
+ 'use strict';
2
+
3
+ var sprintf = require('sprintf').sprintf;
4
+ var core = require('./core.js');
5
+ var parse = require('./parse.js');
6
+ var tutil = require('./task.js');
7
+
8
+ var INPARAMS_NO_MATCH = 'input params in wrong format, wanted "foo, bar, cb" - found: %s';
9
+ var OUTPARAMS_NO_MATCH = 'output params in wrong format, wanted "cb(err, foo)" - found: %s';
10
+ var INOUT_PARAMS_NO_MATCH = 'task params in wrong format, wanted "foo, bar := func(baz, cat, cb) " - found: %s';
11
+ var EXTRA_TASKARG = 'extra unmatched task arg: %s';
12
+
13
+ /**
14
+ Examples:
15
+ var react = require('react');
16
+
17
+ var locals = { falpha: falpha, fbeta: fbeta, fcharlie: fcharlie };
18
+ var fn = react.pcodeDefine('a, b', [
19
+ 'd := fbeta(a, b)',
20
+ 'e = fcharlie(a, b)',
21
+ 'c := falpha(a, b) when fbeta:done and fcharlie:done',
22
+ 'cb(err, c, d, e);'
23
+ ], locals);
24
+
25
+ function cb(err, d, e) { }
26
+ fn(10, 20, cb);
27
+ */
28
+
29
+ function splitAndFilterArgs(commaSepArgs) { // split, trim, filter out empty and (cb or callback)
30
+ var args = parse.splitTrimFilterArgs(commaSepArgs);
31
+ var cbNamesRe = /^cb|callback$/i; //cb, Cb, CB, callback, Callback
32
+ if (args.length && args[args.length - 1].match(cbNamesRe)) args.pop();
33
+ return args;
34
+ }
35
+
36
+ function extractNamesFromWhenClause(str) { //given 'foo:done and bar.baz:done' return ['foo', 'bar.baz']
37
+ var reSplit = /\s+and\s+/i;
38
+ var reDone = /^([^:]+):done$/i;
39
+ var names = str.split(reSplit).map(function (x) {
40
+ x = x.trim();
41
+ var m = x.match(reDone); // if foo:done, we'll use foo
42
+ return (m) ? m[1] : x;
43
+ });
44
+ return names;
45
+ }
46
+
47
+ var inParse = {
48
+ regex: /^(.*)$/,
49
+ fn: function (m) {
50
+ return {
51
+ inDef: splitAndFilterArgs(m[1]),
52
+ };
53
+ }
54
+ };
55
+
56
+ var cbParse = {
57
+ regex: /^\s*(var\s+)?([^:]*)\s*:=\s*([a-zA-Z0-9_\.-]+)\s*\(\s*([^)]*)\)\s*(when\s+([^;]+))?;?\s*$/,
58
+ fn: function (m) {
59
+ var taskDef = {
60
+ type: 'cb',
61
+ f: m[3],
62
+ inDef: (m[4]) ? splitAndFilterArgs(m[4]) : [],
63
+ outDef: (m[2]) ? parse.splitTrimFilterArgs(m[2]) : []
64
+ };
65
+ if (m[6]) taskDef.after = extractNamesFromWhenClause(m[6]);
66
+ return taskDef;
67
+ }
68
+ };
69
+
70
+ var retParse = {
71
+ regex: /^\s*(var\s+)?([^:]*)\s*=\s*([a-zA-Z0-9_\.-]+)\s*\(\s*([^)]*)\)\s*(when\s+([^;]+))?;?\s*$/,
72
+ fn: function (m) {
73
+ var taskDef = {
74
+ type: 'ret',
75
+ f: m[3],
76
+ inDef: (m[4]) ? splitAndFilterArgs(m[4]) : [],
77
+ outDef: (m[2]) ? parse.splitTrimFilterArgs(m[2]) : []
78
+ };
79
+ if (m[6]) taskDef.after = extractNamesFromWhenClause(m[6]);
80
+ return taskDef;
81
+ }
82
+ };
83
+
84
+ var finalCbParse = {
85
+ regex: /^\s*(cb|callback)\s*\((er{0,2}\s*,\s*)?([^)]*)\)\s*;?$/i,
86
+ fn: function (m) {
87
+ return {
88
+ outDef: (m[3]) ? parse.splitTrimFilterArgs(m[3]) : []
89
+ };
90
+ }
91
+ };
92
+
93
+ function parseInParams(str) {
94
+ return parse.parseStr(str, [inParse], INPARAMS_NO_MATCH);
95
+ }
96
+
97
+ function parseTask(str) {
98
+ var result = parse.parseStr(str, [cbParse, retParse], INOUT_PARAMS_NO_MATCH);
99
+ var type = result.type;
100
+ var task = {
101
+ f: result.f,
102
+ a: result.inDef
103
+ };
104
+ task.out = result.outDef;
105
+ task.type = type;
106
+ if (result.after) task.after = result.after;
107
+ return task;
108
+ }
109
+
110
+ function parseOutParams(str) {
111
+ if (!str.trim().length) return { outDef: [] };
112
+ return parse.parseStr(str, [finalCbParse], OUTPARAMS_NO_MATCH);
113
+ }
114
+
115
+ function parseTasks(arr) { return arr.map(parseTask); }
116
+
117
+
118
+ function pcodeDefine(inParamStr, taskStrArr, locals, options) {
119
+ if (!inParamStr) inParamStr = '';
120
+ if (!taskStrArr) taskStrArr = [];
121
+ var outTaskStr = (taskStrArr.length) ? taskStrArr.pop() : '';
122
+ if (!locals) locals = { };
123
+
124
+ var reactFn = core();
125
+ var ast = {
126
+ inParams: parseInParams(inParamStr).inDef,
127
+ tasks: parseTasks(taskStrArr),
128
+ outTask: { a: parseOutParams(outTaskStr).outDef },
129
+ locals: locals
130
+ };
131
+ if (options) Object.keys(options).forEach(function (k) { ast[k] = options[k]; });
132
+ var errors = reactFn.setAndValidateAST(ast);
133
+ if (errors.length) {
134
+ var errorStr = errors.join('\n');
135
+ throw new Error(errorStr);
136
+ }
137
+ return reactFn;
138
+ }
139
+
140
+ function selectFirst(inParamStr, taskStrArr, locals, options) {
141
+ if (!inParamStr) inParamStr = '';
142
+ if (!taskStrArr) taskStrArr = [];
143
+ var outTaskStr = (taskStrArr.length) ? taskStrArr.pop() : '';
144
+ if (!locals) locals = { };
145
+ var tasks = tutil.serializeTasks(parseTasks(taskStrArr));
146
+
147
+ var reactFn = core();
148
+ var ast = {
149
+ inParams: parseInParams(inParamStr).inDef,
150
+ tasks: tasks,
151
+ outTask: { type: 'finalcbFirst', a: parseOutParams(outTaskStr).outDef },
152
+ locals: locals
153
+ };
154
+ if (options) Object.keys(options).forEach(function (k) { ast[k] = options[k]; });
155
+ var errors = reactFn.setAndValidateAST(ast);
156
+ if (errors.length) {
157
+ var errorStr = errors.join('\n');
158
+ throw new Error(errorStr);
159
+ }
160
+ return reactFn;
161
+ }
162
+
163
+ module.exports = pcodeDefine;
164
+ module.exports.selectFirst = selectFirst;
@@ -0,0 +1,67 @@
1
+ 'use strict';
2
+
3
+ var util = require('util');
4
+ var sprintf = require('sprintf').sprintf;
5
+
6
+ var BaseTask = require('./base-task.js');
7
+
8
+ function format_error(errmsg, obj) {
9
+ return sprintf('%s - %s', errmsg, util.inspect(obj));
10
+ }
11
+
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 []';
16
+
17
+ function RetTask(taskDef) {
18
+ var self = this;
19
+ Object.keys(taskDef).forEach(function (k) { self[k] = taskDef[k]; });
20
+ }
21
+
22
+ RetTask.prototype = new BaseTask();
23
+ RetTask.prototype.constructor = RetTask;
24
+
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));
37
+ }
38
+
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
+ };
47
+
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 = null; //global space
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
+ };
66
+
67
+ module.exports = RetTask;
package/lib/status.js ADDED
@@ -0,0 +1,5 @@
1
+ 'use strict';
2
+
3
+ var STATUS = { READY: 'ready', RUNNING: 'running', ERRORED: 'errored', COMPLETE: 'complete' };
4
+
5
+ module.exports = STATUS;
package/lib/task.js ADDED
@@ -0,0 +1,234 @@
1
+ 'use strict';
2
+
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 RetTask = require('./ret-task.js');
8
+ var FinalCbTask = require('./finalcb-task.js');
9
+ var FinalCbFirstSuccTask = require('./finalcb-first-task.js');
10
+ var STATUS = require('./status.js');
11
+ var error = require('./error.js');
12
+ var VContext = require('./vcon.js');
13
+
14
+ var TASK_TYPES = {
15
+ cb: CbTask,
16
+ ret: RetTask
17
+ };
18
+ function taskTypeKeys() { return Object.keys(TASK_TYPES); }
19
+
20
+ var OUT_TASK_TYPES = {
21
+ finalcb: FinalCbTask, //first task is the default if no type specified in taskDef
22
+ finalcbFirst: FinalCbFirstSuccTask
23
+ };
24
+ function outTaskTypeKeys() { return Object.keys(OUT_TASK_TYPES); }
25
+
26
+ var LOCAL_FN_MISSING = 'function: %s not found in locals or input params - task[%s]';
27
+ var TASKDEF_IS_OBJECT = 'task must be an object';
28
+ var NO_TASKS_RUNNING_WONT_COMPLETE = 'no tasks running, flow will not complete';
29
+ var TASK_TYPE_SHOULD_MATCH = 'task.type should match one of ' +
30
+ Object.keys(TASK_TYPES).join(', ');
31
+
32
+ var validateTaskType, validateTask, create;
33
+
34
+
35
+ function format_error(errmsg, obj) {
36
+ return sprintf('%s - %s', errmsg, util.inspect(obj));
37
+ }
38
+
39
+ /**
40
+ guess the missing types from params.
41
+ Augments in place but also returns taskDef.
42
+ If not specified then is 'cb'
43
+ */
44
+ function setMissingType(taskDef) {
45
+ if (taskDef.type) return taskDef; //already set, return
46
+ taskDef.type = 'cb';
47
+ return taskDef;
48
+ }
49
+
50
+ function setMissingOutTaskType(taskDef) {
51
+ if (!taskDef.type) taskDef.type = Object.keys(OUT_TASK_TYPES)[0]; //use first outTask type as default
52
+ }
53
+
54
+ function ensureAfterArrStrings(taskDef) { // convert any fn to str, and make sure is array
55
+ if (!taskDef.after) return;
56
+ var afterArr = array(taskDef.after); // ensure is array, null becomes []
57
+ afterArr = afterArr.map(function (a) { return (typeof(a) === 'function') ? a.name : a; });
58
+ taskDef.after = afterArr;
59
+ }
60
+
61
+ /**
62
+ @returns array of errors for taskDef, could be empty
63
+ */
64
+ function validate(taskDef) {
65
+ if (!taskDef || typeof(taskDef) !== 'object') {
66
+ return [format_error(TASKDEF_IS_OBJECT, taskDef)];
67
+ }
68
+ setMissingType(taskDef);
69
+ ensureAfterArrStrings(taskDef);
70
+ var errors = [];
71
+ errors = errors.concat(validateTaskType(taskDef));
72
+ errors = errors.concat(validateTask(taskDef));
73
+ return errors;
74
+ }
75
+
76
+ function validateTaskType(taskDef) {
77
+ var errors = [];
78
+ if (!Object.keys(TASK_TYPES).some(
79
+ function (type) { return (taskDef.type === type); })) {
80
+ errors.push(format_error(TASK_TYPE_SHOULD_MATCH, taskDef));
81
+ }
82
+ return errors;
83
+ }
84
+
85
+ function validateTask(taskDef) {
86
+ var errors = [];
87
+ var taskCons = TASK_TYPES[taskDef.type];
88
+ if (taskCons) {
89
+ errors = errors.concat(taskCons.validate(taskDef));
90
+ }
91
+ return errors;
92
+ }
93
+
94
+ function validateOutTask(taskDef) {
95
+ var errors = [];
96
+ setMissingOutTaskType(taskDef);
97
+ var taskCons = OUT_TASK_TYPES[taskDef.type];
98
+ errors = errors.concat(taskCons.validate(taskDef));
99
+ return errors;
100
+ }
101
+
102
+
103
+ function validateLocalFunctions(inParams, taskDefs, locals) {
104
+ var errors = [];
105
+ function foo() { } //used to mock args as fns for validation check
106
+ var mock_args = inParams.map(function (p) { return foo; }); //mock args with fns
107
+ var vCon = VContext.create(mock_args, inParams, locals);
108
+ var tasks = taskDefs.map(create);
109
+ tasks.forEach(function (t, idx) {
110
+ if (!t.functionExists(vCon)) { // error if function doesnt exist AND
111
+ if (!t.isMethodCall()) errors.push(sprintf(LOCAL_FN_MISSING, t.f, idx)); // not method OR
112
+ else {
113
+ var obj = t.getMethodObj(vCon);
114
+ if (obj && obj !== foo) { // (has parent but not our mock)
115
+ errors.push(sprintf(LOCAL_FN_MISSING, t.f, idx));
116
+ }
117
+ }
118
+ }
119
+ });
120
+ return errors;
121
+ }
122
+
123
+ function fName(fn) {
124
+ return (typeof(fn) === 'string') ? fn : fn.name;
125
+ }
126
+
127
+ /**
128
+ Name tasks that are not already named. Prenamed task uniquness validation
129
+ will be done in validate.
130
+
131
+ This modifies the tasks with the new names.
132
+
133
+ @returns map of names to tasks
134
+ */
135
+ function nameTasks(tasks) { //name tasks that are not already named, validation done elsewhere, ret map
136
+ var namesMap = tasks.reduce(function (map, t) {
137
+ if (t.name) { map[t.name] = t; }
138
+ return map;
139
+ }, {});
140
+ tasks.forEach(function (t, idx) {
141
+ if (!t.name) { //not already named
142
+ var name = fName(t.f);
143
+ if (!name || namesMap[name]) {
144
+ name = sprintf('%s_%s', name, idx); //if empty or already used, postfix with _idx
145
+ }
146
+ t.name = name;
147
+ namesMap[name] = t;
148
+ }
149
+ });
150
+ return namesMap;
151
+ }
152
+
153
+ function create(taskDef) {
154
+ var TaskConstructor = TASK_TYPES[taskDef.type];
155
+ return new TaskConstructor(taskDef);
156
+ }
157
+
158
+ function createOutTask(taskDef, cbFinal, tasks, vCon) {
159
+ setMissingOutTaskType(taskDef);
160
+ var TaskConstructor = OUT_TASK_TYPES[taskDef.type];
161
+ return new TaskConstructor(taskDef, cbFinal, tasks, vCon);
162
+ }
163
+
164
+ function createCallback(task, handleTaskError, vCon, contExec) {
165
+ return function (err, arg0, arg1, argn) {
166
+ var args = Array.prototype.slice.call(arguments, 1);
167
+ if (err) { handleTaskError(task, err); return; } //handle error and return, we are done
168
+
169
+ //no error, save callback args to vCon context, then continue execution
170
+ vCon.saveResults(task.out, args);
171
+ task.complete(args);
172
+ contExec();
173
+ };
174
+ }
175
+
176
+ function createErrorHandler(vCon, outTask) {
177
+ return function handleError(task, err) {
178
+ task.status = STATUS.ERRORED;
179
+ var errWithMeta = error.augmentError(err, {task: task, vcon: vCon});
180
+ outTask.exec(errWithMeta); //call the final callback with the first error hit
181
+ };
182
+ }
183
+
184
+ function findTasksReady(vCon, tasks, tasksByName) {
185
+ return tasks.filter(function (t) { return t.isReady(vCon, tasksByName); });
186
+ }
187
+
188
+ function execTasks(tasksReady, vCon, handleError, contExec) {
189
+ tasksReady.forEach(function (t) { t.status = STATUS.READY; }); //set ready first, no double exec
190
+ tasksReady.forEach(function (t) { t.exec(vCon, handleError, contExec); });
191
+ }
192
+
193
+ /**
194
+ this will be called if there are no tasks found to run,
195
+ and it will check if there are still tasks running or ready
196
+ (which means they will be running shortly), in which
197
+ case everything is fine. If no tasks are running then
198
+ call handleError since this will never complete.
199
+ */
200
+ function checkIfTasksRunning(vCon, tasks, handleError) {
201
+ var tasksRunning = tasks.filter(function (t) {
202
+ return (t.status === STATUS.RUNNING || t.status === STATUS.READY);
203
+ });
204
+ if (!tasksRunning.length) handleError({}, new Error(NO_TASKS_RUNNING_WONT_COMPLETE));
205
+ }
206
+
207
+ function findReadyAndExec(vCon, tasks, tasksByName, handleError, contExec) {
208
+ var tasksReady = findTasksReady(vCon, tasks, tasksByName);
209
+ if (!tasksReady.length) checkIfTasksRunning(vCon, tasks, handleError); // no tasks to run, check if ok
210
+ execTasks(tasksReady, vCon, handleError, contExec);
211
+ }
212
+
213
+ function serializeTasks(tasks) { // conveniently set after for each task idx > 0
214
+ nameTasks(tasks);
215
+ tasks.forEach(function (t, idx, arr) { if (idx !== 0) t.after = [arr[idx - 1].name]; });
216
+ return tasks;
217
+ }
218
+
219
+ exports.serializeTasks = serializeTasks;
220
+
221
+ exports.TASK_TYPES = TASK_TYPES;
222
+ exports.taskTypeKeys = taskTypeKeys;
223
+ exports.OUT_TASK_TYPES = OUT_TASK_TYPES;
224
+ exports.outTaskTypeKeys = outTaskTypeKeys;
225
+ exports.setMissingType = setMissingType;
226
+ exports.validate = validate;
227
+ exports.validateOutTask = validateOutTask;
228
+ exports.validateLocalFunctions = validateLocalFunctions;
229
+ exports.nameTasks = nameTasks;
230
+ exports.create = create;
231
+ exports.createOutTask = createOutTask;
232
+ exports.createCallback = createCallback;
233
+ exports.createErrorHandler = createErrorHandler;
234
+ exports.findReadyAndExec = findReadyAndExec;