react 0.5.1 → 0.6.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.
- package/.travis.yml +5 -0
- package/Jakefile.js +39 -0
- package/README.md +17 -24
- package/browser-test/dist.html +89 -0
- package/browser-test/index.html +85 -0
- package/browser-test/min.html +89 -0
- package/dist/react.js +3094 -0
- package/dist/react.min.js +22 -0
- package/doc/advanced.md +2 -2
- package/doc/simple.dot +25 -0
- package/doc/simple.png +0 -0
- package/examples/using-events1.js +1 -1
- package/lib/base-task.js +116 -110
- package/lib/cb-task.js +71 -67
- package/lib/core.js +116 -117
- package/lib/dsl.js +120 -115
- package/lib/error.js +44 -36
- package/lib/event-collector.js +69 -56
- package/lib/event-manager.js +69 -56
- package/lib/eventemitter.js +20 -0
- package/lib/finalcb-first-task.js +56 -53
- package/lib/finalcb-task.js +55 -51
- package/lib/id.js +18 -7
- package/lib/input-parser.js +49 -41
- package/lib/log-events.js +79 -73
- package/lib/parse.js +34 -25
- package/lib/promise-resolve.js +42 -27
- package/lib/promise-task.js +78 -74
- package/lib/react.js +59 -0
- package/lib/ret-task.js +59 -55
- package/lib/sprintf.js +18 -0
- package/lib/status.js +11 -2
- package/lib/task.js +215 -217
- package/lib/track-tasks.js +72 -58
- package/lib/validate.js +136 -136
- package/lib/vcon.js +78 -69
- package/lib/when-task.js +69 -65
- package/package.json +10 -9
- package/src/dist.build.requirejs +20 -0
- package/test/ast.mocha.js +136 -0
- package/test/cb-task.mocha.js +220 -0
- package/test/core-deferred.mocha.js +143 -0
- package/test/core-when.mocha.js +96 -0
- package/test/core.mocha.js +589 -0
- package/test/dsl.mocha.js +350 -0
- package/test/event-manager.mocha.js +119 -0
- package/test/exec-options.mocha.js +48 -0
- package/test/finalcb-task.mocha.js +58 -0
- package/test/input-parser.mocha.js +86 -0
- package/test/mocha.opts +2 -0
- package/test/module-use.mocha.js +147 -0
- package/test/promise-auto-resolve.mocha.js +68 -0
- package/test/ret-task.mocha.js +220 -0
- package/test/task.mocha.js +42 -0
- package/test/validate-cb-task.mocha.js +100 -0
- package/test/validate-ret-task.mocha.js +110 -0
- package/test/validate.mocha.js +324 -0
- package/test/vcon.mocha.js +193 -0
- package/vendor/chai/chai.js +2038 -0
- package/vendor/jquery/jquery-1.7.1.js +9266 -0
- package/vendor/jquery/jquery-1.7.1.min.js +4 -0
- package/vendor/mocha/mocha.css +135 -0
- package/vendor/mocha/mocha.js +3589 -0
- package/vendor/node/util.js +531 -0
- package/vendor/requirejs/require.js +2053 -0
- package/vendor/requirejs/require.min.js +33 -0
- package/doc/default-simple.dot +0 -19
- package/doc/default-simple.dot.png +0 -0
- package/react.js +0 -40
- package/test/ast.test.js +0 -95
- package/test/cb-task.test.js +0 -197
- package/test/core-deferred.test.js +0 -134
- package/test/core-promised.test.js +0 -132
- package/test/core-when.test.js +0 -84
- package/test/core.test.js +0 -593
- package/test/dsl.test.js +0 -330
- package/test/event-manager.test.js +0 -102
- package/test/exec-options.test.js +0 -33
- package/test/finalcb-task.test.js +0 -38
- package/test/input-parser.test.js +0 -66
- package/test/module-use.test.js +0 -134
- package/test/promise-auto-resolve.test.js +0 -52
- package/test/ret-task.test.js +0 -199
- package/test/task.test.js +0 -21
- package/test/validate-cb-task.test.js +0 -74
- package/test/validate-ret-task.test.js +0 -83
- package/test/validate.test.js +0 -295
- package/test/vcon.test.js +0 -173
package/lib/core.js
CHANGED
|
@@ -1,139 +1,138 @@
|
|
|
1
1
|
'use strict';
|
|
2
|
+
/*global define:true */
|
|
2
3
|
|
|
3
|
-
|
|
4
|
+
if (typeof define !== 'function') {
|
|
5
|
+
var define = require('amdefine')(module);
|
|
6
|
+
}
|
|
4
7
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
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');
|
|
13
|
-
var sprintf = require('sprintf').sprintf;
|
|
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) {
|
|
14
12
|
|
|
15
|
-
var reactOptions = {
|
|
16
|
-
|
|
17
|
-
};
|
|
13
|
+
var reactOptions = {
|
|
14
|
+
stackTraceLimitMin: 30
|
|
15
|
+
};
|
|
18
16
|
|
|
19
|
-
var reactEmitter = EventManager.global; // the top emitter
|
|
17
|
+
var reactEmitter = EventManager.global; // the top emitter
|
|
20
18
|
|
|
21
|
-
/**
|
|
22
|
-
|
|
19
|
+
/**
|
|
20
|
+
merge global react options with parsed options
|
|
23
21
|
*/
|
|
24
|
-
function mergeOptions(parsedOptions) {
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
}
|
|
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
|
+
}
|
|
30
28
|
|
|
31
|
-
/**
|
|
32
|
-
|
|
29
|
+
/**
|
|
30
|
+
generate a flow name when one is not provided
|
|
33
31
|
*/
|
|
34
|
-
function generateFlowName() {
|
|
35
|
-
|
|
36
|
-
}
|
|
32
|
+
function generateFlowName() {
|
|
33
|
+
return sprintf('flow_%s', idGenerator.createUniqueId());
|
|
34
|
+
}
|
|
37
35
|
|
|
38
|
-
/**
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
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.
|
|
42
40
|
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
41
|
+
@example
|
|
42
|
+
var react = require('react');
|
|
43
|
+
var fn = react();
|
|
44
|
+
var valid2 = fn.setAndValidateAST({
|
|
47
45
|
name: 'optionalName',
|
|
48
46
|
inParams: ['a', 'b'],
|
|
49
47
|
tasks: [
|
|
50
|
-
|
|
48
|
+
{ type: 'cb', f: multiply, a: ['a', 'b'], out: ['c'] }
|
|
51
49
|
],
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
function reactFactory() {
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
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
|
+
};
|
|
71
69
|
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
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;
|
|
78
85
|
}
|
|
79
|
-
if (Object.freeze) { //lets freeze the AST so plugin writers don't accidentally manip the ast
|
|
80
|
-
Object.keys(newAST).forEach(function (k) {
|
|
81
|
-
if (typeof(newAST[k]) === 'object') Object.freeze(newAST[k]);
|
|
82
|
-
});
|
|
83
|
-
Object.freeze(newAST);
|
|
84
|
-
}
|
|
85
|
-
flowEmitter.emit(EventManager.TYPES.AST_DEFINED, ast);
|
|
86
|
-
return errors;
|
|
87
|
-
}
|
|
88
86
|
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
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
|
|
119
126
|
}
|
|
120
127
|
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
contExec(); // start things off
|
|
127
|
-
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;
|
|
128
133
|
}
|
|
129
134
|
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
return reactFn;
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
module.exports = reactFactory; // module returns reactFactory to create a react fn
|
|
138
|
-
module.exports.options = reactOptions; // global react options
|
|
139
|
-
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
|
-
/*
|
|
2
|
+
/*global define:true */
|
|
3
3
|
|
|
4
|
-
|
|
5
|
-
var
|
|
6
|
-
|
|
7
|
-
var tutil = require('./task.js');
|
|
4
|
+
if (typeof define !== 'function') {
|
|
5
|
+
var define = require('amdefine')(module);
|
|
6
|
+
}
|
|
8
7
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
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
|
|
16
|
-
var
|
|
17
|
-
var
|
|
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
|
-
|
|
20
|
-
|
|
21
|
-
|
|
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
|
|
25
|
-
|
|
26
|
-
|
|
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
|
-
|
|
30
|
-
|
|
31
|
-
|
|
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
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
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
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
obj
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
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
|
-
|
|
78
|
+
/**
|
|
79
|
+
Parse the variable arguments into in/out params, options, tasks
|
|
77
80
|
*/
|
|
78
|
-
function parseVargs(vargs) {
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
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
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
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
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
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
|
-
|
|
133
|
-
|
|
135
|
+
dslDefine.selectFirst = selectFirst;
|
|
136
|
+
return dslDefine;
|
|
137
|
+
|
|
138
|
+
});
|