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.
Files changed (92) hide show
  1. package/.travis.yml +4 -0
  2. package/Jakefile.js +39 -0
  3. package/README.md +18 -26
  4. package/browser-test/dist.html +89 -0
  5. package/browser-test/index.html +85 -0
  6. package/browser-test/min.html +89 -0
  7. package/dist/react.js +3093 -0
  8. package/dist/react.min.js +1 -0
  9. package/doc/advanced.md +7 -2
  10. package/doc/simple.dot +25 -0
  11. package/doc/simple.png +0 -0
  12. package/examples/{default1.js → longer-example.js} +0 -0
  13. package/examples/{default-simple.js → simple.js} +0 -0
  14. package/examples/{ast1.js → using-ast-directly.js} +4 -0
  15. package/examples/{default-events1.js → using-events1.js} +1 -1
  16. package/examples/{default-log-events.js → using-log-events.js} +0 -0
  17. package/lib/base-task.js +116 -110
  18. package/lib/cb-task.js +71 -67
  19. package/lib/core.js +118 -107
  20. package/lib/dsl.js +120 -115
  21. package/lib/error.js +44 -36
  22. package/lib/event-collector.js +69 -53
  23. package/lib/event-manager.js +69 -55
  24. package/lib/eventemitter.js +20 -0
  25. package/lib/finalcb-first-task.js +56 -53
  26. package/lib/finalcb-task.js +55 -51
  27. package/lib/id.js +18 -6
  28. package/lib/input-parser.js +49 -41
  29. package/lib/log-events.js +79 -73
  30. package/lib/parse.js +34 -25
  31. package/lib/promise-resolve.js +42 -27
  32. package/lib/promise-task.js +78 -74
  33. package/lib/react.js +59 -0
  34. package/lib/ret-task.js +59 -55
  35. package/lib/sprintf.js +18 -0
  36. package/lib/status.js +11 -2
  37. package/lib/task.js +216 -213
  38. package/lib/track-tasks.js +72 -58
  39. package/lib/validate.js +136 -136
  40. package/lib/vcon.js +78 -69
  41. package/lib/when-task.js +69 -65
  42. package/package.json +10 -9
  43. package/src/dist.build.requirejs +20 -0
  44. package/test/ast.mocha.js +136 -0
  45. package/test/cb-task.mocha.js +220 -0
  46. package/test/core-deferred.mocha.js +143 -0
  47. package/test/core-when.mocha.js +96 -0
  48. package/test/core.mocha.js +589 -0
  49. package/test/dsl.mocha.js +350 -0
  50. package/test/event-manager.mocha.js +119 -0
  51. package/test/exec-options.mocha.js +48 -0
  52. package/test/finalcb-task.mocha.js +58 -0
  53. package/test/input-parser.mocha.js +86 -0
  54. package/test/mocha.opts +2 -0
  55. package/test/module-use.mocha.js +147 -0
  56. package/test/promise-auto-resolve.mocha.js +68 -0
  57. package/test/ret-task.mocha.js +220 -0
  58. package/test/task.mocha.js +42 -0
  59. package/test/validate-cb-task.mocha.js +100 -0
  60. package/test/validate-ret-task.mocha.js +110 -0
  61. package/test/validate.mocha.js +324 -0
  62. package/test/vcon.mocha.js +193 -0
  63. package/vendor/chai/chai.js +2038 -0
  64. package/vendor/jquery/jquery-1.7.1.js +9266 -0
  65. package/vendor/jquery/jquery-1.7.1.min.js +4 -0
  66. package/vendor/mocha/mocha.css +135 -0
  67. package/vendor/mocha/mocha.js +3589 -0
  68. package/vendor/node/util.js +531 -0
  69. package/vendor/requirejs/require.js +2053 -0
  70. package/vendor/requirejs/require.min.js +33 -0
  71. package/doc/default-simple.dot +0 -19
  72. package/doc/default-simple.dot.png +0 -0
  73. package/react.js +0 -40
  74. package/test/ast.test.js +0 -69
  75. package/test/cb-task.test.js +0 -197
  76. package/test/core-deferred.test.js +0 -134
  77. package/test/core-promised.test.js +0 -132
  78. package/test/core-when.test.js +0 -84
  79. package/test/core.test.js +0 -568
  80. package/test/dsl.test.js +0 -330
  81. package/test/event-manager.test.js +0 -102
  82. package/test/exec-options.test.js +0 -33
  83. package/test/finalcb-task.test.js +0 -38
  84. package/test/input-parser.test.js +0 -66
  85. package/test/module-use.test.js +0 -134
  86. package/test/promise-auto-resolve.test.js +0 -52
  87. package/test/ret-task.test.js +0 -199
  88. package/test/task.test.js +0 -21
  89. package/test/validate-cb-task.test.js +0 -74
  90. package/test/validate-ret-task.test.js +0 -83
  91. package/test/validate.test.js +0 -295
  92. package/test/vcon.test.js +0 -173
package/lib/core.js CHANGED
@@ -1,127 +1,138 @@
1
1
  'use strict';
2
+ /*global define:true */
2
3
 
3
- var EventEmitter = require('events').EventEmitter;
4
+ if (typeof define !== 'function') {
5
+ var define = require('amdefine')(module);
6
+ }
4
7
 
5
- var error = require('./error.js');
6
- var validate = require('./validate.js');
7
- var tskutil = require('./task.js');
8
- var STATUS = require('./status.js');
9
- var VContext = require('./vcon.js');
10
- var EventManager = require('./event-manager.js');
11
- var inputParser = require('./input-parser.js');
12
- var idGenerator = require('./id.js');
8
+ define(['./eventemitter', './error', './validate', './task', './status',
9
+ './vcon', './event-manager', './input-parser', './id', './sprintf'],
10
+ function (EventEmitter, error, validate, taskUtil, STATUS,
11
+ VContext, EventManager, inputParser, idGenerator, sprintf) {
13
12
 
14
- var reactOptions = {
15
- stackTraceLimitMin: 30
16
- };
13
+ var reactOptions = {
14
+ stackTraceLimitMin: 30
15
+ };
17
16
 
18
- var reactEmitter = EventManager.global; // the top emitter
17
+ var reactEmitter = EventManager.global; // the top emitter
19
18
 
20
- /**
21
- merge global react options with parsed options
19
+ /**
20
+ merge global react options with parsed options
22
21
  */
23
- function mergeOptions(parsedOptions) {
24
- return Object.keys(reactOptions).reduce(function (accum, k) {
25
- if (!accum[k]) accum[k] = reactOptions[k];
26
- return accum;
27
- }, parsedOptions);
28
- }
22
+ function mergeOptions(parsedOptions) {
23
+ return Object.keys(reactOptions).reduce(function (accum, k) {
24
+ if (!accum[k]) accum[k] = reactOptions[k];
25
+ return accum;
26
+ }, parsedOptions);
27
+ }
28
+
29
+ /**
30
+ generate a flow name when one is not provided
31
+ */
32
+ function generateFlowName() {
33
+ return sprintf('flow_%s', idGenerator.createUniqueId());
34
+ }
29
35
 
30
- /**
31
- Creates react function which the AST can be manipulated and then
32
- is ready to be executed. Can be used directly or a DSL can wrap this
33
- to provide the AST.
36
+ /**
37
+ Creates react function which the AST can be manipulated and then
38
+ is ready to be executed. Can be used directly or a DSL can wrap this
39
+ to provide the AST.
34
40
 
35
- @example
36
- var react = require('react');
37
- var fn = react();
38
- var valid2 = fn.setAndValidateAST({
41
+ @example
42
+ var react = require('react');
43
+ var fn = react();
44
+ var valid2 = fn.setAndValidateAST({
39
45
  name: 'optionalName',
40
46
  inParams: ['a', 'b'],
41
47
  tasks: [
42
- { type: 'cb', f: multiply, a: ['a', 'b'], out: ['c'] }
48
+ { type: 'cb', f: multiply, a: ['a', 'b'], out: ['c'] }
43
49
  ],
44
- outTask: { a: ['c'] }
45
- });
46
- console.log(fn.ast); // view
47
- fn(123, 456, cb);
48
- */
49
- function reactFactory() {
50
- if (arguments.length) throw new Error('react() takes no args, check API');
51
-
52
- error.ensureStackTraceLimitSet(reactOptions.stackTraceLimitMin);
53
- var flowEmitter = EventManager.create();
54
- flowEmitter.parent = reactEmitter;
55
-
56
- var ast = {
57
- name: undefined,
58
- inParams: [],
59
- tasks: [],
60
- outTask: {},
61
- locals: {}
62
- };
50
+ outTask: { a: ['c'] }
51
+ });
52
+ console.log(fn.ast); // view
53
+ fn(123, 456, cb);
54
+ */
55
+ function reactFactory() {
56
+ if (arguments.length) throw new Error('react() takes no args, check API');
57
+
58
+ error.ensureStackTraceLimitSet(reactOptions.stackTraceLimitMin);
59
+ var flowEmitter = EventManager.create();
60
+ flowEmitter.parent = reactEmitter;
61
+
62
+ var ast = {
63
+ name: undefined,
64
+ inParams: [],
65
+ tasks: [],
66
+ outTask: {},
67
+ locals: {}
68
+ };
63
69
 
64
- function setAndValidateAST(newAST) { //set AST then validate, ret error[]
65
- Object.keys(newAST).forEach(function (k) { ast[k] = newAST[k]; }); // copy all properties
66
- var errors = validate(ast);
67
- if (!errors.length) tskutil.nameTasks(ast.tasks); //run this so names can be checked in ast
68
- if (Object.freeze) { //lets freeze the AST so plugin writers don't accidentally manip the ast
69
- Object.keys(newAST).forEach(function (k) {
70
- if (typeof(newAST[k]) === 'object') Object.freeze(newAST[k]);
71
- });
72
- Object.freeze(newAST);
70
+ function setAndValidateAST(newAST) { //set AST then validate, ret error[]
71
+ Object.keys(newAST).forEach(function (k) { ast[k] = newAST[k]; }); // copy all properties
72
+ var errors = validate(ast);
73
+ if (!errors.length) {
74
+ if (!ast.name) ast.name = generateFlowName();
75
+ taskUtil.nameTasks(ast.tasks); //run this so names can be checked in ast
76
+ }
77
+ if (Object.freeze) { //lets freeze the AST so plugin writers don't accidentally manip the ast
78
+ Object.keys(newAST).forEach(function (k) {
79
+ if (typeof(newAST[k]) === 'object') Object.freeze(newAST[k]);
80
+ });
81
+ Object.freeze(newAST);
82
+ }
83
+ flowEmitter.emit(EventManager.TYPES.AST_DEFINED, ast);
84
+ return errors;
73
85
  }
74
- return errors;
75
- }
76
86
 
77
- function exec(arg1, arg2, argN, cb) { // called to execute the flow
78
- /*jshint validthis: true */
79
- var args = Array.prototype.slice.call(arguments);
80
- var env = {
81
- execId: idGenerator.createUniqueId(),
82
- args: args,
83
- ast: ast,
84
- flowEmitter: flowEmitter
85
- };
86
- env.name = ast.name || env.execId;
87
- flowEmitter.emit(EventManager.TYPES.EXEC_FLOW_START, env); // hook
88
- var parsedInput = inputParser(args, ast);
89
- var vCon = VContext.create(parsedInput.args, ast.inParams, ast.locals, this); // create var ctx with in args & locals
90
-
91
- env.parsedInput = parsedInput;
92
- env.options = mergeOptions(parsedInput.options);
93
- env.vCon = vCon;
94
- env.taskDefs = ast.tasks.slice(); // create copy
95
- env.outTaskDef = Object.create(ast.outTask); // create copy
96
- reactEmitter.emit(EventManager.TYPES.EXEC_TASKS_PRECREATE, env); // hook
97
-
98
- var tasks = env.taskDefs.map(tskutil.create);
99
- var tasksByName = tskutil.nameTasks(tasks); // map names to working tasks
100
- var outTask = tskutil.createOutTask(env.outTaskDef, parsedInput.cb, tasks, vCon, env.options, env);
101
- var handleError = tskutil.createErrorHandler(vCon, outTask);
102
-
103
- function contExec() {
104
- if (!outTask.f) { return; } //stop execution, we already hit an error, f was cleared
105
- if (outTask.isReady()) return outTask.exec(); // all tasks done, exec cb, return
106
- tskutil.findReadyAndExec(vCon, tasks, tasksByName, handleError, contExec, env); //exec tasks that ready to run
87
+ function exec(arg1, arg2, argN, cb) { // called to execute the flow
88
+ /*jshint validthis: true */
89
+ var args = Array.prototype.slice.call(arguments);
90
+ var env = {
91
+ execId: idGenerator.createUniqueId(),
92
+ args: args,
93
+ ast: ast,
94
+ flowEmitter: flowEmitter
95
+ };
96
+ env.name = ast.name || env.execId;
97
+ flowEmitter.emit(EventManager.TYPES.EXEC_FLOW_START, env); // hook
98
+ var parsedInput = inputParser(args, ast);
99
+ var vCon = VContext.create(parsedInput.args, ast.inParams, ast.locals, this); // create var ctx with in args & locals
100
+
101
+ env.parsedInput = parsedInput;
102
+ env.options = mergeOptions(parsedInput.options);
103
+ env.vCon = vCon;
104
+ env.taskDefs = ast.tasks.slice(); // create copy
105
+ env.outTaskDef = Object.create(ast.outTask); // create copy
106
+ reactEmitter.emit(EventManager.TYPES.EXEC_TASKS_PRECREATE, env); // hook
107
+
108
+ var tasks = env.taskDefs.map(taskUtil.create);
109
+ var tasksByName = taskUtil.nameTasks(tasks); // map names to working tasks
110
+ var outTask = taskUtil.createOutTask(env.outTaskDef, parsedInput.cb, tasks, vCon, env.options, env);
111
+ var handleError = taskUtil.createErrorHandler(vCon, outTask);
112
+
113
+ function contExec() {
114
+ if (!outTask.f) { return; } //stop execution, we already hit an error, f was cleared
115
+ if (outTask.isReady()) return outTask.exec(); // all tasks done, exec cb, return
116
+ taskUtil.findReadyAndExec(vCon, tasks, tasksByName, handleError, contExec, env); //exec tasks that ready to run
117
+ }
118
+
119
+ tasks.forEach(function (t) {
120
+ t.id = idGenerator.createUniqueId();
121
+ t.env = env;
122
+ if (t.prepare) t.prepare(handleError, vCon, contExec, flowEmitter);
123
+ }); // create callbacks
124
+ contExec(); // start things off
125
+ return outTask.retValue; // could return promise
107
126
  }
108
127
 
109
- tasks.forEach(function (t) {
110
- t.id = idGenerator.createUniqueId();
111
- t.env = env;
112
- if (t.prepare) t.prepare(handleError, vCon, contExec, flowEmitter);
113
- }); // create callbacks
114
- contExec(); // start things off
115
- return outTask.retValue; // could return promise
128
+ var reactFn = exec; // make the exec() the function returned
129
+ reactFn.ast = ast; // put AST hanging off the fn so it can be inspected
130
+ reactFn.setAndValidateAST = setAndValidateAST; // call to set AST and then validate
131
+ reactFn.events = flowEmitter; // used to listen to execution events for this flow
132
+ return reactFn;
116
133
  }
117
134
 
118
- var reactFn = exec; // make the exec() the function returned
119
- reactFn.ast = ast; // put AST hanging off the fn so it can be inspected
120
- reactFn.setAndValidateAST = setAndValidateAST; // call to set AST and then validate
121
- reactFn.events = flowEmitter; // used to listen to execution events for this flow
122
- return reactFn;
123
- }
124
-
125
- module.exports = reactFactory; // module returns reactFactory to create a react fn
126
- module.exports.options = reactOptions; // global react options
127
- module.exports.events = reactEmitter; // global react emitter
135
+ reactFactory.options = reactOptions; // global react options
136
+ reactFactory.events = reactEmitter; // global react emitter
137
+ return reactFactory; // module returns reactFactory to create a react fn
138
+ });
package/lib/dsl.js CHANGED
@@ -1,133 +1,138 @@
1
1
  'use strict';
2
- /*jshint regexp: false */
2
+ /*global define:true */
3
3
 
4
- var sprintf = require('sprintf').sprintf;
5
- var core = require('./core.js');
6
- var parse = require('./parse.js');
7
- var tutil = require('./task.js');
4
+ if (typeof define !== 'function') {
5
+ var define = require('amdefine')(module);
6
+ }
8
7
 
9
- var MISSING_NAME = 'first flow parameter should be the flow name, but found in/out def: %s';
10
- var INOUT_PARAMS_NO_MATCH = 'params in wrong format, wanted "foo, bar, cb -> err, baz" - found: %s';
11
- var MISSING_ERR = 'callback specified, but first out param was not "err", use for clarity. Found in/out def: %s';
12
- var MISSING_CB = 'found err param, but cb/callback is not specified, is this cb-style async or sync function? Found in/out def: %s';
13
- var EXTRA_TASKARG = 'extra unmatched task arg: %s';
8
+ define(['./sprintf', './core', './parse', './task'],
9
+ function (sprintf, core, parse, taskUtil) {
10
+ /*jshint regexp: false */
14
11
 
15
- var INOUT_RE = /\->/; // used to detect missing name, in/out as first arg
16
- var CB_NAMES_RE = /^cb|callback$/i; //cb, Cb, CB, callback, Callback
17
- var ERR_NAMES_RE = /^err$/i; // err, ERR, Err, ...
12
+ var MISSING_NAME = 'first flow parameter should be the flow name, but found in/out def: %s';
13
+ var INOUT_PARAMS_NO_MATCH = 'params in wrong format, wanted "foo, bar, cb -> err, baz" - found: %s';
14
+ var MISSING_ERR = 'callback specified, but first out param was not "err", use for clarity. Found in/out def: %s';
15
+ var MISSING_CB = 'found err param, but cb/callback is not specified, is this cb-style async or sync function? Found in/out def: %s';
16
+ var EXTRA_TASKARG = 'extra unmatched task arg: %s';
18
17
 
19
- function filterOutTrailingCbParam(args) { // if has trailing cb | callback param, filter it out
20
- if (args.length && args[args.length - 1].match(CB_NAMES_RE)) args.pop();
21
- return args;
22
- }
18
+ var INOUT_RE = /\->/; // used to detect missing name, in/out as first arg
19
+ var CB_NAMES_RE = /^cb|callback$/i; //cb, Cb, CB, callback, Callback
20
+ var ERR_NAMES_RE = /^err$/i; // err, ERR, Err, ...
23
21
 
24
- function filterOutLeadingErrParam(args) { // if leading err param, filter it out
25
- if (args.length && args[0].match(ERR_NAMES_RE)) args.shift();
26
- return args;
27
- }
22
+ function filterOutTrailingCbParam(args) { // if has trailing cb | callback param, filter it out
23
+ if (args.length && args[args.length - 1].match(CB_NAMES_RE)) args.pop();
24
+ return args;
25
+ }
28
26
 
29
- var inOutDefParse = {
30
- splitStr: '->',
31
- fn: function (m, origStr) {
32
- var inParams = parse.splitTrimFilterArgs(m[0]);
33
- var lastParam = inParams[inParams.length - 1];
34
- var type = (lastParam && CB_NAMES_RE.test(lastParam)) ? 'cb' : 'ret';
35
- var outParams = parse.splitTrimFilterArgs(m[1]);
36
- var firstOutParam = outParams[0];
37
- if (type === 'cb' && (!firstOutParam || !ERR_NAMES_RE.test(firstOutParam))) {
38
- throw new Error(sprintf(MISSING_ERR, origStr)); // found cb, but no err param
39
- } else if (type === 'ret' && firstOutParam && ERR_NAMES_RE.test(firstOutParam)) {
40
- throw new Error(sprintf(MISSING_CB, origStr)); // found err but not cb param
41
- }
42
- return {
43
- type: type,
44
- inDef: filterOutTrailingCbParam(inParams),
45
- outDef: filterOutLeadingErrParam(outParams)
46
- };
27
+ function filterOutLeadingErrParam(args) { // if leading err param, filter it out
28
+ if (args.length && args[0].match(ERR_NAMES_RE)) args.shift();
29
+ return args;
47
30
  }
48
- };
49
31
 
50
- function parseInOutParams(str) {
51
- var objDef = parse.parseStr(str, [inOutDefParse], INOUT_PARAMS_NO_MATCH);
52
- objDef.inDef = filterOutTrailingCbParam(objDef.inDef);
53
- return objDef;
54
- }
32
+ var inOutDefParse = {
33
+ splitStr: '->',
34
+ fn: function (m, origStr) {
35
+ var inParams = parse.splitTrimFilterArgs(m[0]);
36
+ var lastParam = inParams[inParams.length - 1];
37
+ var type = (lastParam && CB_NAMES_RE.test(lastParam)) ? 'cb' : 'ret';
38
+ var outParams = parse.splitTrimFilterArgs(m[1]);
39
+ var firstOutParam = outParams[0];
40
+ if (type === 'cb' && (!firstOutParam || !ERR_NAMES_RE.test(firstOutParam))) {
41
+ throw new Error(sprintf(MISSING_ERR, origStr)); // found cb, but no err param
42
+ } else if (type === 'ret' && firstOutParam && ERR_NAMES_RE.test(firstOutParam)) {
43
+ throw new Error(sprintf(MISSING_CB, origStr)); // found err but not cb param
44
+ }
45
+ return {
46
+ type: type,
47
+ inDef: filterOutTrailingCbParam(inParams),
48
+ outDef: filterOutLeadingErrParam(outParams)
49
+ };
50
+ }
51
+ };
55
52
 
56
- function parseTasks(arr) {
57
- var tasks = [];
58
- var fn, obj, result;
59
- while (arr.length >= 2) {
60
- obj = {};
61
- fn = arr.shift();
62
- result = parseInOutParams(arr.shift());
63
- if (typeof(arr[0]) === 'object') obj = arr.shift(); // has options, use as obj
64
- obj.f = fn;
65
- obj.a = result.inDef;
66
- var type = result.type;
67
- obj.out = result.outDef;
68
- obj.type = type;
69
- tasks.push(obj);
53
+ function parseInOutParams(str) {
54
+ var objDef = parse.parseStr(str, [inOutDefParse], INOUT_PARAMS_NO_MATCH);
55
+ objDef.inDef = filterOutTrailingCbParam(objDef.inDef);
56
+ return objDef;
57
+ }
58
+
59
+ function parseTasks(arr) {
60
+ var tasks = [];
61
+ var fn, obj, result;
62
+ while (arr.length >= 2) {
63
+ obj = {};
64
+ fn = arr.shift();
65
+ result = parseInOutParams(arr.shift());
66
+ if (typeof(arr[0]) === 'object') obj = arr.shift(); // has options, use as obj
67
+ obj.f = fn;
68
+ obj.a = result.inDef;
69
+ var type = result.type;
70
+ obj.out = result.outDef;
71
+ obj.type = type;
72
+ tasks.push(obj);
73
+ }
74
+ if (arr.length) throw new Error(sprintf(EXTRA_TASKARG, arr[0]));
75
+ return tasks;
70
76
  }
71
- if (arr.length) throw new Error(sprintf(EXTRA_TASKARG, arr[0]));
72
- return tasks;
73
- }
74
77
 
75
- /**
76
- Parse the variable arguments into in/out params, options, tasks
78
+ /**
79
+ Parse the variable arguments into in/out params, options, tasks
77
80
  */
78
- function parseVargs(vargs) {
79
- var inOutParamStr = vargs.shift() || '';
80
- // if next arg is object, shift it off as options
81
- var options = (vargs.length && typeof(vargs[0]) === 'object') ? vargs.shift() : { };
82
- var taskDefArr = vargs; // rest are for the tasks
83
- var defObj = {
84
- inOutParamStr: inOutParamStr,
85
- taskDefArr: taskDefArr,
86
- options: options
87
- };
88
- return defObj;
89
- }
81
+ function parseVargs(vargs) {
82
+ var inOutParamStr = vargs.shift() || '';
83
+ // if next arg is object, shift it off as options
84
+ var options = (vargs.length && typeof(vargs[0]) === 'object') ? vargs.shift() : { };
85
+ var taskDefArr = vargs; // rest are for the tasks
86
+ var defObj = {
87
+ inOutParamStr: inOutParamStr,
88
+ taskDefArr: taskDefArr,
89
+ options: options
90
+ };
91
+ return defObj;
92
+ }
90
93
 
91
94
 
92
- function dslDefine(name, arg1, arg2, argN) {
93
- var reactFn = core();
94
- if (name && INOUT_RE.test(name)) throw new Error(sprintf(MISSING_NAME, name));
95
- var defObj = parseVargs(Array.prototype.slice.call(arguments, 1)); // name, already used
96
- var inOutDef = parseInOutParams(defObj.inOutParamStr);
97
- var ast = {
98
- name: name,
99
- inParams: inOutDef.inDef,
100
- tasks: parseTasks(defObj.taskDefArr),
101
- outTask: { a: inOutDef.outDef }
102
- };
103
- if (defObj.options) Object.keys(defObj.options).forEach(function (k) { ast[k] = defObj.options[k]; });
104
- var errors = reactFn.setAndValidateAST(ast);
105
- if (errors.length) {
106
- var errorStr = errors.join('\n');
107
- throw new Error(errorStr);
108
- }
109
- return reactFn;
110
- }
95
+ function dslDefine(name, arg1, arg2, argN) {
96
+ var reactFn = core();
97
+ if (name && INOUT_RE.test(name)) throw new Error(sprintf(MISSING_NAME, name));
98
+ var defObj = parseVargs(Array.prototype.slice.call(arguments, 1)); // name, already used
99
+ var inOutDef = parseInOutParams(defObj.inOutParamStr);
100
+ var ast = {
101
+ name: name,
102
+ inParams: inOutDef.inDef,
103
+ tasks: parseTasks(defObj.taskDefArr),
104
+ outTask: { a: inOutDef.outDef }
105
+ };
106
+ if (defObj.options) Object.keys(defObj.options).forEach(function (k) { ast[k] = defObj.options[k]; });
107
+ var errors = reactFn.setAndValidateAST(ast);
108
+ if (errors.length) {
109
+ var errorStr = errors.join('\n');
110
+ throw new Error(errorStr);
111
+ }
112
+ return reactFn;
113
+ }
111
114
 
112
- function selectFirst(name, arg1, arg2, argN) {
113
- var reactFn = core();
114
- var defObj = parseVargs(Array.prototype.slice.call(arguments, 1)); // name, already used
115
- var inOutDef = parseInOutParams(defObj.inOutParamStr);
116
- var tasks = tutil.serializeTasks(parseTasks(defObj.taskDefArr));
117
- var ast = {
118
- name: name,
119
- inParams: inOutDef.inDef,
120
- tasks: tasks,
121
- outTask: { type: 'finalcbFirst', a: inOutDef.outDef },
122
- };
123
- if (defObj.options) Object.keys(defObj.options).forEach(function (k) { ast[k] = defObj.options[k]; });
124
- var errors = reactFn.setAndValidateAST(ast);
125
- if (errors.length) {
126
- var errorStr = errors.join('\n');
127
- throw new Error(errorStr);
115
+ function selectFirst(name, arg1, arg2, argN) {
116
+ var reactFn = core();
117
+ var defObj = parseVargs(Array.prototype.slice.call(arguments, 1)); // name, already used
118
+ var inOutDef = parseInOutParams(defObj.inOutParamStr);
119
+ var tasks = taskUtil.serializeTasks(parseTasks(defObj.taskDefArr));
120
+ var ast = {
121
+ name: name,
122
+ inParams: inOutDef.inDef,
123
+ tasks: tasks,
124
+ outTask: { type: 'finalcbFirst', a: inOutDef.outDef },
125
+ };
126
+ if (defObj.options) Object.keys(defObj.options).forEach(function (k) { ast[k] = defObj.options[k]; });
127
+ var errors = reactFn.setAndValidateAST(ast);
128
+ if (errors.length) {
129
+ var errorStr = errors.join('\n');
130
+ throw new Error(errorStr);
131
+ }
132
+ return reactFn;
128
133
  }
129
- return reactFn;
130
- }
131
134
 
132
- module.exports = dslDefine;
133
- module.exports.selectFirst = selectFirst;
135
+ dslDefine.selectFirst = selectFirst;
136
+ return dslDefine;
137
+
138
+ });